Chinaunix首页 | 论坛 | 博客
  • 博客访问: 394301
  • 博文数量: 120
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 1266
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-16 16:04
文章分类

全部博文(120)

文章存档

2011年(4)

2010年(10)

2009年(38)

2008年(68)

我的朋友

分类:

2009-01-12 11:43:15

使用事务代码SCDO进入,点创建,输入更改凭证对象的名字,以Z或者Y打头,如ZBOOK。继续,创建一个change request,保存。然后输入更改凭证对象的描述,以及Tables的相关信息。
 
Tables这个框里有几列内容:
name of table:表名(可以是表,也可以是结构)
copy as internal table:如果属于一个业务对象的几个对象(如一个订单的抬头和几个行项目)都被改变,可以把这些改变都传输到一个内表,然后再传给更新函数来创建更改记录。如果打钩,改变的数据会被输出到一个内表(multiple case);如果不打钩,改变的数据会传输到一个工作区(结构,single case)。
Doc. for individual fields at delete:如果你想把字段的删除分多个行项目来记录,就打钩;如果不打钩,说明多个字段的删除会放进一个行项目中记录。
Name of Ref. tab.:这个地方填一个结构,结构的字段是当前表名里面数量和货币字段参照用的UNIT和CURRENCY字段。
Name of old field string:只对single case的情况有效(举个例子,*sbook代表未更新前的工作区 OLD RECORD,sbook代表要更新的工作区 NEW RECORD),如果这个地方不填,系统会默认*+结构名作为未更新前工作区的名字;如果填了,就用你填写的名字来代替如*sbook之类的名字来作为OLD RECORD。
 
本例创建一个表名:SBOOK,这些内容输入完毕之后,转到主菜单utilities->generate update program.在弹出窗口中输入include的名字(如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程序);
FZABCCDF(更改凭证抬头的一些数据定义,形式基本固定,看了一些更改凭证对象,都是一样的);
FZABCCDV(更新函数模块的一些IMPORTING和TABLES参数定义);
FZABCCDC(C代表CALL,调用函数更新模块,实际就是个subtoutine,代码如下).
FORM CD_CALL_ZBOOK.
    ...
    CALL FUNCTION 'ZBOOK_WRITE_DOCUMENT' IN UPDATE TASK
        EXPORTING
          OBJECTID                = OBJECTID
          TCODE                   = TCODE
          ...
ENDFORM.
 
假如有表的copy as internal table被打上钩了,系统会自动创建一个V(为什么是V,上面有解释)+表名的结构,此表所有的改变就会保存在参考这个结构创建的两个内表中,为什么是两个内表?一个保存OLD RECORD,一个保存NEW RECORD。一般来说保存新值的内表的命名如:X+表名,保存旧值的内表的命名如:Y+表名。
 
产生的更新函数的名字一般是更改凭证对象的名字+"_WRITE_DOCUMENT",本例的函数名应该为ZBOOK_WRITE_DOCUMENT.
 
更改凭证保存在CDCLS这个簇表中,它包含了几个透明表,如CDHDR,CDPOS,PCDHDR,PCDPOS.
CDCLS中,OBJECTCLAS就是我们创建的更改凭证对象,OBJECTID一般是表的主键连在一起,change document number是系统自动产生的。
CDHDR除了上面几个字段,还包含了修改的用户,修改的日期和时间以及用什么事务代码修改的。
CDPOS表就比较详细了,什么表的什么字段被修改(插入,更新,删除),旧值是什么,新值是什么。如果是数量和金钱,还会保存其单位和货币。
 
一个更改凭证对象下可能包含多个表或者结构,怎末判断那个字段改变了需要记录呢?看看表或者结构的字段关联的DATA ELEMENT的further characteristics这个TAB页面下的change document这个CHECKBOX有没有打钩,打钩了说明字段值改变了需要记录。调用更新函数模块的时候,这个更改凭证对象下所有表或者结构跟更改相关的字段(字段对应的DATA ELMENT的CHANGE DOCUMENT 打钩的那种)至少得有一个发生了更改,才能创建一条更改记录。
 
上面是简单的介绍,下面举例谈谈怎末使用。比较关键的是,应用程序必须把更改凭证对象生成的几个include文件包含进来。
 
PROGRAM ZXXXXXX.
***应用程序数据定义
DATA ...
INCLUDE FZBOOKCDT.

MOVE ... TO *sbook. " old record
MOVE ... TO sbook.  " new record
***更新应用数据
CALL FUNCTION 'UPDATE_SBOOK' IN UPDATE TASK
     EXPORTING ...
***创建更改记录
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里的subroutine 
COMMIT WORK.
...
INCLUDE FZBOOKCDC.
 
更改凭证相关的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
阅读(3375) | 评论(0) | 转发(0) |
0

上一篇:COMPLEX SAP LUW

下一篇:SAP TABLE BUFFERS

给主人留下些什么吧!~~