Cerca nel blog

martedì 9 luglio 2019

ABAP: Creazione Cespite (ASSET) Temporaneo


Creazione Cespite (ASSET) Temporaneo

Problematica: Creare un programma custom che selezionando delle RdA, secondo delle logiche, consente di creare dei cespite temporanei, per ogni posizione che abbia la contabilizzazione ad “A” (cespite) , e successivamente creare il relativo OdA.
In pratica, stiamo simulando la creazione dell’OdA (ME21N)  in riferimento a delle RdA.

Nella schermata successiva, al pulsante "Crea Cespite" 


E' associato il seguente codice:

     SET PARAMETER ID 'ANK' FIELD ztrda_cq_ce-anlkl.
     SET PARAMETER ID 'BUK' FIELD ztrda_cq_ce-bukrs.

     DATA: l_anla        TYPE anla,
           l_anlz        TYPE anlz,
           l_nassets_max TYPE ra02s-nassets,
           lt_anltab     TYPE STANDARD TABLE OF raist06 INITIAL SIZE 0.

     CLEAR: l_anla, l_anlz, l_nassets_max.
     FREE: lt_anltab.

     l_anla-bukrs = ztrda_cq_ce-bukrs.
     l_anla-lifnr = gs_ekko_output-lifnr.
     l_anla-meins = ztrda_cq_ce-meins.
     l_anla-txt50 = ztrda_cq_ce-txz01.
     l_anla-anlkl = ztrda_cq_ce-anlkl.
     l_anla-bstdt = sy-datum.
 
     l_anlz-werks = ztrda_cq_ce-werks.

     l_nassets_max = 1.

        CALL FUNCTION 'CREATE_ASSET'
          EXPORTING
            i_anla                     = l_anla
            i_anlz                     = l_anlz
            i_nassets                  = l_nassets_max
            i_nassets_max              = l_nassets_max
            i_dark                     = ' '
            i_nassets_fix              = ' '
            i_called_by_purchase_order = 'X'
          TABLES
            t_assets                   = lt_anltab
          EXCEPTIONS
            missing_company_code       = 1
            missing_asset_class        = 2
            missing_asset_mainnumber   = 3
            internal_error             = 4
            OTHERS                     = 5.

     IF NOT lt_anltab[] IS INITIAL.
       READ TABLE lt_anltab INTO DATA(ls_cespite) INDEX 1.

          DATA: lv2_anln1 TYPE anla-anln1,
                lv2_anln2 TYPE anla-anln2.

          ztrda_cq_ce-anln1 = ls_cespite-temp_anln1.
          ztrda_cq_ce-anln2 = ls_cespite-anln2.

* Questa PERFORM è IMPORTANTISSIMA, dato che setta una variabile globale standard
* (PROC_ANLA)
* Se settata questa variabile, nello standard della creazione dell'oda
* consente di richiamare il flusso logico di trasformazione del cespite
*temporaneo in cespite effettivo           PERFORM knt_anla_verb_merken IN PROGRAM saplmepo USING 'X'.

     ENDIF.  

Nella parte di codice dove viene richiamata la bapi di creazione dell'OdA    CALL FUNCTION 'BAPI_PO_CREATE1' , in caso di errore non richiamare la

CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

Perchè a sua volta richiama la  "FORM initialize_tables." nell'include LAISTF4O dove viene pulita tutta la tabella ARB_GES, che contiene tutti i cespiti temporanei.
Nel caso di utilizzo della ROLLBACK, una volta risolto gli errori della BAPI, senza uscire dal programma, e rilanciando la bapi  di creazione dell'OdA si verifica l'errore AY185 

“Errore di sistema. Immobilizzazione INTERN-0001 non trovata. “
Questo perchè la tabella che contiene i cespiti temporanei è stata cancellata dalla Rollback.

 NOTA: INSERIRE UN BREAK-POINT nel FM CREATE_ASSET_CONFIRM dove è presente il seguente codice. Se la tabella "ARB_GES" è valorizzata, allora la creazione dell'OdA andrà a buon fine.
      LOOP AT arb_ges.
* >>> START of change note 1712247 >>>
*       Ist Anlage in T_ASSETS übergeben worden?
        IF i_ignore_anln2 EQ con_x.
          READ TABLE t_assets WITH KEY temp_anln1 = arb_ges-anln1.
        ELSE.
          READ TABLE t_assets WITH KEY temp_anln1 = arb_ges-anln1
                                            anln2 = arb_ges-anln2.
        ENDIF.
* <<< END of change note 1712247 <<<
*       nichtgefundene merken
        IF sy-subrc <> 0.
           MOVE-CORRESPONDING  arb_ges TO lt_deltab.
           APPEND lt_deltab.
        ENDIF.
     ENDLOOP.


Nessun commento:

Posta un commento