Enhancement(1)--BTEs
最近一个同事碰到一个FI的增强,要用BTEs实现,我也是第一次接触到这种增强,所以跟着他一起做了一下。写一个这方面的小节。
BTEs(Business TransactionEvents),是SAP的一种增强方式,技术上讲是介于Customer Exits和BAdIs的产物。 它主要有两种类型的接口: Publish andSubscribeInterface Process Interface其比较核心的理念是,使一个接口重复利用,多种实现并且互不干扰。而技术实现的时候,就采用在标准程序中Call固定的一个functioin,然后再用这个function动态调用自己定义的增强function,从而达到预期目的。这样的接口,在标准程序中常常是以OPEN_FI_PERFORM_或者OUTBOUND_CALL_开头的function。由于采用这种技术架构,SAP就使这些接口,分为Made by SAP, Made by SAP's Partner,Made by SAP's Customer,三方可以个取所需。 至于Publish andSubscribeInterface和ProcessInterface的区别,主要还是用途上的。前者,使给外部软件提供信息的,而后者主要用于R/3流程的。不过前者也可以生成或修改一些additional data。BTEs主要用于总帐,应收应付和销售分销模块。 我做的那个是ProcessInterface,说来也很简单,就是在billing posting的时候,把Head的text改掉。 下面,我来说一下流程。- T-code: FIBF 进入BTEs的界面
- Environment->Infosystem(Processes)->运行->Process 00001120->Sample functionmodule,然后复制这个function到自己的Z或Y程序中->编辑新复制的程序,加入自己的代码
- 回到FIFB界面,Settings->Products->...ofcustomer->New Entries加入自己的product,并激活
- 回到FIFB界面,Settings->ProcessModules->... of customer->新建主键是00001120的Process,并将刚才建立的function module和product写到相应栏位。
之后,运行相应的过账程序,诸如T-CODEVF01或是FB01,生成财务凭证,察看凭证的HEAD TEXT是否被修改。
原代码不方便贴,就放些关键的代码。
SPAN { font-family: "Courier New"; font-size: 10pt; color:#000000; background: #FFFFFF; } .L1S33 { color: #4DA619; } .L1S52 {color: #0000FF; }LOOPATT_BKPFSUB.
T_BKPFSUB-BKTXT='KEVINBTEs'.
MODIFYT_BKPFSUBINDEXSY-TABIX.
ENDLOOP.
Enhancement(2)--DictionaryElements
对于透明表及结构的增强,主要两种。一种是Append Structure,还有一种就是Include形式。
AppendStructure可以扩展 原来的表结构,但是并不是在原来的表上加字段,而是再建一个附加的结构,物理上,数据是存在两处的。而且,一个AppendStructure只能有一张表结构。如果把有Append Structure结构的表进行复制的话,那么在新的表中,原有的AppendStructure就变成了固定字段,物理表也变成了一张。Include格式,多见于由于增强而自动生成的表字段,比如做屏幕增强的时候。当然,你也可以自己定义。相比AppendStructure, Include就可以包含多张表结构(Include的Data Elements可以AppendStructure)。它不具有Append Structure的‘复制’性能,即使复制,还是会以原结构存在于新表中。当你做完增强后,如果想所加字段在SM30表维护中也出现,那么需要通过以下路径生成表维护程序:SE11->进入相应表,并做完增强->Utilities->TableMaintenance Generator如果你要反复地更改增强,比如改变某一字段的长度。那么在减少字段时,需用SE14进行物理表的修改,否则无法激活。有一种情况要注意,原有数据表中存在数据时,AppendStructure或Include增强,不会影响原有数据,只会在原有的数据中加上相应的空白字段。如果,将字段的长度减少时,数据的就会丢失,一般是从尾部开始丢失。所以不建议,在已有数据的情况下,减少字段长度。下面将以下我碰到的一个实际例子。由于业务的需要,一个标准表的标准字段长度不够,这时候就要增强字段长度。我那时候想了3套方案。1.直接增加字段长度。(由于这个字段有一定的命名规则,程序会截取字符进行进行判断,直接增加字段长度,直接修改代价比较大)2.Apend一个附加字段,在逻辑判断的时候,将附加字段和原有字段综合起来进行判断。(要修改相应的程序)3.由于这个字段是用来Mapping的,有它一定的命名规则。改变原有的命名规则,延长这个字段的使用寿命。现在还没定出来使用哪个。不过个人感觉,如果一开始架构的时候能对业务增长有一个比较可靠的估计,那么碰到这种情况的概率也会大大减少。毕竟,上线后再做修改和增强,已经属于费力的工程了。对于字典文档的增强,可以在以下路径中做: CMOD->GoTo->Textenhancements->Data elements/KeywordsEnhancement(3)--UserExitsUserExits是SAP第一代增强技术,其技术原理就是在程序中预先置放一个Form...EndForm的子程序,并在事物运行时Call这个Form。当然,如果这个Form是空的,那么不执行任何操作,反之,执行相应的动作。UserExits的写法,和修改标准程序是一致的,要有向SAP申请AccessKey才能对这些程序进行修改。与修改标程的区别在于,在SAP做升级的时候,UserExits会自动保留,标程的修改如果不做特殊处理,就会被覆盖。在做这样的增强时,要养成一个习惯,那就是把你所要添加的代码都写在自己以Z开头的function中,然后在Form中调用这个function。例如:SPAN { font-family: "Courier New"; font-size: 10pt; color:#000000; background: #FFFFFF; } .L1S31 { font-style: italic; color:#808080; } .L1S33 { color: #4DA619; } .L1S52 { color: #0000FF;}FORMAdd.
CALLFUNCTION'ZGDTEST'
EXPORTING
I_CHAR=
I_FLOAT=
*IMPORTING
*E_DATE=
*E_CHAR=
*E_VAR=
.
ENDFORM.下面来讲一下,如何找到此类出口:
方法1:
SPRO ->SAP Reference IMG,按,SearchTerm中填入’USEREXIT’就可以查到每个模块相应的出口了,每个出口SAP都会有相应的使用说明。
例子:
User Exits In Sales DocumentProcessing
程序:MV45AFZZ
出口名:USEREXIT_SAVE_DOCUMENT
使用说明:
Use this user exit to filluser-specific statistics update tables.
The user exit is called up by theFORM routine BELEG-SICHERN before the COMMITcommand.
Note
If a standard field is changed,the field r185d-dataloss is set to X. The system queries thisindicator at the beginning of the safety routine. This is why thisindicator must also be set during the maintenance of user-specifictables that are also to be saved.
方法二
进入你要做增强的那个screen,找到相应的程序名,例:va01以下屏幕的程序就是SAPMV45A
用T-CODE: SE38,输入程序名SAPMV45A,进入,按下,屏幕左部出现以下对话框。
选择Subroutines进行扩展,那些以USEREXIT开头的routines就是我们要找的出口,这里可以很方便地找到USEREXIT_SAVE_DOCUMENT,和之前的方法效果是一样的。
Enhancement(4)--CustomerExitsCustomer Exits, 顾名思义,就是用户自定义出口。有3类这样的出口:Function Module Exits; Menu Exits; ScreenExits有两个常用的T-code:CMOD:用于增强项目的管理SMOD:增强项目的具体实现Function Module Exits: 就是在标准程序中预置有形如call customer-function'NNN'的callfunction语句,来动态调用相关的出口程序。'NNN'是3位数字,而实际的出口函数命名方式为:EXIT_<programname>_<exitnumber>。寻找这样的可以用SMOD的查询功能,同时也有一个程序可以用T-CODE来帮助查找,在老白的博客上应该有这个程序。这个出口形式比较简单,所以就不举例子了。Menu Exits: 个人觉得是用得比较少的一种出口,项目上很少使用,SAP预留的出口也很少。抓住几点关键就可以了,MenuExits会有一个预留的function code比如+PGE什么的。你要在做增强的程序中发现这样的句子:CASE: OK_CODE. ...WHEN '+PGE'.CALL CUSTOMER-FUNCTION '001'. ...ENDCASE.这样就可以在相应的出口里编写你想要的东西了。ScreenExits: 相对比较繁琐。举一个例子来说明一下。SMOD:AIST0002EXIT_SAPLAIST_002 中加入代码SPAN { font-family:"Courier New"; font-size: 10pt; color: #000000; background:#FFFFFF; }ANLU=I_ANLU.EXIT_SAPLAIST_003 中加入代码SPAN {font-family: "Courier New"; font-size: 10pt; color: #000000;background: #FFFFFF; }E_ANLU=ANLU.在Include tables中建立一张表 CI_ANLU,结构如下:ZKEVIN CHAR 20讲一下以上函数及表的一下作用,大家看一下参数就应该就比较明白了。EXIT_SAPLAIST_002 是从事务程序将数据传入出口程序EXIT_SAPLAIST_003 是将出口程序处理后的数据传到事务程序CI_ANLU 就是在屏幕上加的结构T-code SE80->function group XAIS 建立Subscreen9001,并画出相应的屏幕、完成逻辑流。T-code AOLA->COPY标准SAP TABLAYOUT->修改其General tab->增加一个Groupbox, 选U9001。T-code AOLK->选择class 1000->GeneralAssignment of Layout->将刚刚新建的Layout替换掉原来Assetaccountant的Tab layout。T-code AS01/AS02/AS03 进行相应的测试。SMOD: CNEX0006这个是自带屏幕,不需要配置的。制作的方法,和之前的例子相似。测试T-code:CJ01。以上是两种常见的屏幕增强,当然还有BAdI形式的,这个下一节再讲。
Enhancement(5)--FieldExits Field Exits,我想了一下还是单独拿出来写一下比较好。虽然技术上来讲有点像CustomerExits(两者都是通过function来实现出口的),但是其原理和用途又有很大不同,而且FieldExits,SAP在4.6之后就不再支持了,如果没有用过这个技术,想要用,还要重新启动PRD才行,很麻烦,所以这里只是做个介绍性来谈谈这种出口方式。大家可以在SE38里,运行程序RSMODPRF来寻找已经存在的Field Exits,同时也可以进入FieldExits的管理界面。还有一种方法,就是在CMODZ界面,在T-CODE栏中键入PRFB也可以进入Field Exits的管理界面。 FieldExit->Create 就可以新建一个Field Exits,只要有相应的DataElement在数据库中存在,就能建立出针对这个Data Element的FieldExits。同时会要生成一个FIELD_EXIT_开头的function,用以做相应的增强。里面有两个参数,Input和Output,这两个参数是固定的,不能修改。Input是将屏幕字段的值传到出口程序,而Output则是传出。出口程序中,有些ABAP语句是受限制的 callscreen, call dialog, call transaction, submit commitwork, rollback workcommunicationreceive exitfrom step-loop messagei, message w stop,reject所以也种出口的功能带来了限制。同时,debug是fieldexit会被忽略,所以对纠错来说也是一个不利,你只能做单元测试,而不能做集成测试。 要对FieldExits做得更细,那就要给它分配,程序及其对应的屏幕号,否则你做出来的就是全局的,对于用到你所定义的Element的数据都有效,这是不一定是我们愿意看到的。最后就是要记住激活,这样才能保证它生效。大家可以做一个例子试试,还是比较简单的。
Enhancement(6)--BAdIs BAdIs(Business Add-Ins)是SAP在R/3 release4.6A后增加的增强技术。总的来说,BAdIs克服了之前出口的所有缺点,并且还是用最新的OO技术实现,可谓是万千宠爱于一身。不过在项目中,用BAdIs的顾问还是比较少,多数是用Customer Exit和User Exit完成。 T-codese18 BAdI Definition T-codese19 BAdI ImplementBAdIs可以实现,Program/Menu/ScreenExit,同时还有BTEs的重复使用的特性。但是不管如何,它在标准程序中的实现有一定格式:这个图可以有助于我们理解BAdI的实现方式。同时,它也给我提供了一个寻找事务BAdI的一个途径。在事务执行时,如果事务中存在BAdI,类cl_exithandler=>get_instance方法就会执行。所以大家就可以,用se24->cl_exithandler-&gt;双击GET_INSTANCE进入方法->在如下语句上设置断点SPAN { font-family: "Courier New"; font-size: 10pt; color: #000000;background: #FFFFFF; } .L0S52 { color: #0000FF; }CALLMETHODcl_exithandler=>get_class_name_by_interface->运行相应的事务,比如MIGO,MM02等,程序就会停在断点处,这样就可以查到相关事务的BAdI了。其实,BAdI就是综合了SAP之前一些增强技术的之长,在标准程序预留了出口,通过面向对象的接口技术,使增强更加灵活。一个出口,可以有多个实现,但是一个client的话,只有一个是起作用的,我试下来,是按创建的先后顺序及是否active来判断的,不过一般一个实现就够了,所以也不必那么麻烦,只能说SAP的技术架构确实是比较先进。下面来举个例子说明一下:se19->MB_MIGO_BADI->创建一个实现->Interface->PBO_DETAIL键入如下代码 SPAN { font-family: "Courier New";font-size: 10pt; color: #000000; background: #FFFFFF; } .L1S33 {color: #4DA619; }E_CPROG='ZKEVIN_MIGO'.
E_DYNNR='1111'.
E_HEADING='kevinsub'.'ZKEIVN_MIGO'是一个自建的程序,'1111'是这个程序中自建的屏幕,'kevin sub'是Tab的标签。你可以在自建的程序中增加PBO和PAI程序,同时在自定义屏幕中添加自己的屏幕元素及逻辑流。在BAdIs中的POST_DOCUMENT方法,可以在生成标准数据时,也在自己的Z表中插入数据,功能很强大。做出来效果是这样的,T-code MIGOBAdI在实现时,还有可能要做一些congfigure,不同的出口方式可能不同,不过SAP会有相应的文档,到时候多看看就行了,万变不离其宗,只要搞明白BAdI的实现机制,那么一切都不是难事。