■ SAP 如何寻找增强?
方法一:使用TCODE寻求增强(第二代增强)
执行程序(源代码后附),在选择屏幕时输入需要增强的程序TCODE,执行后,会有一个关于如何增强这一点的列表。SMOD增强。
点击进去,手动寻找增强需求。
这是第二代增强
方法二:利用系统函数寻找
MODX_FUNCTION_ACTIVE_CHECK
在这个FUNCTION添加断点的代码。需要加强执行TCODE,如果有增强,它会自动跳入DEBUG界面。在DEBUG界面,查看f_tab 显示在这里的字段Smod关于这个TCODE所有增强项目清单。都属于这些增强EXIT_XXXXXX_XXX这种形式。
至于如何查看这个增强属于哪个SMOD,可以自己查阅 MODSAP这个表(SAP Enhancements).
这是第二代增强。
还有一些FUNCTION供参考:
[1].DYNP_VALUES_READ
[2].MODX_ALL_ACTIVE_MENUENTRIES(菜单增强)
[3].MODX_FUNCTION_ACTIVE_CHECK(出口函数增强)
[4].MODX_MENUENTRY_ACTIVE_CHECK(菜单增强)
[5].MODX_SUBSCREEN_ACTIVE_CHECK(屏幕增强)
与上述一样,这些使用方法可以根据各种情况进行增强。
方法三:从程序代码中找
打开需要增强的事务SYSTEM——》status,双击进入PROGRAM,查看所有的subroutines, 关注所有形似 userexit_******* 这种需要通过描述来增强FORM。这是第一代的增强。
方法四:针对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 用户增强可以通过实现接口来实现。
****************************************************************************************************************************************************************************************************
首先,让我们解释什么是出口。顾名思义,这是一个必须执行到最后的程序。
为什么会有出口?由于正常的业务系统不能满足实际需求,可以在出口中添加一些功能来满足要求,这就是为什么它也被称为增强。我觉得它类似于给操作系统补丁。
在Sap中出口是标准程序最终调用的函数或功能模块,该函数或功能模块的输入已经通过Sap定义好。自己写SAP如果在系统升级时更改标准程序,则保留出口程序SAP当系统升级时,它将被覆盖。以下是何时使用出口和出口的类型:
- 在业务检查中,如在工厂发货,只能使用某种移动类型,可以设置在某个仓库位置。
- 当界面需要增强时,例如,用户需要大写字段,但最终用户不按规范操作,这也可以在出口中自动转换。一些模块甚至可以定制数据库字段,并在出口中添加字段输入。其他模块可以检查输入数据,甚至实现自动替换。
- 如果有不规则的业务,如根据某些条件定价,可以根据某些条件设置自己定义的表格
- 可用于搜索帮助的出口Sap标准搜索有助于控制权限。
等等。
■ SAP基本用户出口有四种类型
1.菜单出口-Menu Exits
定义自己的菜单
2.屏幕出口-Screen Exits
定义你的屏幕
3.出口功能模块-Function Module Exits
在SAP应用程序中添加功能
4.关键字出口-Keyword Exits
在ABAP/4字典中的关键字数据元素添加文档。因此,您按下使用这些数据元素的字段F1之后会有你自定义的解释文档
因为出口是被子Sap如何提前找到自己需要的出口?
- 有助于配置文档SAP library 寻找业务系统的出口,sap library 在‘implementation guide在配置功能执行按钮的左侧通常有一个描述文档来描述相关的出口。
- 为了方便我们在文章后面列出所有的出口名称和描述。
**************************************************************************************************
■ 下面具体介绍如何写出口程序:
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的可能没有提供的功能(通过后台配置也不能实现).
- E Enhancement exits :就是常说User_exit (用户出口)
使用SE37搜索EXIT*的函数大都是做exit用的,通常里面预包含了一个Z开头
的程序. SE16查询TFDIR(函数表)输入EXIT*也可.
- C GUI codes( GUI接口增强)
- 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’,用程序也可.
****************************************************************************************************************************************************************************************************
■ 项目增强和Badi增强
ABAP必备知识之一。在SAP标准程序中加入用户定义的功能,以实现SAP标准程序的功能增强。原先流行用项目增强:User Exit或Customer Exit(前者的开发需要Access Key,后者不必);现在流行使用Badi增强。
一、项目增强
1、关于项目增强的简单介绍
1.1 SMOD包含具体的增强,而CMOD是包含一组SMOD编写的增强.
1.2 Customer Exits (Function module exits)是sap提供出口,它的命名规则如下:
EXIT_>program name<>3 digit suffix<
示例:
sd的VA01事务,对应的程序是SAPMV45A ,你会在程序里查到(用CALL CUSTOMER-FUNCTION、
CALL CUSTOMER-SUBSCREEN字符串)如下代码:
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将增强项目激活,便大工告成。
如何查找
*判断是否存在相应增强的定义(SMOD)
select single name
from modsapa
into mod0-name
where name = 'PPCO0002'.
if sy-subrc = 0.
endif.
select single *
from tadir
into ps_tadir_db
where pgmid = 'R3TR'
and object = 'SMOD'
and obj_name = 'PPCO0002'.
*判断是否存在相应增强项目的定义(CMOD)
SELECT SINGLE name FROM MODATTR into mod0-name
WHERE NAME = 'PPCO0002'..
*提取增强的定义的组件 (可以用此反查增强定义)
select * from modsap
where name = 'PPCO0002'.
*判断该增强是否移植到BADI实现
*Enhancement & has already been migrated in Business Add-In definition
select single migrated badi_def into (migrated, exit_name)
from modsapa where name = modname.
if sy-subrc = 0 and migrated = seex_true.
message s621 with modname exit_name.
check mode ne 'CHAM'.
endif.
MODTYP 类型:
E : 功能退出
S : 屏幕
T : 表
C : GUI代码
sap增强存在MODSAP表内
*获取增强组件的参见函数MOD_SAP_MEMBER_TEXT
*获得退出功能模块的信息
select single * from tftit
where "SPRAS" = '1' AND "FUNCNAME" = 'EXIT_SAPLCORE_001'
if sy-subrc = 0.
endif.
*值得学习的函数
MOD_KUN_ACTIVATE(会操作相关报表)
二、Badi增强
根据面向对象的概念,由执行类Class Interface来实现功能增强
新建Badi过程:
1、查标准程序,搜关键字“type ref to”,找出Interface
2、根据找到的Interface,并找出其标准的Class Interface,并确定其Method
3、在SE24中创建新的Class Inteface,参照先前的Class Interface和Method创建,并在新
的Method中写入自己的代码
4、在SE18中创建Project Definition,选择查出的Interface,保存并激活
5、在SE19中创建Implementation Definition,选择刚才创建的Project Definition和新创建
的Class Interface,保存并激活。
附: 增强查找ABAP代码
REPORT ZTEST_USER_EXIT .
TABLES : TSTC, "SAP Transaction Codes
TADIR, "Directory of Repository Objects
MODSAPT, "SAP Enhancements - Short Texts
MODACT, "Modifications
TRDIR, "System table TRDIR
TFDIR, "Function Module
ENLFDIR, "Additional Attributes for Function Modules
TSTCT. "Transaction Code Texts
DATA : JTAB LIKE TADIR OCCURS 0 WITH HEADER LINE.
DATA : FIELD1(30).
DATA : V_DEVCLASS LIKE TADIR-DEVCLASS.
PARAMETERS : P_TCODE LIKE TSTC-TCODE OBLIGATORY.
SELECT SINGLE * FROM TSTC WHERE TCODE EQ P_TCODE.
IF SY-SUBRC EQ 0.
SELECT SINGLE * FROM TADIR WHERE PGMID = 'R3TR'
AND OBJECT = 'PROG'
AND OBJ_NAME = TSTC-PGMNA.
MOVE : TADIR-DEVCLASS TO V_DEVCLASS.
IF SY-SUBRC NE 0.
SELECT SINGLE * FROM TRDIR WHERE NAME = TSTC-PGMNA.
IF TRDIR-SUBC EQ 'F'.
SELECT SINGLE * FROM TFDIR WHERE PNAME = TSTC-PGMNA.
SELECT SINGLE * FROM ENLFDIR WHERE FUNCNAME =
TFDIR-FUNCNAME.
SELECT SINGLE * FROM TADIR WHERE PGMID = 'R3TR'
AND OBJECT = 'FUGR'
AND OBJ_NAME EQ ENLFDIR-AREA.
MOVE : TADIR-DEVCLASS TO V_DEVCLASS.
ENDIF.
ENDIF.
SELECT * FROM TADIR INTO TABLE JTAB
WHERE PGMID = 'R3TR'
AND OBJECT = 'SMOD'
AND DEVCLASS = V_DEVCLASS.
SELECT SINGLE * FROM TSTCT WHERE SPRSL EQ SY-LANGU AND
TCODE EQ P_TCODE.
FORMAT COLOR COL_POSITIVE INTENSIFIED OFF.
WRITE:/(19) 'Transaction Code - ',
20(20) P_TCODE,
45(50) TSTCT-TTEXT.
SKIP.
IF NOT JTAB[] IS INITIAL.
WRITE:/(95) SY-ULINE.
FORMAT COLOR COL_HEADING INTENSIFIED ON.
WRITE:/1 SY-VLINE,
2 'Exit Name',
21 SY-VLINE ,
22 'Description',
95 SY-VLINE.
WRITE:/(95) SY-ULINE.
LOOP AT JTAB.
SELECT SINGLE * FROM MODSAPT
WHERE SPRSL = SY-LANGU AND
NAME = JTAB-OBJ_NAME.
FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
WRITE:/1 SY-VLINE,
2 JTAB-OBJ_NAME HOTSPOT ON,
21 SY-VLINE ,
22 MODSAPT-MODTEXT,
95 SY-VLINE.
ENDLOOP.
WRITE:/(95) SY-ULINE.
DESCRIBE TABLE JTAB.
SKIP.
FORMAT COLOR COL_TOTAL INTENSIFIED ON.
WRITE:/ 'No of Exits:' , SY-TFILL.
ELSE.
FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
WRITE:/(95) 'No User Exit exists'.
ENDIF.
ELSE.
FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
WRITE:/(95) 'Transaction Code Does Not Exist'.
ENDIF.
AT LINE-SELECTION.
GET CURSOR FIELD FIELD1.
CHECK FIELD1(4) EQ 'JTAB'.
SET PARAMETER ID 'MON' FIELD SY-LISEL+1(10).
CALL TRANSACTION 'SMOD' AND SKIP FIRST SCREEN.