sap的用户出口总共有三代:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值