注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

原来为了你

我的人生就是要一次次的超越

 
 
 

日志

 
 
 
 

创建自定义表的日志(字段级别)  

2011-09-06 09:55:58|  分类: 数据库、表、视图 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1.对自定义表的某个字段的数据元素设置属性“更改文档”打钩。如图1所示。

创建自定义表的日志(字段级别) - 2006057145 - 原来为了你

 

2.设置这个表的技术设置“Log data changes”打钩。不设置也可以。。

3.SCDO创建更改文档。

名字空间可以不用输入

名称表选择自定义表,如ZSTU

复制为内表打钩。此项解释:如果属于一个业务对象的几个对象(如一个订单的抬头和几个行项目)都被改变,可以把这些改变都传输到一个内表,然后再传给更新函数来创建更改记录。如果打钩,改变的数据会被输出到一个内表(multiple case);如果不打钩,改变的数据会传输到一个工作区(结构,single case)。

单独文档的删除字段打钩。此项解释:如果你想把字段的删除分多个行项目来记录,就打钩;如果不打钩,说明多个字段的删除会放进一个行项目中记录。

名称参考表不填。此项解释:这个地方填一个结构,结构的字段是当前表名里面数量和货币字段参照用的UNITCURRENCY字段。< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />

旧名称字段字符串不填。此项解释:只对single case(结构,single case)的情况有效(举个例子,*sbook代表未更新前的工作区 OLD RECORDsbook代表要更新的工作区 NEW RECORD),如果这个地方不填,系统会默认*+结构名作为未更新前工作区的名字;如果填了,就用你填写的名字来代替如*sbook之类的名字来作为OLD RECORD

 如下图:

创建自定义表的日志(字段级别) - 2006057145 - 原来为了你

 

创建自定义表的日志(字段级别) - 2006057145 - 原来为了你

 

创建自定义表的日志(字段级别) - 2006057145 - 原来为了你

 

本例创建一个表名:ZSTU,这些内容输入完毕之后,转到主菜单utilities->generate update program.在弹出窗口中输入include的名字(如ZSTUABC),function group的名字(可以选择已有或者不存在的函数组),以及要创建的结构以什么打头(系统默认为Y),其他默认的就可以了(可以根据你的需要修改),然后点generate按钮,系统将自动产生一些include程序,如果function group没有,系统也会自动创建,同时还会创建一些结构和一个更新函数MODULE

一共会产生4include程序,形式为F+上面写的include的名字+CD+XT,F,V,C其中一个),如:

FZSTUABCCDTT代表TOP的意思,实际就是数据声明,它包含FZABCCDFFZABCCDV两个include程序);

FZSTUABCCDF(更改凭证抬头的一些数据定义,形式基本固定,看了一些更改凭证对象,都是一样的);

FZSTUABCCDV(更新函数模块的一些IMPORTINGTABLES参数定义);

FZSTUABCCDCC代表CALL,调用函数更新模块,实际就是个subtoutine,代码如下).

假如有表的copy as internal table被打上钩了,系统会自动创建一个V(为什么是V,上面有解释)+表名的结构,此表所有的改变就会保存在参考这个结构创建的两个内表中,为什么是两个内表?一个保存OLD RECORD,一个保存NEW RECORD。一般来说保存新值的内表的命名如:X+表名,保存旧值的内表的命名如:Y+表名。

产生的更新函数的名字一般是更改凭证对象的名字+"_WRITE_DOCUMENT",本例的函数名应该为ZSTU_WRITE_DOCUMENT.

更改凭证保存在CDCLS这个簇表中,它包含了几个透明表,如CDHDR,CDPOS,PCDHDR,PCDPOS.

CDCLS中,OBJECTCLAS就是我们创建的更改凭证对象,OBJECTID一般是表的主键连在一起,change document number是系统自动产生的。

CDHDR除了上面几个字段,还包含了修改的用户,修改的日期和时间以及用什么事务代码那种修改的。

CDPOS表就比较详细了,什么表的什么字段被修改(插入,更新,删除),旧值是什么,新值是什么。如果是数量和金钱,还会保存其单位和货币。

一个更改凭证对象下可能包含多个表或者结构,怎末判断那个字段改变了需要记录呢?看看表或者结构的字段关联的DATA ELEMENTfurther characteristics这个TAB页面下的change document这个CHECKBOX有没有打钩,打钩了说明字段值改变了需要记录。调用更新函数模块的时候,这个更改凭证对象下所有表或者结构跟更改相关的字段(字段对应的DATA ELMENTCHANGE DOCUMENT 打钩的)至少得有一个发生了更改,才能创建一条更改记录。

上面是简单的介绍,下面举例谈谈怎末使用。比较关键的是,应用程序必须把更改凭证对象生成的几个include文件包含进来。

report test_create_log.

include fzstuabccdt.
include fzstuabccdc.

datait_zstu type standard table of zstu with header line.

start
-of-selection.
  
select into corresponding fields of table it_zstu from zstu.

  yzstu[] 
it_zstu[].  "旧值,删除条目或插入条目时,一定要清空这个内表。

  
loop at it_zstu.
    
if it_zstu-sno '0000000001'.
      it_zstu
-sname 'name新值'.
    
endif.
    
modify it_zstu.
  
endloop.

  xzstu[] 
it_zstu[].  "新值
*---更改数据字典(略,对下面没影响)
*---创建更改记录
  
move'ZSTU'   to objectid,
        sy
-tcode to tcode,
        sy
-uzeit to utime,
        sy
-datum to udate,
        sy
-uname to username,
       
'U'       to upd_zstu."往字典表里insert新记录时会自动为'I',查更改记录表chposFNAME值为'key',而不是某个字段

  
perform cd_call_zstu.
  
commit work.

 

更改凭证相关的FUNCTION GROUP

SCD0 creating change documents

SCD1 reading and formatting change documents

SCD2 reading and formatting change documents

SCD3 reading and formatting planned changes

SCD4 deleting change documents and planned changes

SCD5 managing archived change documents

删除时,给Y表的删除条目打上标记KZ = 'D',且X表中不要有这个条目,删除成功后。

如果“单独文档删除的字段”打上钩,日志表CDPOS中该记录的CHNGID = 'E',且删除一条记录,该日志中会记录多条,分另记录所删除字段相关的非KEY字段,有几个非KEY字段就记录几条;

如果"单独文档删除的字段"不打钩,删除一条记录时,日志表CDPOS中就记录一条,FNAME为"KEY",CHNGID = 'D',这个看上去更符合逻辑。

  评论这张
 
阅读(928)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017