SAP用户增强总结

SAP用户增强总结(1)

20xx年09月08日 星期一 16:58

一。

用户增强: 所有的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用户增强总结(2)

20xx年09月08日 星期一 17:00

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. SAP用户增强总结(3)-采购订单建立增加客户数据增强示例

20xx年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

SAP用户增强总结(4)- SAP用户登录增强示例

20xx年09月08日 星期一 17:16

* Transaction CMOD -> Utiliteis -> SAP Enhancements

* Exit Name SUSR0001

* Double click EXIT_SAPLSUSF_001

* Double click ZXUSRU01

* Insert -> include zsesschk.

*

* zsesschk limits the number of login sessions per user

* in a certain client

* It runs from user exit SUSR0001 after the SAP Login

* n-1 is the number of concurrent sessions allowed

TABLES: UINFO.

DATA: N TYPE I VALUE 2. "Upper limit of login sessions DATA: OPCODE TYPE X VALUE 2, I TYPE I, A(60).

DATA: BEGIN OF BDC_TAB1 OCCURS 5.

INCLUDE STRUCTURE BDCDATA.

DATA: END OF BDC_TAB1.

DATA: BEGIN OF USR_TABL OCCURS 10.

INCLUDE STRUCTURE UINFO.

DATA: END OF USR_TABL.

* Exclude Limit login by Users

IF SY-UNAME <> 'XXX'

AND SY-UNAME <> 'XXX'.

CALL 'ThUsrInfo' ID 'OPCODE' FIELD OPCODE

ID 'TAB' FIELD USR_TABL-*SYS*.

LOOP AT USR_TABL.

IF SY-UNAME = USR_TABL-BNAME AND SY-MANDT = USR_TABL-MANDT. I = I + 1.

ENDIF.

ENDLOOP.

IF I >= N.

A = 'You have already '.

A+17(2) = I - 1.

A+19(25) = 'login sessions in client '.

A+44(4) = SY-MANDT.

CALL FUNCTION 'POPUP_TO_INFORM'

EXPORTING

TITEL = 'UNSUCCESSFUL LOGIN'

TXT1 = A

TXT2 = 'You are not allowed to log in'. MOVE: 'SAPMSSY0' TO BDC_TAB1-PROGRAM,

'120' TO BDC_TAB1-DYNPRO,

'X' TO BDC_TAB1-DYNBEGIN.

APPEND BDC_TAB1.CLEAR BDC_TAB1.

MOVE: 'BDC_OKCODE' TO BDC_TAB1-FNAM,

'/nex' TO BDC_TAB1-FVAL.

APPEND BDC_TAB1.CLEAR BDC_TAB1.

CALL TRANSACTION 'SM04' USING BDC_TAB1 MODE 'N'.

ENDIF.

ENDIF.

相关推荐