SAP-R/3 出口(增强) <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

首先来讲解一下什么是出口,顾名思义,就是一段程序执行到最后必经的一段程序。

为什么会有出口呢?因为正常的业务系统不能满足实际需求,这时可以在出口中增加一些功能,来达到要求,这也就是为什么它还叫增强。我感觉它跟给操作系统打补丁差不多。

Sap 中出口就是标准程序最后要调用的一个函数或者功能模块,这个函数或功能模块的输入已经由 Sap 定义好。

 

    自己写的 SAP 出口程序在系统升级的时候会被保留,而如果更改标准程序在 SAP 系统升级的时候会被覆盖。

 

    下面介绍一下什么时候需要使用出口以及出口的种类:

       1 :在业务检查时,比如在某个工厂发货,可以设定在某个库位的出货只能使用某种移动类型。

       2 :在需要界面增强时,比如用户对某个字段要求大写,但是最终用户不按规范操作,这也可以在出口中自动转换,有些模块甚至能自定义数据库字段,并且可以在出口中增加字段输入。还有的模块能对输入数据检查,甚至实现自动替代等功能。

       3 :有不规则业务时,比如按某种条件定价,可以设定从自己定义的表中按某种条件取值

       4 :搜索帮助的出口,可以对 Sap 标准的搜索帮助做权限控制。

等等。

SAP 有四种基本用户出口的类型:

1. 菜单出口 -Menu Exits

        定义自己的菜单

2. 屏幕出口 -Screen Exits

  定义自己的屏幕

3. 功能模块出口 -Function Module Exits

  SAP 应用程序中添加功能

4. 关键字出口 -Keyword Exits

ABAP/4 字典中的关键字数据元素添加文档。结果是你在使用这些数据元素的字段处按 F1 后会出现你自定义的说明文档

 

    因为出口都是被 Sap 预先定义好的,那么怎么寻找自己需要的出口呢?

1 :可以通过配置文档的帮助和 SAP library 寻找业务系统的出口, sap library 在‘ implementation guide ’中寻找出口,在配置功能执行按钮左边一般都有一个说明文档,描述相关的出口。

 

2 :为了方便我们把所有的出口名称及其描述列在文章的后面。

下面具体介绍怎样写出口程序:

为了对出口程序的修改进行管理, sap 提供了专门用来管理出口程序的事务,事务代码是 CMOD

 

 

 

 

 

 

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’, 用程序也可 .)
the third generation enhancement  will be discussed in the next post.