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.

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

     CLEARl_anlal_anlzl_nassets_max.
     FREElt_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_cespiteINDEX 1.

          DATAlv2_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