R3标准事务中无法满足用户独特的需求,需要做二次增强开发。目的:•不需要修改R3标准事务代码就能增强R3的功能•当系统升级时,原有增强得以保留下来,不需要重新开发。什么是用户出口(UserExits)用户出口的分类•三代用户出口:•第一代:固有的FM,需要修改R3代码,现已很少用。•第二代:也是通过FM的方式。–包括:A功能模块出口(FunctionModuleExit)•B屏幕出口(ScreenExit)•C菜单出口(MenuExit)•D字段出口(FieldExit)•第三代:采用面向对象方式实现的出口(BADI)•另:模块独有的出口(BTE会计模块专有,需要修改R3代码)出口的目的功能出口(FunctionExit)•在标准事务运行中的某点添加业务逻辑。一般用于验证标准事务中的字段。屏幕出口(ScreenExit)•为标准事务添加子屏幕。菜单出口(MenuExit)•使能或屏蔽标准事务的菜单栏。字段出口(Fieldexits)•根据数据元素验证标准事务的某些屏幕字段。例子事务码CO11N.需求•添加一个新的子屏幕,让用户输入人力资源(HR)数据并保存倒标准数据库表中,然后在COOIS事务中展现出来。•验证执行日期字段(Executionstartdate)不能超过从今天起的一个星期。CO11NStandardScreenRequiredScreen寻找功能出口(FunctionExit)•首先取得标准事务对应的程序名称。•然后到SE38,取得程序对应的包名。(PackageName)STEPITcodeSMODSTEPIISTEPIIIDblclickSTEPIVDblclickSTEPVDblclickSTEPVISTEPVII另一个找功能出口的方法•转到SE38,输入程序名称,点击菜单utilities-findinsourcecode•搜索Callcustomer•找到出口后双击进入。PressEnterDblclickRequiredScreenDblClickRequiredScreen•然后转到SMOD进行搜索(见前面步骤StepI和步骤StepII)开发程序查找用户出口使用已有程序查找出口,详见附件。finduserexits.txt.txt怎样找屏幕出口•如上述STEPI和STEPII所示到SMOD找。DblclickClickHereCMOD字段出口(FieldExit)•转到事务RZ10,在instanceprofile中检查abap/fieldexit参数是否为yes.•然后转到标准事务,取得数据元素,屏幕名称,和屏幕号。•转到SE38,执行RSMODPRF。STEPITransactioncodeRZ10ClickSTEPIIPressDisplayOrChangeChecktheparametervalueIfitisnottherecreatethenewparameterPress保存Profile后返回•现在返回标准事务,取得数据元素和屏幕名称,屏幕号。•假设我们使用CS03PressExecuteExecutePresscreatetocreateyourfunctionmoduleandactivate现在再次回到SE38,执行RSMODPRF,但不输入数据元素。ExecuteBADI•寻找BADI的方法一1、badi对象的信息存储在SXS_INTER,SXC_EXIT,SXC_CLASS和SXC_ATTR这四个表中(参见SECE包);2、sap程序都会调用cl_exithandler=get_instance来判断对象是否存在,并返回实例;其实get_instance就是对上述几个表和他们的视图(V_EXT_IMP和V_EXT_ACT)进行查询和搜索。3、基于这个机理,查用ST05来监控一个TCODE来跟踪,然后选择查找有关上述几个表和视图的操作,就可获得相关BADI。BADI•寻找BADI的方法二1.使用SE24进入ClassBuilder。2.查看对象CL_EXITHANDLER,进入其get_instance方法。3.对get_class_name_by_interface设置断点。4.Debug需要增强的事务,在断点处查看class_name即可找到对应的BADI注意事项•一个出口可能被多个事务调用,请注意指定被哪个事务调用。•注意出口的参数是否满足业务需求,如果参数不满足要求,请继续寻找下一个出口。•请注意出口执行的时间点。