在标准SAP业务应用中常会修改标准程序和增加一些自己的功能代码来满足特定化的需求,SAP提供了一些出口对特定的程序、屏幕、MENU以及 Docuement进行扩展与修改,他们并不包含任何功能,并被分离存在特定的package里所以他既不会影响标准SAP源代码也不会妨碍升级。除了通过后台配置客户化,我们常用主要有三种用户出口来进行Enhancement和Modification:
1,User Exit,最早的出口嵌写在标准程序里,修改起来也最为复杂。如Order处理上使用的SAPMV45A中就包含大量ZZ或YY结尾的user exit程序MV45AFZZ/MV45AIZZ。
2,Customer Exit,主要有三种类型Menu Exit/Screen Exit/FM Exit,首先通过CMOD来创建一个Project然后指定所需要的Enhancement,然后指定Component并激活。最后则需要加些所需代码在自动创建一个Z程序里。
3, BADI,SE18/SE19,正如引入了OO的技术,在定义与实现在与Customer Exit两层是一样的,能客户化用户想用的标准解决方案的逻辑,对于开发者主要是通过一些方法来找到合适的BADI。
对于Order Business Process的MV45AFZZ中User Exit开发主要常用在下面几个Form中:
userexit_save_document
userexit_save_document_prepare
userexit_field_modification
userexit_move_field_to_vbap
当然还包括ZZ程序里的很多类似的Form,通过Google搜可以详细知道他们分别有不同的用途。
如常用T-code SHD0来标准的屏幕Field创建一个Variant,然后用VOV8来为不同的doc type指定不同的Variant,这样可以对屏幕Field进行控制:预设置值,必须/可选值,显示/隐藏值等等,这样非常容易设置sales order screen layout。对于更为细致的设置可以选用userexit_field_modification,例如通过权限来控制那些字段是可见或非可见的
if sy-tcode ='XXXX' and screen-name = <your screen field>.
AUTHORITY-CHECK OBJECT 'XXX' ID 'XXXX' FIELD <screen name>.
if sy-subrc = 0.
screen-input = 0. " Disable it
screen-invisible = 1. " Hide it
modify screen.
endif.
endif.
User Exit的选用
User Exit的选用应该是非常谨慎的,如果有合适的其他出口可代替最好不好,特别是order包括inquiry/quotation/contract大量代码公用,以及SAP最为初始的源代码非常不易于Debug甚至后台运行,选用上还是根据具体的业务找合适的位置:是初始化的修改,是SAVE前的校验,是SAVE时的值的更新与增删,无外乎是对VBAP,VBAK,VBKD,VBEP,VBSN,VBUP,VEDA等等各个表的操作。
值的选取
值的选取不像Customer Exit和BADI,import和export的数据非常清楚,在order user exit则非常含糊,如VBAK *VBAP XVBAP YVBAK FXVEDA FYVBPF等等带* X Y FX FY的表都具有特定的意义:
X: 一般表示更新的值,
Y: 一般表示不完整的值,
FX,FY:中间变量。
另外,在条件判断上可能并没有提供相应的值,可以通过abap memory来获取;另外系统也提供了一些类似sd_vbxx_select来获取当前最新的值。
数据库问题
事实上在取值上直接通过select VBXX来获取,一些字段可能已经被更新甚至是删除以至获取的数据是过时的,这样会导致数据误操作,最终还得多从X,Y表上去检测。
同样,尽量减少Open SQL的操作(insert/delete/modify/upate),运用自身的business process来完成。
代码作用域
上面提到大量代码公共,在什么情况下该使用呢?适当的逻辑判断是非常有必要的,例如像我们常用的的order type(vbak-auart )外还有一些不可忽视的条件:
sy-tcode (查看SYST)
sy-ucomm
t180-trtyp
测试与监控
对于user exit代码的测试,采用我们一般的测试办法问题并不大,但对memory里的数据操作,如何去检测似乎并不是一件简单的事,特别是对一些“很莫名”的问题:
(SAPLV45W)XVEDA[],类似的其他表可以查看更新后的值
ST05,通过这个t-code可以对sql进行trace,查看值是否被成功写入DB
SM13,查看update Request是否成功执行
SM21,查看system log,是否有些process被中止
以及其他的一些sm35 sm50 st01 st22 类似的SM/ST的t-code。