此博客为原创博客,都是个人工作经历所得,转载请注明出处

SAP保存操作记录CDHDR和CDPOS表

http://blog.sina.com.cn/s/blog_7dce1fac01014yp2.html转自
sap的字段和对象的修改都会保存旧值,数据保存在CDHDR和CDPOS表中,提取旧值可以采用两种方法

 

1) 使用sap的标准函数CHANGEDOCUMENT_READ_HEADERS 和CHANGEDOCUMENT_READ_POSITIONS

CALL FUNCTION 'CHANGEDOCUMENT_READ_POSITIONS' "Change document: Read change document items 
EXPORTING 
*   archive_handle = 0          " sy-tabix      Handle on Open Archive Files 
    changenumber =              " cdpos-changenr  Change document number 
*   tablekey = SPACE            " cdpos-tabkey  Object class table key 
*   tablename = SPACE           " cdpos-tabname  Object class table name 
*   tablekey254 = SPACE         " cdpos_uid-tabkey  Table Key for CDPOS in Character 254 
*   keyguid = SPACE             " cdpos_uid-keyguid  UUID in Character Format 
*   keyguid_str = SPACE         " cdpos_str-keyguid  UUID in Character Format 
IMPORTING 
    header =                    " cdhdr   Change document header (structure CDHDR) 
   et_cdred_str =              " cdred_str_tab  Additional Change Document - Table for STRINGs 
* TABLES 
*   editpos =                  " cdshw     Table 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
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-cprog
i_callback_user_command = 'USER_COMMAND'
i_structure_name = 'CDHDR'
is_layout = gs_layout
TABLES
t_outtab = t_cdhdr.

*---------------------------------------------------------------------*
* FORM USER_COMMAND *
*---------------------------------------------------------------------*
FORM user_command USING u_ucomm TYPE syucomm
us_selfield TYPE slis_selfield. "#EC CALLED

* Macro definition
DEFINE m_sort.
add 1 to ls_sort-spos.
ls_sort-fieldname = &1.
ls_sort-up = 'X'.
append ls_sort to lt_sort.
END-OF-DEFINITION.

DATA :
ls_cdhdr TYPE ty_s_cdhdr,
ls_sort TYPE slis_sortinfo_alv,
lt_sort TYPE slis_t_sortinfo_alv,
* Change document items
lt_cdpos TYPE TABLE OF ty_s_cdpos.

CASE u_ucomm.
WHEN '&IC1'.
PERFORM check_marked USING us_selfield.

* Read Change document items
LOOP AT t_cdhdr INTO ls_cdhdr WHERE checkbox = 'X'.
SELECT * APPENDING TABLE lt_cdpos
FROM cdpos
WHERE objectclas = ls_cdhdr-objectclas
AND objectid = ls_cdhdr-objectid
AND changenr = ls_cdhdr-changenr.
ENDLOOP.

m_sort 'CHANGENR'.

* Display ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_structure_name = 'CDPOS'
is_layout = gs_layout
it_sort = lt_sort
TABLES
t_outtab = lt_cdpos.

ENDCASE.

ENDFORM. " USER_COMMAND
*--------------------------------------------------------------------

FORM check_marked USING us_selfield TYPE slis_selfield.

FIELD-SYMBOLS :
<cdhdr> TYPE ty_s_cdhdr.

READ TABLE t_cdhdr TRANSPORTING NO FIELDS WITH KEY checkbox = 'X'.
IF NOT sy-subrc IS INITIAL AND
NOT us_selfield-tabindex IS INITIAL.
READ TABLE t_cdhdr INDEX us_selfield-tabindex ASSIGNING <cdhdr>.
<cdhdr>-checkbox = 'X'.
ENDIF.

ENDFORM.

posted @ 2015-01-26 14:59  Rainystuday  阅读(1442)  评论(0编辑  收藏  举报