转自http://blog.csdn.net/lyb_yt/article/details/8177974

(一)什么是增强(Enhancement)?

简单地说,增强就是ERP系统中标准程序的出口,在该出口中由用户根据企业实际需求编写客户化逻辑代码。增强是ERP系统设计时考虑到企业实际的流程有可能和系统默认标准流程不同,在标准流程框架下专门留的接口,每个接口对应一个客户化函数,这些出口函数有标准处理程序传入的参数和输出参数,用户可根据系统输入参数做条件编写适合本企业流程的逻辑,然后通过输出参数传输回。

(二)用户增强分类

SAP的用户增强通常包括下面3类。

1.E类:Enhancement exits,即通常所谓的用户出口(User_exit )

用户出口也叫功能出口(Function Exit)。

使用Tcode:SE37搜索EXIT*,找到的函数大都是做系统预留的出口函数,前面说过,用户出口是标准程序留给用户的接口,标准程序通常不允许用户任意修改,如果修改需要申请Access Key,而且修改标准程序可能导致的错误ERP公司通常是不负责的。在SAP中,自定义的程序通常以保留字Y或Z开头,因此,出口函数中都预包含了一个Z开头的程序。

2.C类:GUI接口(GUI codes)

3.S类:屏幕增强(Screen Exit)

比如,在建立采购订单,工单和固定资产主数据时,系统都预留屏幕增强,也就是说允许用户自定义用户输入界面并编写相应的输入输出处理程序。

在各类增强中,可能还用户自己定义结构或表格,系统对应类型T类。比如增强MM06E005

允许用户建立两个结构CI_EKKODB和CI_EKPODB。

接下来将重点介绍功能出口的应用。

(三)组织用户增强

相关增强表格:

MODSAP:增强表格

TFDIR:包括出口函数在内的所有函数表(E类)

CUATEXTS:修改 GVI 界面,界面: 菜单文本被客户(C类)
TSDIR:动态程序区 CALL CUSTOMER SUBSCREEN(S类)

对于以EXIT开头的出口函数,TFDIR-MAND值为C表示此出口函数被激活。

相关增强检查函数:

MODX_FUNCTION_ACTIVE_CHECK:检查E类用户出口是否被激活。

MODX_MENUENTRY_ACTIVE_CHECK:检查C类增强激活状况

MODX_SUBSCREEN_ACTIVE_CHECK: 检查S类增强激活状况

你可能会发现,SAP的各模块的任何一个事务码(Tcode)对应的标准程序都留下了大量的用户出口,正是SAP灵活的配置功能和强大的用户出口才使其产品轻松应对各种复杂需求成为可能,系统还为能快速找到和激活这些增强进行了有效组织,各类增强被记录在table中并且提供了相关检查函数,从而更方便企业用户。

熟悉ABAP开发的朋友通常都收集了一个可以输入事务码快速找到系统留下的所有出口的程序,下表就是一个检测系统增强被激活的简单参考程序。

* 该程序可以检测出系统所有被激活的用户增强.

*  By Stone Fu. on 2006/11/07 .

*  Used to find out all the activated user-exit of SAP .

report zfindactexit .

tables: modsap,tfdir.

data : begin of itab_exit  occurs 0,

funcname like tfdir-funcname,

mand like tfdir-mand,

name like modsap-name,

end of itab_exit .

data : field1(30).

select a~funcname a~mand b~name

into table itab_exit

from tfdir as a

inner join modsap as b

on a~funcname = b~member

where a~mand = 'C'

and a~funcname = b~member .

format color col_heading intensified on.

write:/1 sy-vline,

2 'Enhancement Name',

21 sy-vline ,

22 'Activated Exit Function',

95 sy-vline.

write:/(95) sy-uline.

loop at itab_exit.

format color col_normal intensified off.

write:/1 sy-vline,

2 itab_exit-name hotspot on,

21 sy-vline ,

22 itab_exit-funcname,

95 sy-vline.

endloop.

at line-selection.

get cursor field field1.

set parameter id 'MON' field sy-lisel+1(10).

call transaction 'SMOD' and skip first screen.

有一种直接有效的查找用户出口增强的方法,就是使用函数MODX_FUNCTION_ACTIVE_CHECK,如图1

500)this.width=500;" border=0>

图1中的判断语句If tfdir-mand = aktiv_flag(常数C)则出口函数active标志=’X’,表示该用户出口被激活,处理逻辑将从标准程序转入出口函数,在该语句设置断点然后运行任一个事务码,都会调用该函数判断是否存在用户出口。

(四)增强应用实例

业务背景:如果采购订单已经做了发票校验后,则不再允许用户修改价格。

相关程序:MM06EFPO_POT_FUELLEN|MM06EF0C_CUSTSCR1_ITEM_SET_DAT

相关Tcode:SMOD|CMOD

如果没有启动采购审批功能,SAP标准功能是允许用户随时修改采购价格的,不同的企业有对采购价格控制有不同的策略,甲企业规模较小为了省事可能为以后数月的采购开了一个大采购单,如果中途材料价格变动则直接修改价格就行,乙集团则严格控制采购价格,采购价格由总部集中维护,各企业采购员只需要维护采购数量等信息等,真因如此,ERP系统显然不会去禁止用户修改价格,如果企业确实需要如此,则可通过增强实现。

前面已经介绍过如何通过在函数MODX_FUNCTION_ACTIVE_CHECK设置断点跟踪系统每个事务预留的用户出口,你很快将发现增强MM06E005EXIT_SAPMM06E_017用户出口非常适合此业务背景。

首先来看看增强的EXIT_SAPMM06E_017用户出口(以下称017出口)处理流程,Include程序MM06EFPO_POT_FUELLEN被专门用来处理增强出口,调用了子程序CUSTSCR1_ITEM_SET_DATA_

PAI(对应下一级Include程序MM06EF0C_CUSTSCR1_ITEM_SET_DAT),分析Include程序MM06EF0C_CUSTSCR1_ITEM_SET_DAT的代码,如下表,这个程序是从系统原本Copy出来的,注意本人所加的附注粗体部分:

*-----------------------------------------------------------------------

* User-Exit für Positionsfelder versorgen (PAI)

FORM custscr1_item_set_data_pai USING im_no_screen LIKE fc_call.

"770427

DATA: l_ucomm LIKE sy-ucomm,

l_enj_call TYPE c.

STATICS: first_call(1) TYPE c VALUE 'X',

active        LIKE sy-calld.

ENHANCEMENT-POINT CUSTSCR1_ITEM_SET_DATA_PAI_02 SPOTS ES_MM06EF0C_CUSTSCR1_I_SET_DAT INCLUDE BOUND .

*$*$-Start: CUSTSCR1_ITEM_SET_DATA_PAI_02-------------------------------------------------------$*$*

ENHANCEMENT 1  OI0_COMMON_MM06EF0C_ITEM_S_DAT.    "active version

* C5030897 I.Twardowski Implementation of BADI for OGSD

PERFORM OI0_BADISCR1_ITEM_SET_DATA_PAI.

ENDENHANCEMENT.

*$*$-End:   CUSTSCR1_ITEM_SET_DATA_PAI_02-------------------------------------------------------$*$*

IF NOT first_call IS INITIAL.

CLEAR first_call.

*注释: MODX_FUNCTION_ACTIVE_CHECK用来检查017出口是否被激活,如果激活则执行之.

CALL FUNCTION 'MODX_FUNCTION_ACTIVE_CHECK'

EXPORTING

cprogname  = 'SAPMM06E'

funcnumber = '017'

IMPORTING

active     = active

EXCEPTIONS

not_found  = 1

OTHERS     = 2.

IF NOT sy-subrc IS INITIAL.

CLEAR active.

ENDIF.

ENDIF.

CHECK NOT active IS INITIAL.

IF fc_vorga EQ cva_en.

l_enj_call = 'X'.

ELSE.

l_enj_call = space.

ENDIF.

*-Define Data:

DATA: lt_usr_tekpo LIKE bekpo OCCURS 0,

lt_usr_teket LIKE beket OCCURS 0,

lt_usr_tekkn LIKE ekknu OCCURS 0,

lt_usr_tkomv LIKE tkomv OCCURS 0.

*-Copy Tables:

lt_usr_tekpo[] = pot[].

lt_usr_teket[] = ett[].

lt_usr_tekkn[] = knt[].

lt_usr_tkomv[] = tkomv[].

l_ucomm = ok-code.

*注释:调用出口的一般步骤是先定义数据(Define Data),多为内表或工作区,再将参数赋予这些内表(Copy Tables),相当于*建立了原始参数的一个镜象.

*-User Exit:

*如果017出口增强被激活则执行它.

CALL FUNCTION 'EXIT_SAPMM06E_017'

EXPORTING

i_ekpo      = ekpo

i_ekpo_old  = *ekpo

i_ekko      = ekko

i_aktyp     = aktyp

i_bstyp     = ekko-bstyp

i_no_screen = im_no_screen                            "770427

i_lfa1      = lfa1

i_lfm1      = lfm1

i_rekpo     = rekpo

i_kekpo     = kekpo

i_aekpo     = aekpo

i_reban     = reban

i_mt06e     = mt06e

i_eina      = *eina

i_eine      = *eine

i_komp      = komp

i_ucomm     = l_ucomm

i_enj_call  = l_enj_call

TABLES

tekpo       = lt_usr_tekpo

teket       = lt_usr_teket

tekkn       = lt_usr_tekkn

tkomv       = lt_usr_tkomv

EXCEPTIONS

OTHERS      = 0.

ENDFORM.                    "CUSTSCR1_ITEM_SET_DATA_PAI

上面的程序代码非常简单,相信聪明的读者看了对ERP增强的设计思路会开始有一定了解。

现在你可以通俗理解,增强就是ERP设计者在合适的地点设置了一些合适的游戏规则并提供了一些有意义的游戏给用户自己玩耍!独乐乐,与人乐乐,孰乐?好玩的东西应该留点给用户自己乐呵乐呵。

接下来开始编写增强程序,可以使用Tcode:SMOD直接激活增强或CMOD建立一个项目包含一个或多个增强,如图2,输入增强MM06E005并激活它,然后在EXIT_SAPMM06E_017出口函数中编写代码。

图2中,我们发现增强MM06E005包括用户出口和屏幕增强(Screen Exit),屏幕增强允许用户在采购订单自定义用户界面,从而使采购订单包含更多企业客户化的信息,这种屏幕增强在固定资产模块中更始发挥到极致。

500)this.width=500;" border=0>

EXIT_SAPMM06E_017包含程序ZXM06U42,程序ZXM06U42示例代码如下表,这段客户化代码逻辑十分简单,为了方便说明,本人注释出该出口函数的输入参数,该出口没有输出参数,也就是说,你只能根据输入参数进行判断而不能更改任何数据:

*增强 ZXM06U42的示例代码

*By Stone.Fu   2007/01/02

*"*"Lokale Schnittstelle:

*IMPORTING/TABLES是输入的单个参数和输入的内表参数

*"  IMPORTING

*"     VALUE(I_EKPO) LIKE  EKPO STRUCTURE  EKPO

*"     VALUE(I_AKTYP)

*"     VALUE(I_BSTYP) LIKE  EKKO-BSTYP

*"     VALUE(I_NO_SCREEN)

*"     VALUE(I_LFA1) LIKE  LFA1 STRUCTURE  LFA1

*"     VALUE(I_LFM1) LIKE  LFM1 STRUCTURE  LFM1

*"     VALUE(I_EKKO) LIKE  EKKO STRUCTURE  EKKO

*"     VALUE(I_REKPO) LIKE  EKPO STRUCTURE  EKPO OPTIONAL

*"     VALUE(I_KEKPO) LIKE  EKPO STRUCTURE  EKPO OPTIONAL

*"     VALUE(I_AEKPO) LIKE  EKPO STRUCTURE  EKPO OPTIONAL

*"     VALUE(I_REBAN) LIKE  EBAN STRUCTURE  EBAN OPTIONAL

*"     VALUE(I_MT06E) LIKE  MT06E STRUCTURE  MT06E OPTIONAL

*"     VALUE(I_EINA) LIKE  EINA STRUCTURE  EINA OPTIONAL

*"     VALUE(I_EINE) LIKE  EINE STRUCTURE  EINE OPTIONAL

*"     VALUE(I_EKPO_OLD) LIKE  EKPO STRUCTURE  EKPO OPTIONAL

*"     VALUE(I_KOMP) LIKE  KOMP STRUCTURE  KOMP OPTIONAL

*"     VALUE(I_UCOMM) LIKE  SY-UCOMM OPTIONAL

*"     VALUE(I_ENJ_CALL) OPTIONAL

*"  TABLES

*"      TEKPO STRUCTURE  BEKPO OPTIONAL

*"      TEKET STRUCTURE  BEKET OPTIONAL

*"      TEKKN STRUCTURE  EKKNU OPTIONAL

*"      TKOMV STRUCTURE  KOMV OPTIONAL

*"----------------------------------------------------------------------

*判断程序代码如下:

DATA ZWATEKPO like BEKPO.

TABLES EKBE .

* 输入的内表参数TEKPO记录该采购单所有的原始旧数据 .

* 输入的I_EKPO 参数表示当前处理的PO行项目,其包含的是采购行项目的最新更新数据 .

READ TABLE TEKPO INTO ZWATEKPO   WITH KEY EBELP = I_EKPO-EBELP .

***只对ME21N/22/23才生效.

check SY-TCODE = 'ME22N ' or   SY-TCODE =  'ME22N'  or   SY-TCODE =  'ME23N' .

***EKBE是PO history 表,如有Q,R表示有发票校验历史,不允许更改价##

SELECT  SINGLE * FROM EKBE

WHERE EBELN = I_EKPO-EBELN

AND EBELP = I_EKPO-EBELP

AND ( BEWTP = 'Q' OR BEWTP = 'R' ) .

*如果SY-SUBRC =0表示发票已经校验,不允许更改价格。

CHECK SY-SUBRC = 0 .

*判断数据更改后新采购行项目的单价是否和从数据库读出的原始行项目单价一致

IF I_EKPO-NETPR <> ZWATEKPO-NETPR .

MESSAGE  E001(00) with '采购订单行项目已经进行发票校验,不再允许修改价格

ENDIF.

如果你熟悉增强,你会发现一些用户出口都会传入旧数据和更新后的新数据以方便两者比较,和财务模块的替代(Substitution)不同,ERP系统一般对增强保留严谨态度,通常只允许在出口中做检查工作,这一点类似财务模块的检查(Validation)。

(五)再次浅析增强

500)this.width=500;" border=0>
 

企业实施ERP的目的之一就是实现各部门信息共享,避免数据孤岛,以一个简单的采购收货为实例,仓库人员只要在收货时输入采购订号,收货日期,物料收货数量和仓位,系统将自动产生各模块数据,对财务数据,系统根据输入的采购订单号找到采购订单主数据中的工厂,通过在组织结构中设置的工厂和公司代码的对应关系找到相应公司代码;通过收货物料的Valuation class和收货的移动类型找到对应科目,通过收货数量*采购单价得到本次该料库存金额,通过物料主数据获得业务范围和利润中心,这样财务凭证数据自动收集完毕;如果物料采用标准价格出现采购差异并将差异科目的模认成本对象对应到获利分析段,则将数据写入利润分析模块等等;我要说的是,在这些复杂的逻辑背后,任何一个模块收集过程中存在校验,任何校验失败ERP系统都将停止业务交易,比如说校验收货日期不在物料期间或会计期间允许范围,校验失败向用户提示错误,比如预算模块找不到对应基金中心提示错误中止交易等,当所有的校验完毕,系统将数据Commit到数据库,这些校验是系统标准的,而增强则是系统预留给用户的,和系统的校验一样,在任何模块的增强中只要是出现错误都将停止本次业务交易。在图3中出现的检查/替代/增强/字段移动/推导等关键词,实际上这些东东都可看成系统增强,即使用客户化代码增强标准功能。

有趣的是,SAP的各种增强的代码编写都是极其简单的,象检查/替代/字段移动/推导/派生用户甚至只要简单将对应的源字段和目标字段拖拖拽拽关联关联就行,代码是自动生成的,即使涉及Coding也是非常简单的。神奇的是,作为SAP顾问你甚至可以对编程和数据库毫不了解,实际上很都SAP顾问的确如此,你只要专注于业务蓝图实现就行,这一点值得国内管理软件设计同行学习,在管理软件设计过程中,同样是细节决定成败。

新一代增强BADI (Tcode:SE17|SE18)

BADI(Business Add-In)是一种新的功能增强概念,它使用类、接口及方法等面向对象的概念,采用一种使用面向对象的方法来进行SAP 增强。

SAP 增强说明的更多相关文章

  1. SAP 增强-出口选找方法-全部

    ■ SAP 中如何寻找增强 方法一:利用TCODE寻找增强(第二代的增强) 执行一个程序(源代码后附),在选择屏幕处输入你所需要增强的程序TCODE,执行後,就会出现一个列表,那里就有关于如何增强这个 ...

  2. SAP增强Enhancement

    第一代:基于源码增强(子过程subroutine) 第一代增强基于源代码,是SAP提供的一个空代码的子过程.在这个子过程中用户可以添加自己的代码,控制自己的需求.这类增强集中在一些文件名倒数第二个字符 ...

  3. SAP 增强表MODSAP 和TFDIR

    2.第二代增强(基于函数模块的增强),用于SMOD和CMOD 维护 在SAP发布的版本中,使用Call customer-function 'xxx'调用函数模块的, 所以你可以通过在程序中搜索 cu ...

  4. SAP增强 和VA01相关增强点介绍

    -转 sap寻找用户出口方法 sap的用户出口总共有三代: 一.User EXIT 第一代的用户出口,它们include在SAP标准程序的源代码里,可以说他们是源代码的一部分,你改了这种出口就相当于改 ...

  5. 几种sap增强的查找方法

    ***方法一**************************************** 通过SE30,运行TCODE后,点Evaluate后,查看运行时间分析评估:命中清单. 找以“exit”开 ...

  6. SAP 增强篇 Method1 BADI增强的查找方法

    查找BADI的方法:(1)通过SE24,输入CL_EXITHANDLER,然后在方法GET_INSTANCE中设置断点,然后运行事务代码判断 exit_name的值,操作过程如下:输入se24,然后输 ...

  7. SAP增强总结-第二代增强(SMOD、CMOD)【转载】

    第二代增强比第二代增强安全性提高了很多,第一代增强毕竟是在原标准程序中修改,大部分传递参数都可以直接使用,第二代增强做了一些封装,对用户可以修改的参数做了限制. 1.增强点查找方法 首先根据事物码找到 ...

  8. 增强 用文本增强修改SAP标准屏幕中的字段名称 属于元素的文本增强

    如果想要改变标准屏幕中的字段名称,如把物料主数据基本数据元素的名字改为我们想要的名字 . 1.首先,事务MM03进入物料主数据的基本数据2视图中,将鼠标光标放在需要更改的字段“页格式”上,然后按F1键 ...

  9. SAP 4代增强

    *20170325 160000 以下之外, 还有:.替代, -用过一次:.BTE -没用过,需要学习: 第二代增强和第三代增强的差别: 1.Tcode 不同:第二代: CMOD 增强管理,SMOD ...

随机推荐

  1. [css3]文字过多以省略号显示

    text-overflow:ellipsis; 优点: 1.不用通过程序限定字数 2.有利于SEO(实际上并未被截字,只是局限于宽度未被显示而已) width: 某个值; overflow: hidd ...

  2. php中日期的加减法运算

    需求:通过对某个日期增加或减去几天,得到另外一个日期1.首先通过strtotime()获得日期的时间戳2.获得N天前得时间戳,通过”当前时间戳 - N天的秒数 = N天前得时间戳“3.对N天前得时间戳 ...

  3. Program B 暴力求解

    Given a sequence of integers S = {S1,S2,...,Sn}, you should determine what is the value of the maxim ...

  4. jQuery 1.7_20120209 学习笔记

    html([val|fn]) parameters: function(index,html) 此函数返回一个html字符串,接受两个参数,index为元素在集合中的索引位置,html为原先的html ...

  5. System.Web.HttpRequestBase转HttpWebRequest

    /// <summary> /// Copies all headers and content (except the URL) from an incoming to an outgo ...

  6. static声明初始化块的一下注意事项

    通过输出结果,我们可以看到,程序运行时静态初始化块最先被执行,然后执行普通初始化块,最后才执行构造方法.由于静态初始化块只在类加载时执行一次,所以当再次创建对象 hello2 时并未执行静态初始化块.

  7. 从问题看本质:socket到底是什么(问答式)? .

    转自:http://blog.csdn.net/yeyuangen/article/details/6799575 一.问题的引入——socket的引入是为了解决不同计算机间进程间通信的问题 1.so ...

  8. http请求利器: 今天配置出了RESTClient,用MAVEN构建了UI运行包

  9. loadrunner录制时弹出invalid application path!please check if application exists对话框

    问题:oadrunner录制时弹出invalid application path!please check if application exists对话框 原因:IE浏览器地址不对,需要手动重新选 ...

  10. PP