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.