场景:一些报表需要对价格的变化差异进行存档
1.se11,创建自建表,然后在需要对比数据的字段的数据元素的详细特性的页签下,选中更改文档打上勾;
2.打开scdo ,创建,step by step create,然后 激活,会生成一个函数,可以测试
3.在程序中如何用呢?好吧,自己写个函数
FUNCTION ZRFC_GETRECORD.
*"----------------------------------------------------------------------
*"*"局部接口:
*" IMPORTING
*" VALUE(OBJECTCLAS) LIKE CDHDR-OBJECTCLAS DEFAULT 'ZNEWCH'
*" VALUE(TAB_NAME) LIKE DNTAB-TABNAME
*" VALUE(REPID) TYPE SY-REPID DEFAULT SY-REPID
*" VALUE(O_TAB) TYPE ZOTAB
*" VALUE(V_TAB) TYPE ZVTAB
*" VALUE(I_FLAG) TYPE CDHDR-CHANGE_IND
*" VALUE(T_CODE) TYPE SY-TCODE DEFAULT SY-TCODE
*"----------------------------------------------------------------------
DATA: NAMETAB TYPE STRING,
NAMETAB1 TYPE STRING.
DATA: NAME_TAB LIKE TABLE OF DNTAB WITH HEADER LINE.
DATA: i_str TYPE string.
DATA l_refTAB TYPE REF TO data.
DATA l_ref TYPE REF TO data.
FIELD-SYMBOLS: <o_tab> TYPE STANDARD TABLE,
<v_tab> TYPE STANDARD TABLE.
FIELD-SYMBOLS: <fs>,
<fs1>,
<fs2>,
<fs3>
.
FIELD-SYMBOLS: <l_stab> TYPE STANDARD TABLE.
FIELD-SYMBOLS: <l_stab1> TYPE STANDARD TABLE.
FIELD-SYMBOLS: <l_struc> TYPE ANY.
FIELD-SYMBOLS:<WA>.
DATA retab TYPE string.
"获取旧表新表
CONCATENATE '(' REPID ')' O_TAB '[' ']' into retab.
CONDENSE retab.
ASSIGN (retab) to <o_tab>.
CLEAR retab.
CONCATENATE '(' REPID ')' V_TAB '[' ']' into retab.
CONDENSE retab.
ASSIGN (retab) to <v_tab>.
CONCATENATE 'V' TAB_NAME INTO NAMETAB1.
"获取传入表结构
CREATE DATA l_refTAB TYPE TABLE OF (NAMETAB1).
ASSIGN l_reftab->* TO <l_stab>.
CREATE DATA l_refTAB TYPE TABLE OF (NAMETAB1).
ASSIGN l_reftab->* TO <l_stab1>.
CREATE DATA l_ref TYPE (NAMETAB1).
ASSIGN l_ref->* TO <l_struc>.
"赋值更新表
LOOP AT <o_tab> ASSIGNING <WA>.
<l_struc> = <WA>.
ASSIGN COMPONENT 'KZ' OF STRUCTURE <l_struc> TO <FS1>.
<FS1> = i_FLAG.
append <l_struc> to <l_stab>.
CLEAR:<FS1>, <l_struc>.
ENDLOOP.
LOOP AT <v_tab> ASSIGNING <WA>.
<l_struc> = <WA>.
ASSIGN COMPONENT 'KZ' OF STRUCTURE <l_struc> TO <FS1>.
<FS1> = i_FLAG.
append <l_struc> to <l_stab1>.
CLEAR:<FS1>, <l_struc>.
ENDLOOP.
DATA: OBJECTID TYPE CDHDR-OBJECTID,
TCODE TYPE CDHDR-TCODE,
UTIME TYPE CDHDR-UTIME,
UDATE TYPE CDHDR-UDATE,
USERNAME TYPE CDHDR-USERNAME,
PLANNED_CHANGE_NUMBER TYPE CDHDR-PLANCHNGNR,
OBJECT_CHANGE_INDICATOR TYPE CDHDR-CHANGE_IND,
PLANNED_OR_REAL_CHANGES TYPE CDHDR-CHANGE_IND,
NO_CHANGE_POINTERS TYPE CDHDR-CHANGE_IND,
UPD_ICDTXT TYPE CDPOS-CHNGIND,
UPD_ZDHHDD_ITEM TYPE CDPOS-CHNGIND.
DATA: ICDTXT LIKE TABLE OF CDTXT WITH HEADER LINE.
objectid = TAB_NAME .
tcode = T_CODE .
utime = sy-uzeit .
udate = sy-datum .
username = sy-uname .
object_change_indicator = i_FLAG .
upd_icdtxt = i_FLAG .
upd_ZDHHDD_ITEM = i_FLAG.
IF i_FLAG = 'I' OR i_FLAG = 'D' .
"取主键内容
CALL FUNCTION 'NAMETAB_GET'
EXPORTING
LANGU = SY-LANGU
ONLY = ' '
TABNAME = TAB_NAME
* IMPORTING
* HEADER =
* RC =
TABLES
NAMETAB = NAME_TAB[]
* EXCEPTIONS
* INTERNAL_ERROR = 1
* TABLE_HAS_NO_FIELDS = 2
* TABLE_NOT_ACTIV = 3
* NO_TEXTS_FOUND = 4
* OTHERS = 5
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
LOOP AT <l_stab1> ASSIGNING <l_struc>.
LOOP AT NAME_TAB WHERE KEYFLAG = 'X'.
ASSIGN COMPONENT NAME_TAB-FIELDNAME OF STRUCTURE <l_struc> TO <FS>.
CONCATENATE ICDTXT-TEILOBJID <FS> INTO ICDTXT-TEILOBJID.
CONDENSE ICDTXT-TEILOBJID.
ENDLOOP.
ICDTXT-TEXTART = 'KEY'.
ICDTXT-updkz = i_FLAG.
APPEND ICDTXT.
CLEAR ICDTXT.
ENDLOOP.
CLEAR:<l_stab>,<l_stab1>.
ENDIF.
"新增修改删除表记录
CALL FUNCTION 'CHANGEDOCUMENT_OPEN'
EXPORTING
OBJECTCLASS = OBJECTCLAS
OBJECTID = OBJECTID
PLANNED_CHANGE_NUMBER = PLANNED_CHANGE_NUMBER
PLANNED_OR_REAL_CHANGES = PLANNED_OR_REAL_CHANGES
EXCEPTIONS
SEQUENCE_INVALID = 1
OTHERS = 2.
CASE SY-SUBRC.
WHEN 0. "OK.
WHEN 1. MESSAGE A600 WITH 'SEQUENCE INVALID'.
WHEN 2. MESSAGE A600 WITH 'OPEN ERROR'.
ENDCASE.
IF UPD_ZDHHDD_ITEM NE SPACE.
IF ( <l_stab> IS INITIAL ) AND
( <l_stab1> IS INITIAL ).
UPD_ZDHHDD_ITEM = SPACE.
ENDIF.
ENDIF.
IF UPD_ZDHHDD_ITEM NE SPACE.
CALL FUNCTION 'CHANGEDOCUMENT_MULTIPLE_CASE'
EXPORTING
TABLENAME = TAB_NAME
CHANGE_INDICATOR = UPD_ZDHHDD_ITEM
DOCU_DELETE = 'X'
DOCU_INSERT = 'X'
TABLES
TABLE_OLD = <l_stab>
TABLE_NEW = <l_stab1>
EXCEPTIONS
NAMETAB_ERROR = 1
OPEN_MISSING = 2
POSITION_INSERT_FAILED = 3
OTHERS = 4.
CASE SY-SUBRC.
WHEN 0. "OK.
WHEN 1. MESSAGE A600 WITH 'NAMETAB-ERROR'.
WHEN 2. MESSAGE A600 WITH 'OPEN MISSING'.
WHEN 3. MESSAGE A600 WITH 'INSERT ERROR'.
WHEN 4. MESSAGE A600 WITH 'MULTIPLE ERROR'.
ENDCASE.
ENDIF.
IF UPD_ICDTXT NE SPACE.
CALL FUNCTION 'CHANGEDOCUMENT_TEXT_CASE'
TABLES
TEXTTABLE = ICDTXT
EXCEPTIONS
OPEN_MISSING = 1
POSITION_INSERT_FAILED = 2
OTHERS = 3.
CASE SY-SUBRC.
WHEN 0. "OK.
WHEN 1. MESSAGE A600 WITH 'OPEN MISSING'.
WHEN 2. MESSAGE A600 WITH 'INSERT ERROR'.
WHEN 3. MESSAGE A600 WITH 'TEXT ERROR'.
ENDCASE.
ENDIF.
CALL FUNCTION 'CHANGEDOCUMENT_CLOSE'
EXPORTING
OBJECTCLASS = OBJECTCLAS
OBJECTID = OBJECTID
DATE_OF_CHANGE = UDATE
TIME_OF_CHANGE = UTIME
TCODE = TCODE
USERNAME = USERNAME
OBJECT_CHANGE_INDICATOR = OBJECT_CHANGE_INDICATOR
NO_CHANGE_POINTERS = NO_CHANGE_POINTERS
EXCEPTIONS
HEADER_INSERT_FAILED = 1
OBJECT_INVALID = 2
OPEN_MISSING = 3
NO_POSITION_INSERTED = 4
OTHERS = 5.
CASE SY-SUBRC.
WHEN 0. "OK.
WHEN 1. MESSAGE A600 WITH 'INSERT HEADER FAILED'.
WHEN 2. MESSAGE A600 WITH 'OBJECT INVALID'.
WHEN 3. MESSAGE A600 WITH 'OPEN MISSING'.
* WHEN 4. MESSAGE A600 WITH 'NO_POSITION_INSERTED'.
* do not abort, if positions are not inserted!!!
WHEN 5. MESSAGE A600 WITH 'CLOSE ERROR'.
ENDCASE.
ENDFUNCTION.
在之后,就是在程序中调用这个函数,进行一些自建表的数据变更前后的差异了,这里需要用到2个表:CDPOS和CDHDR