SAP ENHANCEMENT

本文详细介绍了SAP的用户出口分为第一代、第二代和第三代,并提供了查找和激活增强方法。其中包括如何通过SE30、SE37、SE18等事务代码和表TFDIR、MODSAP来查找和激活用户出口。此外,文章还讲解了如何通过BADI(Business Add-In)实现更高级的增强,并提供了相关函数和表的介绍。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.sina.com.cn/s/blog_5ccd375b0100kgqb.html

sap的用户出口总共有三代: 
1、第一代 
sap提供一个空代码的子过程,在这个子过程中用户可以添加自己的代码,控制自己的需求。这类增强都需要修改sap的标准代码。 
示例:USEREXIT.. in SAPMV45A

2、第二代 
sap提供的是CUSTOMER-FUNCTION,它是通过SMOD和CMOD完成实现。

3、第三代 
sap提供的第三代的用户出口就是BADI,他的调用方式是CALL METHOD (instance),(相关的TCODE是SE18和SE19),可以通过EXIT_HANDLER这个单词查找BADI。

对于第一代增强,可以用以下方法查找增强:
打开欲增强的程序,点击工具栏上的“Display Object List”按钮,选择Subroutines,查找以“UserExit”开头的子程序,根据子程序前面的注释文档来查找用户出口

对于第二代增强,可以用以下方法查找增强

用户增强通常包括下面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就会调用此函数. 
[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’,用程序也可.


************同仁查找EXIT的方法****************

***方法一****************************************

通过SE30,运行TCODE后,点Evaluate后,查看运行时间分析评估:命中清单。

找以“exit”开头的SAP程序,如:EXIT_SAPLIE01_007,

这个FUNCTION就是TCODE提供的一个出口。

至于如何查看这个增强是属于哪个SMOD,能够查阅 MODSAP这个表(SAP Enhancements). 


以上的增强是第二代增强。 

***方法二****************************************

通过SE37中的:MODX_FUNCTION_ACTIVE_CHECK 函数来找,

在函数的最后一行打个断点,再运行TCODE的,如果有增强则会跳入DEBUG界面,在DEBUG界面中,查看L_FUNCNAME字段对应的值,此值就是就是要找的出口,

再去SE11中通过MODSAP来查看出口对就的是那个SMOD,

接下来就可以在CMOD中创建增强组了,把找到的增强填入,

最后根据实际的业务进行处理。


***方法三****************************************

找BADI的方法。

先运行SE24,查看类对象CL_EXITHANDLER, 在其方法:GET_INSTANCE的14行( CALL METHOD CL_EXITHANDLER=>GET_CLASS_NAME_BY_INTERFACE)打上一个断点。

接下来运行事务代码,当有BADI是将会被执行,这时在DEBUG模式下,会进入类CL_EXITHANDLER 的GET_INSTANCE 方法,按F6执行这个方法之后,点参数EXIT_NAME查看其对应的值,所有的方法实现都在此类对象中,此时就是我们所要找的BADI。

实现BADI的方法

进入SE19,选择Create Implementation中的Classic BADi

另一种方法(跟上面的差不多)

查找源程序,在程序中查找代码段 CL_EXITHANDLER => GET_INSTANCE

就可以找到该程序所用到的BADI。


*******************************************

针对BADI的增强

1、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 实现接口就可以实现用户增强。

现在很多朋友使用 BAPI 都处于一种 google 的状态,就是说只能在网上搜索到相关的函数和调用方法,却难以跟实际业务对应起来,这对应付眼前开发是足够了,但是换个需求换个业务,又得抓瞎。

大家都有一个疑问,我知道的这个 BAPI 函数究竟属于哪个业务对象呢?今天我们就来揭密。

BAPI 函数跟业务对象的关系存储在表 SWOTLV 中,对于一个业务对象,除了函数外,还存储了一些其它信息,我们这里先不管它。这个表的 ABAPNAME 字段存储的就是函数名称,而 LOBJTYPE 字段则存储


你还在狡辩,再给你完整SAP note 1854763: Symptom Material number or Quantity is not updated in FI document because you have set up summarization procedure from the documents coming from MM module. Environment Financial Accounting (FI) SAP ERP SAP ERP Central Component SAP enhancement package for SAP ERP SAP enhancement package for SAP ERP, version for SAP HANA SAP R/3 SAP R/3 Enterprise SAP S/4HANA Finance SAP S/4HANA Reproducing the Issue Create MM document BSEG-MATNR or BSEG-MENGE in accounting document is not updated Cause Please have a look at the reference procedure of the affected FI document (-> BKPF-AWTYP), and have a look at transaction OBCY, whether a summarization is defined in FI for this reference procedure (AWTYP). If field BSEG-MATNR, BSEG-MENGE etc. is contained in transaction OBCY for this reference procedure (AWTYP), the content in field BSEG-MATNR is deleted in FI for summarization reasons. Please refer to note 36353 which has very good information about summarisation. If you have summarization activated, the contents of the field are deleted in every document for the respective reference procedure and the document line items are summarized. Resolution Please check table TTYPV (in transaction OBCY): if you want to get the field material, quantity etc. in the accounting document, this field must NOT be in the table TTYPV, because FI is deleting all fields of TTYPV to make the summarization. First please remove the material field from the table TTYPV so that it can pass from MM to FI. For the historical data, please first add a document change rule to make the field BSEG-MATNR, BSEG-MENGE etc. modifiable by path SPRO -> FI ->Global Settings -> Document -> Line item -> Controls -> Document change rule. Then make sure it is visible in the line item and add it to the posted documents.
最新发布
08-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值