sap的用户出口总共有三代:
第一代sap提供一个空代码的子过程,在这个子过程中用户可以添加自己的代码,控制自己的需求。这类增强都需要修改sap的标准代码。示例:USEREXIT.. in
SAPMV45A对于第一代增强,可以用以下方法查找增强:打开欲增强的程序,点击工具栏上的“Display Object
List”按钮,选择Subroutines,查找以“UserExit”开头的子程序,根据子程序前面的注释文档来查找用户出口*******************************************************************************
第二代sap提供的是CUSTOMER-FUNCTION,它是通过SMOD和CMOD完成实现:
1、关于增强的简单介绍1.1 SMOD包含具体的增强,而CMOD是包含一组SMOD编写的增强. 1.2 User exits (Function module exits)是sap提供出口,它的命名规则如下:EXIT_<3
digit
suffix>示例:sd的VA01事务,对应的程序是SAPMV45A ,你会在程序里查到(用CALL CUSTOMER-FUNCTION字符串)如下代码:CALL CUSTOMER-FUNCTION '003' exporting xvbak = vbak xvbuk = vbuk xkomk = tkomk importing lvf_subrc = lvf_subrc tables xvbfa = xvbfa xvbap = xvbap xvbup = xvbup.则exit calls function module的名称就是:
EXIT_SAPMV45A_003
2、先试用SMOD建立一个SAP增强2.1、选择一个增强,如:SDVFX001 ,点击修改,进入sap增强维护屏幕;2.2、点击“组件”按钮,进入组件维护屏;2.3、将光标移到“功能模块名”,输入模块名,如:EXIT_SAPLV60B_001;2.4、选择“代码修改”按钮进入函数模块;2.5、双击函数模块的包含单元,进入包含单元加入自定义代码并激活保存。
3、使用CMOD建立增强项目3.1、输入自定义的项目名,点击“创建”;3.2、进入增强项目,选择“配置增强”,进入增强配置屏幕;3.3、输入增强名如:SDVFX001
3.4、保存,并退出;
4、使用CMOD将增强项目激活,便大工告成。
*******************************************************************************对于第二代增强,可以用以下方法查找增强:用户增强通常包括下面3类,顾名思义,就是增强SAP的可能没有提供的功能(通过后台配置也不能实现).
1.E Enhancement exits :就是常说User_exit (用户出口)使用SE37搜索EXIT*的函数大都是做exit用的,通常里面预包含了一个Z开头的程序. SE16查询TFDIR(函数表)输入EXIT*也可.
2.C GUI codes( GUI接口增强)
3. S Subscreens (屏幕增强)
Enhancement在表MODSAP可看到,而TFDIR字段 MAND(值为C表示此出口函数被激活).使用SMOD(CMOD)当然可激活exit function,有时候一时难以查询到相关Enhancement时可使用下面程序将出口函数激活.
REPORT Zactexitfun .
data ztfdir like tfdir .
* select single * from tfdir into ztfdir
* where FUNCNAME =
* 'EXIT_SAPMM06E_013'.
* ztfdir-MAND = 'C' .
* update tfdir from ztfdir.
* 将EXIT_SAPMM06E_013换成实际所需exit函数名update tfdir set MAND = 'C'.
where FUNcname = 'EXIT_SAPMM06E_013'.
***当然也可SE16:MODSAP表enhancement输入EXIT_SAPMM06E_013然后得到enhancement name MM06E005后使用SMOD测试激活exit函数.增强相关函数和表格Function:
[1].DYNP_VALUES_READ
[2]. MODX_ALL_ACTIVE_MENUENTRIES(菜单增强)
[3].MODX_FUNCTION_ACTIVE_CHECK(出口函数增强)由于读者可能接触user exit最多,除了附录光盘有个查找ZFINDEXIT的程序外(有些exit使用它并不能找到),另一个直接有效的方法就是使用这个函数,SE37设好断点后执行tcode如其有exit就会调用此函数.
利用系统函数寻找 MODX_FUNCTION_ACTIVE_CHECK 在这个 FUNCTION 的代码最后添加一个断点。执行需要增强的
TCODE,如果有增强,就
会自动跳入 DEBUG 界面。在
DEBUG 界面,查看
f_tab 字段,这里面所显示的
Smod 就是关 于这个
TCODE
所有的增强项目的列表。这些增强都是属于 EXIT_XXXXXX_XXX 这种形式。 至于如何查看这个增强是属于哪个 SMOD,可以自己查阅 MODSAP 这个表(SAP Enhancements).
[4].MODX_MENUENTRY_ACTIVE_CHECK(菜单增强)
[5].MODX_SUBSCREEN_ACTIVE_CHECK(屏幕增强)
Table:
[1]. TFDIR->function module table
[2]. MODSAP->sap enhancement table
[3]. TSDIR->Dynpro Areas CALL CUSTOMER
SUBSCREEN(屏幕增强)
[4]. CUATEXTS-> GUI Interface: Menu Texts
Changed(GUI 菜单文本增强)
***注意,为了确保一个出口被真正应用,必须同时激活相关程序(SE38)和出口函数(SMOD|CMOD,反正就是要保证tfdir-mandt=’C’,用程序也可.)
*******************************************************************************
第三代
sap提供的第三代的用户出口就是BADI,他的调用方式是CALL METHOD (instance),(相关的TCODE是SE18和SE19),可以通过EXIT_HANDLER这个单词查找BADI。
第三代对于第三代增强,详见下面
1.1 BADIs
BADI
Name
/KJEPS/BADI2
Description
BADI for change
visibility of EPS fields
Dev.
Class
/KJEPS/JD
1.1.1 Method SET_SCREEN_COND_VBAP
Overview:
Method
Name
SET_SCREEN_COND_VBAP
Description
Change field
visibility for Sales order item screen
Function
Called from PBO
module of SAPMV45A 8450 and return
EX_SCREEN_VISIBLE
Interface:
Importing
Parameters
Field
Name
Reference
Description
Mandatory
IN_VBAK
VBAK
Sales Order
Header
X
IN_VBAP
VBAP
Processing Sales
Order Item
IN_TRTYP
TRTYP
Transaction
type
IN_XVBAP
VA_VBAPVB_T
Document Structure
for XVBAP/YVBAP (Sales order item)
IN_XVBEP
VA_VBEPVB_T
Structure of
Document for XVBEP/YVBEP (schedule line)
IN_XVBKD
VA_VBKDVB_T
Reference structure
for XVBKD/YVBKD (business data)
IN_XVBPA
VA_VBPAVB_T
(partner
function)
Changing Parameters
Field
Name
Reference
Description
Mandatory
EX_SCREEN_VISIBLE
C
‘X’ = EPS screen is
visible
Space = EPS screen
is not visible
以上一个是BADI的定义,那么什么是BADI呢,说土点就是现在你定义个接口类,但是这个接口
类有一些方法,但是这些方法都是空的,这些方法也有都自己的IMPORTING ,EXPORTING,
CHANING参数.但是这些方法没有被实现,而你却还要在自己当前写的程序中去调用这个
没有被实现的方法,这里就出现了一堆问题,
为什么要调用它?
为什么这个BADI是空的?
为什么要做这样的一个空的东西?
下面将回答这些问题,因为比较偷懒所以没找到比较好的例子,以下是一个SAP的业务场景:
SALES
ORDER的ITEM数据行的DETAIL信息,
SAP系统给客户留了一个BADI,这个BADI被系统的标准程序调用过,显示一个SUBSCREEN,里面包含一些信息,如下:
如果某个用户实施了SAP的产品,不希望出现这个SUBSCREEN的话,客户想把这个屏幕给隐
藏掉,所以给客户预留了一个BADI的DEFINITION.也就是最上面的那个表.
使用SE18可以看到这个定义.
这三个方法在标准的程序中是怎么被调用的.
以下是系统标准程序************************************************************************************
*Define class
load
class
cl_exithandler definition load.
*Define the Sales
Order Control Table instance
data:
lds_soctrl type
/kjeps/soctrl,
ldf_screen_visible(1)
type C value space,
ldf_pre_existing type
c,
exit type
ref to /KJEPS/IF_EX_BADI2,
ldf_badi_name type
exit_def value '/KJEPS/BADI2'.
*Chck the
BADI whether was implemented.
*检查BADI是否被用户给实现过了,传入BADI的定义名字和接口类名
CALL METHOD
CL_EXITHANDLER=>GET_INSTANCE
EXPORTING
EXIT_NAME =
ldf_badi_name
NULL_INSTANCE_ACCEPTED =
space
IMPORTING
ACT_IMP_EXISTING =
ldf_pre_existing
CHANGING
INSTANCE =
exit.
*IF the BADI has
implemented, and then call corresponding method.
*如果这个BADI被用户实现了,下面的这个参数会等于’X’
*如果实现了,就调用客户实现的方法.
if
ldf_pre_existing = gcf_on.
CALL
METHOD EXIT->SET_SCREEN_COND_VBAP
EXPORTING
IN_VBAK =
vbak
IN_VBAP =
vbap
IN_TRTYP =
t180-trtyp
IN_XVBAP =
xvbap[]
IN_XVBEP =
xvbep[]
IN_XVBKD =
xvbkd[]
IN_XVBPA =
xvbpa[]
CHANGING
EX_SCREEN_VISIBLE
= ldf_screen_visible.
endif.
if
ldf_screen_visible = space.
loop
at screen.
screen-active
= '0'.
modify
screen.
endloop.
endif.
*******************************************************************************
那么这里客户如何是实现这个BADI的DEFINITION呢,使用SE19
其中的SET_SCREEN_COND_VBAP被实现了,把SUBSCREEN的显示的一个变量清除了.
这就表示,用户不想看见那个显示数据的SUBSCREEN,然后看上面的系统中的程序.执行到这里的时候会判断这个变量是否被用户的程序给修改了,如果修改了就不显示SUBSCREEN了.
*******************************************************************
if
ldf_screen_visible = space.
loop
at screen.
screen-active
= '0'.
modify
screen.
endloop.
endif.
*******************************************************************
~完~
查找BADI:
badi 对象的信息存储在 SXS_INTER, SXC_EXIT, SXC_CLASS 和
SXC_ATTR 这四个表中。
2、sap 程序都会调用cl_exithandler=>get_instance
来判断对象是否存在,并返回实例; 其实get_instance 就是对上述几个表和他们的视图 (V_EXT_IMP 和 V_EXT_ACT) 进行查询和 搜索。 3、基于这个机理,我查用 ST05 来监控一个 TCODE 来跟踪,然后选择查找有关上述几 个表和视图的操作,就可获得相关
BADI。 4、se18 查找接口,se19 实现接口就可以实现用户增强。
BADI查找方法:
1.SE37查看SXV_GET_CLIF_BY_NAME,设置断点,运行事务,DEBUG查看NAME的值。
2.SE24查看CL_EXITHANDLER类的GET_INSTANCE方法,在 “CALL
METHOD cl_exithandler=>get_class_name_by_interface”设置断点,运行事务,DEBUG查看EXIT_NAME的值。
3.SPRO查看Business Add-Ins for xxxx子项。
4.SE80》Repository Browser》Package》[开发类名]》Enhancements 》Classic
BAdIs (Def.)
5.查找事务码的程序代码,cl_exithandler=>get_instance的EXPORTING参数exit_name。
6.ST05跟踪事务码,显示Trace后查找“V_EXT_IMP”和“V_EXT_ACT”;查找以“IF_EX_”开头的字符串,该字符串为接口名,“IF_EX_”后即为BADi名。
(1)在SE24中,查看类对象CL_EXITHANDLER ,在其方法(Methods)
GET_INSTANCE 的第 14 行打断点,之后运行事务代码;
当有BADI将会被执行的时候,这时候会进入类CL_EXITHANDLER 的GET_INSTANCE
方法,按F6执行这个方法之后,参数EXIT_NAME 中的值便是BADI定义(SE18中看到的东西),参数CLASS_NAME
则是类对象名称(SE24里面看到的东西),所有的方法实现都是存在于类对象中;
通过查找类方法中的参数(Parameter)和对对象的属性(Attribute),如果能满足自己需要实现的功能,则可以通过实现这个BADI来做增强。
实现BADI的方法(ECC6.0版本下):
进入SE19,选择Create Implementation中的Classic BADi,输入刚才查找到的EXIT_NAME;
点击Create
Impl,输入实现名;
点绿勾;
点击保存,激活(如果是ECC6.0版本,则还需要指定对应的Enhancement Spot,才可以完全创建成功。
双击进入方法CHANGE_SEGMENT_PSEGMENT,即可在里面实现功能;
下面再运行F-02,执行程序,即可进入此段代码。
(2)通过st05跟踪,badi对应的数据表为SXS_INTER,
SXC_EXIT, SXC_CLASS 和 SXC_ATTR,而这些表都是通过视图V_EXT_IMP
和 V_EXT_ACT来查询的。
1、打开运行事务码: ST05 选择“table buffer trace”而不是常用的"SQL trace"
2、activate trace(开始跟踪)
3、运行事务码:me21n
4、创建一个采购订单,保存
5、deactivate trace(结束跟踪)
6、点击display trace,在出来的选择条件中: objects中输入:V_EXT_IMP和V_EXT_ACT;在
operations中输入“OPEN”
7、查询
通过查询的结果可以看出,视图V_EXT_IMP的BADI的接口类名字都是以IF_EX_开头的,其中IF_EX_之后的就是对应BADI接口的定义。
相关资源:BADI出口增强查找方法_abap查找增强函数资源-CSDN文库
————————————————
版权声明:本文为CSDN博主「weixin_39916379」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39916379/article/details/111740248