Cerca nel blog

giovedì 11 agosto 2022

Debug F110 (pagamento automatico)

 

Debug F110 (pagamento automatico)

Non è possibile eseguire il debug di F110 con la stessa facilità di altri programmi SAP. Il motivo è che F110 crea un job in background, in cui vengono elaborati gli elementi di pagamento. 

Programma F110MAIN

Innanzitutto, per poter attivare il debug per F110, è necessario modificare una variabile nel programma di pagamento. Esegui SE38 e vai al programma F110MAIN e cerca XDEBUG.

Creare un Break Point per fermarsi su questa riga di programma.


Il prossimo passo, devi schedulare il tuo job di pagamento in futuro. Ciò è necessario per poter eseguire il job in background in modalità di debug.


Una volta schedulato il Job  in background, eseguire SM37, selezionare il lavoro F110 creato ed eseguire il comando JDBG nel campo dei comandi. La stessa funzione può essere selezionata nel menu Extra / Debug Job.

Il Job partirà immediatamente. Continua con F8 e il debugger si fermerà al punto di interruzione creato in precedenza.  Ora devi cambiare la variabile XDEBUG in "X". Ora puoi eseguire il programma sul tuo codice di interesse, di cui desideri eseguire il debug.



martedì 2 agosto 2022

Attivazione della registrazione modifiche dati per le tabelle VBEP e VBLB

 

Attivazione della registrazione modifiche dati per le tabelle VBEP e VBLB

In alcune transazioni come la VA31 o la VA32, o mediante Idoc, per le tabelle VBEP e VBLB, le modifiche di tali tabelle non sono presenti nelle tabelle CHDR e CDPOS. Mentre per la transazione VA02 tali modifiche vengono riportate nelle tabelle CHDR e CDPOS perchè è attivato il seguente customing.per il Sap Change Document Object VERKBELEG

Transazione SCDO, inserire l'oggetto VERKBELEG premere visualizza, e come si può vedere le 2 tabelle sono state già abilitate al LOG


Per attivare queste registrazioni, ho usato il FM VERKBELEG_WRITE_DOCUMENT ho effettuato le seguenti modifiche:

1. Nella User exit MV45AFZZ (userexit_save_document_prepare), ho inserito il seguente codice:

  DATAlv_uname TYPE uname,

        lv_tcode TYPE tcode.

* Questo metodo mi consente di ricavare l'utenza e la transazione richiamata

      CALL METHOD cl_change_document_util=>get_external_call_data
        IMPORTING
          ev_uname lv_uname
          ev_tcode lv_tcode.

*  Questo FM custom che ho creato mi gestisce la registrazione dei log, e gli passo tra gli altri i seguenti parametri XVBEP, contiene i valori nuovi modificati per la tabella VBEP, YVBEP contiene i valori vecchi della tabella VBEP, XVBLB, contiene i valori nuovi modificati per la tabella VBLB, YVBLB contiene i valori vecchi della tabella VBLB
      CALL FUNCTION 'ZSD_LOG_RECORDING'
        EXPORTING
          i_uname lv_uname
          i_tcode lv_tcode
          i_vbak  vbak
          i_xvbep xvbep[]
          i_yvbep yvbep[]
          i_xvblb xvblb[]
          i_yvblb yvblb[].

2. Creato il seguente FM ZSD_LOG_RECORDING:

FUNCTION zsd_log_recording.
*"----------------------------------------------------------------------
*"*"Interfaccia locale:
*"  IMPORTING
*"     VALUE(I_UNAME) TYPE  UNAME
*"     VALUE(I_TCODE) TYPE  TCODE
*"     VALUE(I_VBAK) TYPE  VBAK
*"     VALUE(I_XVBEP) TYPE  ZTT_XVBEP OPTIONAL
*"     VALUE(I_YVBEP) TYPE  ZTT_XVBEP OPTIONAL
*"     VALUE(I_XVBLB) TYPE  ZTT_XVBLB OPTIONAL
*"     VALUE(I_YVBLB) TYPE  ZTT_XVBLB OPTIONAL
*"  EXCEPTIONS
*"      NUM_SCHED_NO_CHANGE
*"----------------------------------------------------------------------

  DATAlv_labnk_old TYPE labnk,
        lv_labnk_new TYPE labnk,
        lv_ebalora   TYPE boolean.

  CLEARlwa_n_vbaklwa_o_yvbakcdtxtlv_labnk_oldlv_labnk_new.

  lv_ebalora abap_true.

  FREElt_xvbep[]lt_yvbep[]lt_xvblb[]lt_yvblb[].
  lv_objectid i_vbak-vbeln.

  MOVE-CORRESPONDING i_vbak TO lwa_n_vbak.
  MOVE-CORRESPONDING i_vbak TO lwa_o_yvbak .

  IF sy-calld 'X' AND sy-binpt 'X'.
* Sto elaborando l'IDOC
    LOOP AT i_xvblb ASSIGNING FIELD-SYMBOL(<x_xvblb>)
     WHERE vbeln i_vbak-vbeln
       AND updkz  'U'.

      APPEND <x_xvblb> TO lt_xvblb[].
    ENDLOOP.
    lt_yvblb[] i_yvblb[].


    LOOP AT i_yvblb ASSIGNING FIELD-SYMBOL(<lfs_vblb>)
      WHERE updkz 'I'.
      APPEND <lfs_vblb> TO lt_xvblb[].
    ENDLOOP.

    READ TABLE i_yvblb  ASSIGNING FIELD-SYMBOL(<x_yvblb>INDEX 1.
    IF sy-subrc AND <x_yvblb> IS ASSIGNED.
      lv_labnk_old <x_yvblb>-labnk.

      UNASSIGN <x_xvblb>.
      READ TABLE i_xvblb  ASSIGNING <x_xvblb>
        WITH KEY vbeln <x_yvblb>-vbeln
                 posnr <x_yvblb>-posnr
                 abrli <x_yvblb>-abrli
                 abart <x_yvblb>-abart.

      IF sy-subrc AND <x_xvblb> IS ASSIGNED.
        lv_labnk_new <x_xvblb>-labnk.
      ENDIF.
    ENDIF.

    IF lv_labnk_new lv_labnk_old.
      lv_ebalora abap_false.
    ENDIF.

  ELSE.
* Sto elaborando la transazione
    LOOP AT i_yvbep ASSIGNING FIELD-SYMBOL(<y_vbep>.

      READ TABLE i_xvbep ASSIGNING FIELD-SYMBOL(<x_vbep>)
        WITH KEY vbeln <y_vbep>-vbeln
                 posnr <y_vbep>-posnr
                 etenr <y_vbep>-etenr
                 ettyp <y_vbep>-ettyp
                 lfrel <y_vbep>-lfrel.

      IF sy-subrc AND <x_vbep> IS ASSIGNED.
        APPEND <x_vbep> TO lt_xvbep[].
        APPEND <y_vbep> TO lt_yvbep[].
      ENDIF.
    ENDLOOP.

    LOOP AT i_xvbep ASSIGNING FIELD-SYMBOL(<lfs_vbep>)
      WHERE updkz 'I'.
      APPEND <lfs_vbep> TO lt_xvbep[].
    ENDLOOP.

  ENDIF.

  IF   lv_ebalora abap_true.
    CALL FUNCTION 'VERKBELEG_WRITE_DOCUMENT' IN UPDATE TASK
      EXPORTING
        objectid                lv_objectid
        tcode                   i_tcode
        utime                   sy-uzeit
        udate                   sy-datum
        username                i_uname
        object_change_indicator 'U'
        n_vbak                  lwa_n_vbak
        o_yvbak                 lwa_o_yvbak
        upd_vbak                'X'
        upd_vbep                'U'
        upd_vblb                'U'
      TABLES
        icdtxt_verkbeleg        cdtxt
        xvbep                   lt_xvbep[]
        yvbep                   lt_yvbep[]
        xvblb                   lt_xvblb[]
        yvblb                   lt_yvblb[].

  ENDIF.
ENDFUNCTION.