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:

  DATA: lv_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
*"----------------------------------------------------------------------

  DATA: lv_labnk_old TYPE labnk,
        lv_labnk_new TYPE labnk,
        lv_ebalora   TYPE boolean.

  CLEAR: lwa_n_vbak, lwa_o_yvbak, cdtxt, lv_labnk_old, lv_labnk_new.

  lv_ebalora = abap_true.

  FREE: lt_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 = 0 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 = 0 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 = 0 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.