ABAP 用户出口

ABAP 用户出口

🎯 用户出口概述

用户出口(User Exits)是SAP系统中用于==增强标准功能==的机制。当标准SAP提取器不提供期望的数据或所需的功能时(例如在授权或时间检查中),可以使用用户出口。

用户出口通常用于==销售和分销(SD)模块==。SAP在销售、运输和计费领域提供了许多用户出口。



graph TD
    A[SAP标准程序] --> B{是否满足需求?}
    B -->|是| C[直接使用]
    B -->|否| D[使用用户出口]
    D --> E[自定义修改]
    E --> F[增强后的功能]

访问用户出口

要访问每个销售区域中可用的退出,使用以下路径:

IMG → Sales and Distribution → System Modifications → User Exits

SD区域中每个出口的文档将在此详细解释。

💡查找销售凭证处理的用户出口
如果要在销售凭证处理(合同、报价或销售订单)中查找用户出口,请按照上述路径继续展开 Sales → User Exits。单击文档图标以查看销售凭证处理中提供的所有用户出口。

📋 主要用户出口类型

编号 用户出口名称 说明
1 USEREXIT_FIELD_MODIFICATION 用于修改屏幕属性
2 USEREXIT_SAVE_DOCUMENT 在用户点击保存时执行操作
3 USEREXIT_SAVE_DOCUMENT_PREPARE 检查输入字段、显示弹出式窗口并确认文档
4 USEREXIT_MOVE_FIELD_TO_VBAK 将用户标题更改移动到标题工作区
5 USEREXIT_MOVE_FIELD_TO_VBAP 将用户项目更改移动到SAP项目工作区

🔍 用户出口的特点

特征 说明
功能范围 功能与客户出口相同,但==仅适用于SD模块==
实现方式 退出实现为对==函数模块==的调用
本质 用户出口是对==SAP标准程序的修改==
⚠️注意
用户出口主要是对SAP标准程序的修改,修改时需要特别谨慎,确保不影响标准功能的正常运行。

💡 示例:查找用户出口

以下程序用于查找指定事务代码中的用户出口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
REPORT zuserexit1.
TABLES:
tstc,
tstct,
tadir,
trdir,
tfdir,
enlfdir,
modsapt,
modact.
DATA:
jtab LIKE tadir OCCURS 0 WITH HEADER LINE,
field1(30),
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 = 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) 'User Exit doesn''t exist'.
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.

执行示例

处理时,输入事务代码 ME01,然后按 F8(执行)按钮。

💥使用方法
  1. 运行程序,输入要查询的事务代码
  2. 按 F8 执行
  3. 程序会列出该事务代码关联的所有用户出口
  4. 点击出口名称可跳转到 SMOD 进行查看

🏗️ SAP增强技术对比



graph TD
    A[SAP增强技术] --> B[用户出口<br>User Exit]
    A --> C[客户出口<br>Customer Exit]
    A --> D[BADI<br>Business Add-In]
    B --> B1["仅SD模块<br>修改标准程序"]
    C --> C1["模块化增强<br>函数模块调用"]
    D --> D1["面向对象<br>可多次实现<br>支持过滤器"]

特征 用户出口 客户出口 BADI
适用范围 主要SD模块 所有模块 所有模块
实现方式 修改标准程序 函数模块调用 类的接口实现
可实现次数 一次 一次 多次
SAP版本 R/3 R/3 ECC 6.0+

⚠️ 注意事项

  1. 用户出口主要用于==SD模块==,但也可在其他模块中使用
  2. 修改用户出口需要==谨慎操作==,以确保不影响标准功能
  3. 建议在修改前==备份相关代码==
  4. 用户出口的修改需要==适当的授权==
  5. 新项目建议优先使用 ==BADI== 替代用户出口