分类:
2010-11-26 11:16:37
一介绍
用户增强: 所有的Enhancement在表MODSAP,用户增强大概有三类
MODSAP是Enhancement表, 而TFDIR是看是否此enhancement被激活,就看字段MAND是否是”C”而已
1. E Enhancement exits :就是常说的写User_exit ,经常使用
2. C GUI codes 没用过
3. S Subscreens 屏幕增强
什么叫用户出口呢?打个比方说吧,SAP软件就象一根晾衣服的绳子,上面有数不清的衣架,多数衣架上已经挂上了衣服,就些衣服就SAP的标准程序,还有些衣架是空着的,这些就是“用户出口”,你可以把自己做的衣服(比如程序代码)挂到这些衣架上去--如果你觉得SAP给你准备的衣服不够穿或者不合身的话。
使用用户出口可以:
-不影响标准SAP源代码
-不影响软件升级
SAP有四种基本用户出口的类型:
1.菜单出口-Menu Exits
定义自己的菜单
2.屏幕出口-Screen Exits
定义自己的屏幕
3.功能模块出口-Function Module Exits
在SAP应用程序中添加功能
4.关键字出口-Keyword Exits
在ABAP/4字典中的关键字数据元素添加文档。结果是你在使用这些数据元素的字段处按F1后会出现你自定义的说明文档
要编辑用户出口,必须有SAP授权的开发权限,另外,除了关键字出口外,其他的出口都需要有一定的ABAP/4编程能力.
用户出口类型:
sap的用户出口总共有三代:
1、第一代
sap提供一个空代码的子过程,在这个子过程中用户可以添加自己的代码,控制自己的需求。这类增强都需要修改sap的标准代码。--这个是最原始的产品增强技术.
2、第二代
sap提供的是CUSTOMER-FUNCTION,它是通过SMOD和CMOD完成实现。--比较类似插件接口了.
3、第三代
sap提供的第三代的用户出口就是BADI,他的调用方式是CALL METHOD (instance),(相关的TCODE是SE18和SE19),你可以通过EXIT_HANDLER这个单词查找BADI。--预留空实现类的方式,支持用户或伙伴去扩展
二。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用户增强总结(3)-采购订单建立增加客户数据增强示例
2008年09月08日 星期一 17:14
命令:smod 选择增强号MM06E005,点击测试。 出现如下: MM06E005 1.功能退出:分别是代码区,包括pbo,pbi等。 2.Screen exit:创建增强屏幕 3.包含表:增强表字段结构 第一步:增强结构CI_EKKODB,在包含表CI_EKKODB上双击,然后新增增强字段。新增字段必须以ZZ开头。ZZOPENDATE。如果要增强行项目,双击CI_EKPODB。 第二步:增强屏幕显示,在Screen exit中,双击要增强的SAPMM06,如下: PROCESS BEFORE OUTPUT. MODULE STATUS_0101. * PROCESS AFTER INPUT. * MODULE USER_COMMAND_0101. 进入以后即可绘制屏幕显示,查找要显示的CI_EKKODB中的字段显示到屏幕上。查找字段(f6),输入表或字段名(ekko_ci),找到显示的字段。 双击STATUS_0101编程: MODULE STATUS_0101中编程:(更新字段编辑状态) IF displaymode = 'A'. LOOP AT SCREEN. IF screen-name = 'EKKO_CI-ZZOPENDATE'. screen-input = '0'. MODIFY SCREEN. ENDIF. ENDLOOP. ENDIF. 第三步:编程 在功能退出去,双击EXIT_SAPMM06E_006,进入 INCLUDE ZXM06U36 ,即Pbo中增加如下代码(显示和更新编辑状态) ekko_ci = i_ci_ekko. displaymode = i_trtyp. 双击 EXIT_SAPMM06E_007,进入 INCLUDE ZXM06U38 ,即 Pbi中(保存数据) MOVE-CORRESPONDING i_ekko TO gl_ekko_ci. 双击 EXIT_SAPMM06E_008,进入 INCLUDE ZXM06U37 ,即 Import Data from Customer Subscreen for Purchasing Document Header中(修改后提示保存) IF gl_ekko_ci-zzopendate NE ekko_ci-zzopendate. e_ci_ekko-zzopendate = ekko_ci-zzopendate. IF displaymode NE 'A'. e_ci_update = 'X'. ENDIF. ENDIF. 也可以是所有字段: if gl_ekko_ci ne ekko_ci. e_ci_ekko = ekko_ci. if displaymode ne 'A'. e_ci_update = 'X'. endif. endif. 然后逐个激活即可。 SAPMM06E 0101 CUSTSCR1 SAPLXM06 0101 "Header SAPMM06E 0111 CUSTSCR1 SAPLXM06 0111 "Item EXIT_SAPMM06E_006 Header (PBO) EXIT_SAPMM06E_007 Header (PAI) EXIT_SAPMM06E_008 Import Data from Customer Subscreen for Purchasing Document Header EXIT_SAPMM06E_016 Item (PBO) EXIT_SAPMM06E_017 Item (PAI) EXIT_SAPMM06E_018 Import Data from Customer Subscreen for Purchasing Document Item |