首页 > SAP > ABAP > 【经典系列】创建CHANGE LOG的经典手册
2019
08-29

【经典系列】创建CHANGE LOG的经典手册

做SAP 表,字段级的变更记录到,CDHDR和CDPOS的方法

 
l  表字段啟用日誌記錄功能
 
若做字段級的日誌記錄,需要在數據元素中勾選change document標記:
 
 
勾選此標記后,系統才能記錄此字段的更改前後值;否則只能按主鍵記錄整條記錄的增刪改記錄;
 
l  SCDO註冊物件
 
此處為控制生成的日誌記錄function的參數;表格名稱即為需要記錄日誌的table,生成記錄日誌的function module可有兩種格式,三個勾選的checkboxtable參數的FM,推薦使用這種格式的生成;
 
菜單:公用程式——>產生更新程式,即可產生function module
 
 
選項為生成的include程序和功能組,自定義名稱,其他選項默認即可;
點擊產生,預覽將要生成的對象列表:
 
點擊激活按鈕,列表中的對象將被建立;
 
l  程序調用
 
生成了4include程序,後綴分別為T,F,V,C,其中Ttop include,即定義用,F\VincludeT裡的;C是包含了調用function moduleinclude;在需要記錄日誌的自開發程序中,只要include這兩個(T\C)程序即可;
 
若採取表參數的方式生成function module,將包含兩個參數表X表與Y表;此兩表的結構與需記錄日誌表的結構一致,自動生成,多一個字段KZ,值可傳入U/I/D,對應updateinsertdelete;這裡統一填U即可;
 
Y表為old tableX表為new table;在調用的時候,系統會自動按主鍵比較這兩個表,在老表中存在、新表中不存在的數據將被記錄為刪除D/E;老表中不存在、新表中存在的數據將被記錄為新插入I/J;兩表中均存在的數據將會按字段比較,只記錄值變化的字段,記錄為U
 
在調用程序里,需要在程序初始化取數的時候取一版數據,放入內表old;經過整個程序的處理后,最後的結果表new,在存入DB前,將兩內表按主鍵進行對比,一組主鍵生成一個對象ID,此主鍵下的新舊記錄分別存於X表與Y表,調用FM,系統即可記錄日誌;
 
日誌表為CDHDRCDPOS
 
l  對象ID定義
 
記錄日誌需要指定對象ID;對象ID需要開發顧問自定義格式;如會計憑證的對象IDBUKRS+GJAHR+BELNR連接成的字符串;
 
l  日誌讀取報表
 
系統標準讀取此日誌的程序為CHANGEDOCU_READ,可根據對象類別、對象值、操作時間和操作人進行查詢;建議指定需要查詢的對象類別和對象值,單純按照時間查找沒什麼意義;
 
由於對象類別和對象值均是開發人員人為定義的,所以這裡讓用戶直接查詢可能不知道查詢的對象格式;需要外包一個程序,按照具體業務的選擇條件查詢出來相應的數據,然後得出對象ID后,以SUBMIT的形式調用CHANGEDOCU_READ,展示報表;
 
参考技巧: 注意下图标注的结构. 在实际函数调用的时候可以copy到自己程序,这样可以省去很多的结构定义.
参数完全参考的话,定义结构部分就能省不少代码:
objectid = ‘/NSL/TR062’.

 

  tcode    = ‘/NSL/TR062_MANUAL’.

  utime    = syuzeit.

  udate    = sydatum.

  username = syuname.

  APPEND LINES OF gt_capm[] TO XNSL_TR062_CAP[].

  APPEND LINES OF gt_cdsm[] TO XNSL_TR062_CDS[].

  APPEND LINES OF gt_INDXM[] TO XNSL_TR062_INDXM[].

  APPEND LINES OF gt_RATEM[] TO XNSL_TR062_RATEM[].

  APPEND LINES OF lt_capm[] TO YNSL_TR062_CAP[].

  APPEND LINES OF lt_cdsm[] TO YNSL_TR062_CDS[].

  APPEND LINES OF lt_INDXM[] TO YNSL_TR062_INDXM[].

  APPEND LINES OF lt_RATEM[] TO YNSL_TR062_RATEM[].

*  APPEND LINES OF gt_tr78_item TO xnsl_tr078_item.

  if gt_capm[] is not INITIAL.

     upd_nsl_tr062_cap = ‘U’.

  endif.

  if gt_cdsm[] is not INITIAL.

    upd_nsl_tr062_cds = ‘U’.

  endif.

  if gt_indxm[] is not INITIAL.

    upd_nsl_tr062_indxm = ‘U’.

  endif.

  if gt_ratem[] is not INITIAL.

    upd_nsl_tr062_ratem = ‘U’.

  endif.

 

  CALL FUNCTION ‘/NSL/TR062_WRITE_DOCUMENT’

    EXPORTING

      objectid                = objectid

      tcode                   = tcode

      utime                   = syuzeit

      udate                   = sydatum

      username                = syuname

      planned_change_number   = planned_change_number

      object_change_indicator = cdoc_upd_object

      planned_or_real_changes = cdoc_planned_or_real

      no_change_pointers      = cdoc_no_change_pointers

      upd_icdtxt_tr062        = upd_icdtxt_tr062

      upd_nsl_tr062_cap       = upd_nsl_tr062_cap

      upd_nsl_tr062_cds       = upd_nsl_tr062_cds

      upd_nsl_tr062_indxm     = upd_nsl_tr062_indxm

      upd_nsl_tr062_ratem     = upd_nsl_tr062_ratem

    TABLES

      icdtxt_tr062            = ICDTXT_TR062

      xnsl_tr062_cap          = XNSL_TR062_CAP

      ynsl_tr062_cap          = YNSL_TR062_CAP

      xnsl_tr062_cds          = XNSL_TR062_CDS

      ynsl_tr062_cds          = yNSL_TR062_CDS

      xnsl_tr062_indxm        = XNSL_TR062_INDXM

      ynsl_tr062_indxm        = YNSL_TR062_INDXM

      xnsl_tr062_ratem        = XNSL_TR062_RATEM

      ynsl_tr062_ratem        = YNSL_TR062_RATEM.

 
 
最后编辑:
作者:yangsen
本站为个人博客网站,全由我个人维护,我从事SAP开发13年,其它ERP开发7年,基本都是零售行业。本站记录工作学习的过程, 有SAP相关询问专、兼职工作可随时联系我。 有网站相关的问题可直接在文章下方留言,或者联系我。 邮件:yan252@163.com给我。 QQ:415402519

留下一个回复

你的email不会被公开。