Cerca nel blog

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.




Nessun commento:

Posta un commento