SAP Enhancement

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

简单地说,增强就是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

SAP Enhancement500)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),屏幕增强允许用户在采购订单自定义用户界面,从而使采购订单包含更多企业客户化的信息,这种屏幕增强在固定资产模块中更始发挥到极致。

SAP Enhancement500)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)。

(五)再次浅析增强

SAP Enhancement500)this.width=500;” border=0>
 

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/234912.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 计算机教育中缺失的一课,劝学弟学妹们一句,一定要趁早补上,工作后会事半功倍!「建议收藏」

    计算机教育中缺失的一课,劝学弟学妹们一句,一定要趁早补上,工作后会事半功倍!「建议收藏」各位学弟学妹们好,作为稍微年长的我(岁月是把杀猪刀啊),今天就给大家补补课。在大学里的,我们上的计算机专业课程一般都是像操作系统、编译原理、计算机组成原理、计算机网络这些理论课程,还有一些像C语言、Java、.Net这些可以实践的课程,甚至还有可能让你焊一个收音机,但是对于一些基本习惯却很容易被忽略,需要学弟学妹们自行摸索。实际上,一些好的基本习惯是时时刻刻在影响着我们自己的,不仅是在学校的学习生活中,还是在毕业后的工作生活中。今天我要给大家说就是,使用键盘的习惯。有的同学可能会诧异,键盘谁不会用啊,

    2022年7月16日
    22
  • RT-thread finsh移植到linux平台

    RT-thread finsh移植到linux平台目录FinSH介绍传统命令行模式C语言解释器模式FinSH移植移植要点效果验证代码下载参考在一次项目中,需要进行嵌入式操作系统选型,需求就是选择一款OS,既能满足当下项目的需要,又要考虑公司未来对物联网应用的扩展能力,对比了目前市面上流行的开源操作系统,诸如FreeRTOS,RTX,UCOS,RT-Thread,contiki等,最终确定了一款Io…

    2022年5月21日
    31
  • C中main函数的几种写法

    C中main函数的几种写法1、最标准的写法#include <stdio.h>int main(){ printf(“Hello World! “); return 0;}2、把int 换成void#include <stdio.h>void main(){ printf(“Hello World! “); return 0;}…

    2022年6月13日
    22
  • redis系列之——一致性hash算法「建议收藏」

    redis系列之——一致性hash算法「建议收藏」一致性hash算法你了解吗?什么时候使用?解决什么问题?redis集群模式使用了一致性hash算法了吗?数据分片(sharding)分布式数据存储时,经常要考虑数据分片,避免将大量的数据放在单表或单库中,造成查询等操作的耗时过长。比如,存储订单数据时使用三个mysql库(编号0,1,2),当一条订单数据过来时,对订单id求hash后与机器数量取模,hash(orderId)%3,假如得到的结果是2,则这条数据会存储到编号为2的mysql中。分表分库存储时,根据数据库的主键或唯一键做hash,然后跟

    2022年9月29日
    0
  • 史上超强最常用SQL语句大全

    史上超强最常用SQL语句大全史上超强最常用SQL语句大全,)1)DDL–数据定义语言用来定义数据库对象:数据库,表,列等。关键字:create,drop,alter等2)DML–数据操作语言用来对数据库中表的数据进行增删改。关键字:insert,delete,update等3)DQL–数据查询语言用来查询数据库中表的记录(数据)。关键字:selewhere等4)DCL–数据控制语言用来定义数据库的访问权限和安全级别,及创建用户。关键字:GRANT,REVOKE等

    2022年6月14日
    20
  • linux网络配置出现E325,Linux CentOS E325错误,如何解决?VI如何使用?「建议收藏」

    linux网络配置出现E325,Linux CentOS E325错误,如何解决?VI如何使用?「建议收藏」Linuxvi命令即vi编辑器,是Linux/UNIX环境下经典的编辑器。Linuxvi命令非常强大,可以使用它高效的编辑代码,配置系统文件等,运用非常广泛。但在Linux系统中打开vi编辑器时,不少朋友会提示E325:ATTENTION类的错误。那么,遇到这种情况后,该如何解决此类问题呢?为什么会出现E325:ATTENTION类的错误?出现此类错误是vi程序对文件的一种保护机制(…

    2022年5月12日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号