作者:SAP169
用户增强大致分为三类
1. E Enhancement exits 就是常说的 USER_EXIT.
2. C GUI Code.
3. S Subscreens 屏幕增强.
1. 菜单出口-Menu Exits
定义自己的菜单
2. 屏幕出口-Screen Exits
定义自己的屏幕.
3. 功能模块出口-Function Module Exits
在SAP应用程式中添加功能
4. 关键字出口-Keyword Exits
在ABAP/4字典中的关键字数据元素添加文档. 结果是你在使用这些数据元素的字段处按F1后会出现你自定义的说明文档.
用户出口的发展:
第一代: 基于源代码的增强:
需要申请 access key 才能更改.
查找此类出口的方法:
1. 在增强程序中查找第二个字母为"Z"的包含程序.
2. 通过开发类来查找基于源码的用户出口
该类增强大部分都包含在开发类VMOD中, 可通过 SE80 查找该类包含的对象.
3. 在后台找对应模块的增强.
4. 在程序中查找以 USEREXIT_ 开头的关键子程序.
第二代: 基于函数模块的增强:
用 SMOD 和 CMOD 维护.
SMOD 包含具体的增强,而 CMOD 是包含一组SMOD编写的增强.
与增强相关的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 菜单文本增强)
所有的 Enhancement 在表 MODSAP 中, 而表TFDIR是看此 Enhancement 是否被激活, 看字段MAND是否为"C".
第二类增强主要有3类.
1. E类, Enhancement Exits,也叫功能出口.
函数名称由三个部分组成, 其命名规则为: EXIT_<程序名>_<3位数字>, 在程序中通过引用代码
"CALL CUSTOMER-FUNCTION <3位数字>"来调用.
一个函数只会对应一个出口,但一个出口对象可以对应多个函数.
例如:V45A0003会同时对应 EXIT_SAPMV45A_003, EXIT_SAPMV45A_004两个函数.
在 MODSAP, MODSAPT 两个表中存放函数和出口的关系及出口对象的描述.
查寻此类出口的方法:
1. 利用系统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(屏幕增强)
SE37 进入上面Function后, 设定断点, 如图
运行Tcode, 如果有出口程式就会自动进入Debug画面,
观察L_FUNCNAME , 得到出口函数后, 可以在Table MODSAP 中查到出口对象.
先通过源码找到函数, 再通过函数来查找出口对象.
以 MB1C 为例,
得到这些 Number 后, 用通常的出口结构 EXIT_SAPMM07M_
001/005/009,
再用 SE37 进去查看, 通过参数,说明等找出准确的出口.
3. 通过包名查找.
先得到源程序名, 用SE38再获取包名.
还以 MB1C 为例:
执行 SMOD
根据描述找出需要的Exit.
4. 通过SE80 查找.
5. 通过编写程式查找.
*&---------------------------------------------------------------------*
*& Report Z_EXIT_HELP
*&
*&---------------------------------------------------------------------*
REPORT z_exit_help
.
TABLES
: tstc
, tadir
, modsapt
, modact
, trdir
, tfdir
, enlfdir
.
TABLES
: tstct
.
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
.