《自建表数据修改记录》由会员分享,可在线阅读,更多相关《自建表数据修改记录(9页珍藏版)》请在金锄头文库上搜索。
1、一、研究背景:现在自建表建的对外维护程序渐增,有些关键字段的修改历史需要记录比如:ZFI16的退税率 维护更改历史.就可以通过以下配置和程序来实现对此ZFI16表(维护TCODE:ZS69)的修改 历史.二、实施1.配置:对自建表中所有要记录其修改记录的字段的数据元素中的Further characteristics视图中的 更改文档改打. TCODE: SCDO1直修改文档对象:创建对象ZFI16i文本EFI正的修改记录/称 表名表ZFI16回口 为表 na- rJJ 肯.制复內单独的文档 删除的字段名称 参考表旧名称字段*,占大写字母ffi) 国闕眦简q插入祭目删除行取消保存后上面的所有参
2、数函数等都会自动生成。2.程序:FORM CHANGE_DOCUMENT_CREATE.DATA: UPD_ICDTXT_ZFI16 TYPE C.DATA: BEGIN OF ICDTXT_ZFI16 OCCURS 1.INCLUDE STRUCTURE CDTXT.DATA: END OF ICDTXT_ZFI16 .DATA: DA_OBJECTID LIKE CDHDR-OBJECTID.YZFI16 = IT_ZSD01_1. 修改前的字段旧值XZFI16 = IT_ZSD01. 修改前的字段新值READ TABLE XZFI16 INDEX 1 .MOVE XZFI16-ZHGNO
3、 TO DA_OBJECTID.CALL FUNCTION ZFI16_WRITE_DOCUMENTEXPORTINGOBJECTID= DA_OBJECTIDTCODE= ZS69UTIME= SY-UZEITUDATE= SY-DATUMUSERNAME= SY-UNAME* PLANNED_CHANGE_NUMBEROBJECT_CHANGE_INDICATOR= U* PLANNED_OR_REAL_CHANGES* NO_CHANGE_POINTERS* UPD_ICDTXT_ZYW8UPD_ZFI16= UTABLESICDTXT_ZFI16= ICDTXT_ZFI16XZFI16
4、= XZFI16YZFI16= YZFI16 .ENDFORM. CHANGE_DOCUMENT_CREATE在保存的时候调用以上FORMWHEN SAVE.PERFORM CHANGE_DOCUMENT_CREATE.三、参考文档BC414 的 P220P227创建更改凭证(change document)http:/ 1793208.html使用事务代码SCDO进入,点创建,输入更改凭证对象的名字,以Z或者Y打头,如ZBOOK。继续,创建一个change request, 保存。然后输入更改凭证对象的描述,以及Tables的相关信息。Tables这个框里有几列内容:name of tabl
5、e :表名(可以是表,也可以是结构)copy as internal tabl :如果属于一个业务对象的几个对象(如一个订单的抬头和几个行项目)都被改变,可以把这些改变都 传输到一个内表,然后再传给更新函数来创建更改记录。如果打钩,改变的数据会被输出到一个内表multiple case);如果 不打钩,改变的数据会传输到一个工作区(结构, single case)。Doc. for individual fields at delete :如果你想把字段的删除分多个行项目来记录,就打钩;如果不打钩,说明多个字段的 删除会放进一个行项目中记录。Name of Ref. tab.:这个地方填一个结
6、构,结构的字段是当前表名里面数量和货币字段参照用的UNIT和CURRENCY字段。Name of old field strin :只对single case的情况有效(举个例子,*sbook代表未更新前的工作区OLD RECORD, sbook 代表要更新的工作区NEW RECORD),如果这个地方不填,系统会默认*+结构名作为未更新前工作区的名字;如果填了, 就用你填写的名字来代替如*sbook之类的名字来作为OLD RECORD。本例创建一个表名:SBOOK,这些内容输入完毕之后,转到主菜单utilities-generate update program.在弹出窗口中输入include
7、的名字(如ZABC),function group的名字(可以选择已有或者不存在的函数组),以及要创建的结构以什么打 头(系统默认为V),其他默认的就可以了(可以根据你的需要修改),然后点generate按钮,系统将自动产生一些include 程序,如果function group没有,系统也会自动创建,同时还会创建一些结构和一个更新函数MODULE。一共会产生4个include程序,形式为F+上面写的include的名字+CD+X (T,F,V,C其中一个),如:FZABCCDT (T代表TOP的意思,实际就是数据声明,它包含FZABCCDF和FZABCCDV两个include程序);FZA
8、BCCDF (更改凭证抬头的一些数据定义,形式基本固定,看了一些更改凭证对象,都是一样的);FZABCCDV (更新函数模块的一些IMPORTING和TABLES参数定义);FZABCCDC(C代表CALL,调用函数更新模块,实际就是个subtoutine,代码如下).FORM CD_CALL_ZBOOK.CALL FUNCTION ZBOOK_WRITE_DOCUMENT IN UPDATE TASKEXPORTINGOBJECTID= OBJECTIDTCODE= TCODEENDFORM.假如有表的copy as internal table被打上钩了,系统会自动创建一个V (为什么是V
9、,上面有解释)+表名的结构,此表所 有的改变就会保存在参考这个结构创建的两个内表中,为什么是两个内表? 一个保存OLD RECORD, 一个保存NEW RECORD。 一般来说保存新值的内表的命名如:X+表名,保存旧值的内表的命名如:Y+表名。产生的更新函数的名字一般是更改凭证对象的名字+_WRITE_DOCUMENT,本例的函数名应该为 ZBOOK_WRITE_DOCUMENT.更改凭证保存在CDCLS这个簇表中,它包含了几个透明表,如CDHDR,CDPOS,PCDHDR,PCDPOS.CDCLS中,OBJECTCLAS就是我们创建的更改凭证对象,OBJECTID 般是表的主键连在一起,ch
10、ange document number 是系统自动产生的。CDHDR除了上面几个字段,还包含了修改的用户,修改的日期和时间以及用什么事务代码修改的。CDPOS表就比较详细了,什么表的什么字段被修改(插入,更新,删除),旧值是什么,新值是什么。如果是数量和金钱,还 会保存其单位和货币。一个更改凭证对象下可能包含多个表或者结构,怎末判断那个字段改变了需要记录呢?看看表或者结构的字段关联的DATAELEMENT的further characteristics这个TAB页面下的change document这个CHECKBOX有没有打钩,打钩了说明字 段值改变了需要记录。调用更新函数模块的时候,这个
11、更改凭证对象下所有表或者结构跟更改相关的字段(字段对应的DATA ELMENT的CHANGE DOCUMENT打钩的那种)至少得有一个发生了更改,才能创建一条更改记录。上面是简单的介绍,下面举例谈谈怎末使用。比较关键的是,应用程序必须把更改凭证对象生成的几个include文件包含进来。PROGRAM ZXXXXXX.*应用程序数据定义DATA .INCLUDE FZBOOKCDT.MOVE . TO *sbook. old recordMOVE . TO sbook. new record*更新应用数据CALL FUNCTION UPDATE_SBOOK IN UPDATE TASKEXPOR
12、TING .*创建更改记录MOVE: . TO objectid,sy-tcode TO tcode,sy-uzeit TO utime,sy-datum TO udate,sy-uname TO username,U TO upd_sbook.PERFORM cd_call_zbook. INCLUDE FZBOOKCDC里的 subroutineCOMMIT WORK.INCLUDE FZBOOKCDC.更改凭证相关的 FUNCTION GROUPSCD0 creating change documentsSCD1 reading and formatting change documen
13、tsSCD2 reading and formatting change documentsSCD3 reading and formatting planned changesSCD4 deleting change documents and planned changesSCD5 managing archived change documents数据修改记录;change docume nt的使用项目中遇到了一个需求:对自建表的数据进行操作的时候,需要对更改信息进行记录,到字段级别使用到了 SAP 的 chenge document 功能.Tcode : SCDO首先建立一个自己的ch
14、ange document object在对象里面填上需要记录的表的名字.要是需要记录删除字段信息的话,把第 二个 checkbox 选上.Change Document Object: Change讯已训E门tri巳5 D巳I巳t已Rizw | G巳门巳wtiizn i门fbOIU NPMeasurennent Point丁吐|文/Name of.Copy asDoc. for indmdualName afNameTableinternal tab,fields ;at deleteRef, tab.field :0IU_PR_MP| 0然后选择生成更新程序- 保存.点击生成信息的话,可以看见生成的程序还有function module信息,要是上面截图第一个checkbox被选择的话,还会生成新的structure .至 V这里,change document object 就建立好了 在程序里面直接调用生成的function module把原始值和更新值传进去就可以了*start*REFRESH : lt_icdtxt .CALL FUNCTION ZYW8 WRITE DOCUMENTEXPORTINGobjectid=ls-objectidt code=ls-tcodeutime=ls-utimeuda te=ls-udate