1. 程式人生 > >【轉載】SAP儲存操作記錄CDHDR和CDPOS表,通過修改螢幕欄位,查詢SAP欄位表和欄位

【轉載】SAP儲存操作記錄CDHDR和CDPOS表,通過修改螢幕欄位,查詢SAP欄位表和欄位

sap的欄位和物件的修改都會儲存舊值,資料儲存在CDHDRCDPOS表中,提取舊值可以採用兩種方法

這兩個表,第一個表類似於表頭(HEADER),第二個是具體內容(ITEM)
通過表CDHDR的欄位tcode,可以找到指定事務的所有更改記錄(更改的T-CODE),如事務:MM02,找到的記錄中的OBJECTID就是存放物料ID,然後根據記錄到表到CDPOS就可以查詢到具體哪些欄位的值發生變化,而且還記錄了欄位發生前後的值
TABLENAME  和 FNAME 可以記錄具體的表的具體的欄位的更改的記錄。也通過這種方法修改欄位,可以找表和欄位。
tabname = 'LFBK' fname = 'KOINH'.

1) 使用sap的標準函式CHANGEDOCUMENT_READ_HEADERS 和CHANGEDOCUMENT_READ_POSITIONS

CALL FUNCTION 'CHANGEDOCUMENT_READ_POSITIONS'       "Change document: Read change document items

EXPORTING
*archive_handle = 0" sy-tabixHandle on Open Archive Files
changenumber =" cdpos-changenrChange document number
*tablekey = SPACE" cdpos-tabkeyObject class table key
*tablename = SPACE" cdpos-tabnameObject class table name
*tablekey254 = SPACE" cdpos_uid-tabkeyTable Key for CDPOS in Character 254
*keyguid = SPACE" cdpos_uid-keyguidUUID in Character Format
*keyguid_str = SPACE" cdpos_str-keyguidUUID in Character Format
IMPORTING
header =" cdhdrChange document header (structure CDHDR)
et_cdred_str =" cdred_str_tabAdditional Change Document - Table for STRINGs
* TABLES
*editpos =" cdshwTable with edited change document items
EDITPOS_WITH_HEADER = "CDRED更改文件,顯示結構
EXCEPTIONS
NO_POSITION_FOUND = 1"No item foun
WRONG_ACCESS_TO_ARCHIVE = 2"incorrect access to archive
2)使用select語句直接從表中讀取。
直接使用SELECT語句讀取資料的示例:
*提取信用額度欄位修改的擡頭資訊       select cdhdr~changenr cdhdr~udate cdhdr~utime         into corresponding fields of table p_cdhdr         from cdhdr         where cdhdr~objectclas = 'KLIM' and           cdhdr~objectid = wa_customerinfo-kunnr.       if sy-subrc = 0. 
*提取信用額度欄位修改的欄位值         select cdpos~changenr cdpos~value_old cdpos~value_new           into corresponding fields of table p_cdpos           from cdpos             for all entries in p_cdhdr           where cdpos~objectclas = 'KLIM' and             cdpos~objectid = wa_customerinfo-kunnr and             cdpos~changenr = p_cdhdr-changenr and             cdpos~tabname = 'KNKK' and             cdpos~fname = 'KLIMK'.         if sy-subrc = 0.        endif. endif.

可以在CHANGEDOCUMENT_READ_HEADERS 中設定中斷獲得物件型別。

ex.

提取有變動的 Acc. changes
SELECT SINGLE tabkey value_new  INTO (cdpos-tabkey,ikoinh)
      FROM cdpos
      WHERE objectclas = 'KRED'
       AND objectid = itab-lifnr
       AND changenr = itab-changenr
       AND tabname = 'LFBK'
       AND fname = 'KOINH'.

提取有變動的vendor最新日期

   SELECT MAX( udate ) INTO itab-cndate FROM cdhdr
      WHERE objectclas = 'KRED' AND objectid = itab-lifnr.

--------------------------------------------------------------------------------

抓取所有有變動的程式

report ztest001.
TYPE-POOLS slis.
DATA : cdhdr TYPE cdhdr.
SELECT-OPTIONS :
   s_objcls FOR cdhdr-objectclas OBLIGATORY,
   s_objtid FOR cdhdr-objectid,
   s_chngnr FOR cdhdr-changenr,
   s_usrnam FOR cdhdr-username DEFAULT sy-uname,
   s_udate  FOR cdhdr-udate    DEFAULT sy-datum,
   s_time   FOR cdhdr-utime,
   s_tcode  FOR cdhdr-tcode,
   s_plncnr FOR cdhdr-planchngnr,
   s_chngno FOR cdhdr-act_chngno,
   s_wsplnd FOR cdhdr-was_plannd,
   s_chngid FOR cdhdr-change_ind.

SELECTION-SCREEN SKIP.
PARAMETERS p_max TYPE numc3 OBLIGATORY DEFAULT '200'.

*---------------------------------------------------------------------*
TYPES :
  BEGIN OF ty_s_cdhdr.
        INCLUDE STRUCTURE cdhdr.
TYPES : checkbox,
  END OF ty_s_cdhdr,

  BEGIN OF ty_s_cdpos.
        INCLUDE STRUCTURE cdpos.
TYPES : checkbox,
  END OF ty_s_cdpos.

*---------------------------------------------------------------------*
DATA :
* Layout for ALV
   gs_layout TYPE slis_layout_alv,
* Change document header
   t_cdhdr TYPE TABLE OF ty_s_cdhdr.

*---------------------------------------------------------------------*
START-OF-SELECTION.

* Read Change document header
  SELECT * INTO TABLE t_cdhdr
             UP TO p_max ROWS
           FROM cdhdr
          WHERE objectclas IN s_objcls
            and objectid   in s_objtid
            and changenr   in s_chngnr
            AND username   IN s_usrnam
            AND udate      IN s_udate
            AND utime      IN s_time
            AND tcode      IN s_tcode
            AND planchngnr IN s_plncnr
            AND act_chngno IN s_chngno
            AND was_plannd IN s_wsplnd
            AND change_ind IN s_chngid.

   gs_layout-zebra = 'X'.
   gs_layout-colwidth_optimize = 'X'.
   gs_layout-box_fieldname = 'CHECKBOX'.

* Display ALV