SAP 相关增强总结

[x]隐式增强: 在 执行程序,包含程序,函数组,对话模块的结尾;Form例程,函数模块,方法等的开始和结尾;结构的结尾这些地方都会有
[x]出口增强:一个Enhancement只能使用一次
T-CODE: SMOD/CMOD
使用 CALL  CUSTOMER-FUNCTION  <3 位数字 > 调用函数模块
主要四类:
  • E. Function exits函数增强(最常用,在SAP上线很多年后都会使用,如:销售单VA02中,对PO长度限制在10-15位之间,且不能为中文与其他特殊字符,还有如对PO采购日期不能晚于交货日期的检验等,这些都会用来函数增强
  • C.GUI codesGUI增强
  • S. Screens:屏幕增强   增强屏幕的调用是使用CALL CUSTOMER-SUBSCREEN不常用,一般在上线之初才会做,上线后不常用)
  • T. Tabes:表结构增强
[x]BADI增强: 一个Enhancement可使用多次
T-CODE:SE19/SE18
SE18用于创建及维护BADI对象
SE19用于维护BADI的实例
[x]查找增强方法:
EXIT查找方法:
1、exit出口可通过在程序中查找 CALL  CUSTOMER-FUNCTION来查询增强
出口函数名的规则为 EXIT_< 程序名>_<3位数字>,然后通过找到的出口函数名到 MODSAP 表里查找所对应的出口对象(即增强点)
2、 通过调试系统相关函数 :加断点执行相关T-CODE
MODX_FUNCTION_ACTIVE_CHECK(E类-检查用户出口类是否被激活) 
输入变量 l_funcname 看看它是啥值,比如是EXIT_SAPLF048_001
MODX_MENUENTRY_ACTIVE_CHECK(C类-检查菜单关键字类是否被激活)
MODX_SUBSCREEN_ACTIVE_CHECK(S类-检查屏幕增强是否被激活)
BADI的查找方法:
1、主程序都会SE24调用 cl_exitHandler=>get_instance;运行一个tcode,看一下exit_name的值,这就是要找的BADI(这只是经典BADI是这样来调用的,如果是新式的BADI,则调用为 GET BADI handle-BADI定义名、CALL BADI handle->method)来判断对象是否存在,并返回实例。
2、在主程序中搜索cl_exitHandler,查看它所引用(TYPE REF TO)的接口名,根据接口命名规则 IF_EX_<badi>,得到<badi>命称
通用方法:
根据T-CODE或程序名查找其中包含的EXIT/BADI增强
*&---------------------------------------------------------------------*
*& Report ZLC_FIND_EXIT
*&---------------------------------------------------------------------*
*&根据T-CODE / 程序名查询出口、BADI增强
*&---------------------------------------------------------------------*
REPORT ZLC_FIND_EXIT.

TABLES : TSTC,
         TADIR,
         MODSAPT,
         MODACT,
         TRDIR,
         TFDIR,
         ENLFDIR,
         SXS_ATTRT ,
         TSTCT.
DATA : JTAB LIKE TADIR OCCURS 0 WITH HEADER LINE.
DATA : FIELD1(30).
DATA : V_DEVCLASS LIKE TADIR-DEVCLASS.
PARAMETERS : P_TCODE LIKE TSTC-TCODE,
             P_PGMNA LIKE TSTC-PGMNA.
DATA WA_TADIR TYPE TADIR.

START-OF-SELECTION.
  IF NOT P_TCODE IS INITIAL.
    SELECT SINGLE * FROM TSTC WHERE TCODE EQ P_TCODE.
  ELSEIF NOT P_PGMNA IS INITIAL.
    TSTC-PGMNA = P_PGMNA.
  ENDIF.
  IF SY-SUBRC EQ 0.
    SELECT SINGLE * FROM TADIR
    WHERE PGMID = 'R3TR'
    AND OBJECT = 'PROG'
    AND OBJ_NAME = TSTC-PGMNA.
    MOVE : TADIR-DEVCLASS TO V_DEVCLASS.
    IF SY-SUBRC NE 0.
      SELECT SINGLE * FROM TRDIR
      WHERE NAME = TSTC-PGMNA.
      IF TRDIR-SUBC EQ 'F'.
        SELECT SINGLE * FROM TFDIR
        WHERE PNAME = TSTC-PGMNA.
        SELECT SINGLE * FROM ENLFDIR
        WHERE FUNCNAME = TFDIR-FUNCNAME.
        SELECT SINGLE * FROM TADIR
        WHERE PGMID = 'R3TR'
        AND OBJECT = 'FUGR'
        AND OBJ_NAME EQ ENLFDIR-AREA.
        MOVE : TADIR-DEVCLASS TO V_DEVCLASS.
      ENDIF.
    ENDIF.
    SELECT * FROM TADIR INTO TABLE JTAB
    WHERE PGMID = 'R3TR'
    AND OBJECT IN ('SMOD', 'SXSD')
    AND DEVCLASS = V_DEVCLASS.
    SELECT SINGLE * FROM TSTCT
    WHERE SPRSL EQ SY-LANGU
    AND TCODE EQ P_TCODE.
    FORMAT COLOR COL_POSITIVE INTENSIFIED OFF.
    WRITE:/(19) 'Transaction Code - ',
    20(20) P_TCODE,
    45(50) TSTCT-TTEXT.
    SKIP.
    IF NOT JTAB[] IS INITIAL.
      WRITE:/(105) SY-ULINE.
      FORMAT COLOR COL_HEADING INTENSIFIED ON.
* Sorting the internal Table
      SORT JTAB BY OBJECT.
      DATA : WF_TXT(60)     TYPE C,
             WF_SMOD        TYPE I,
             WF_BADI        TYPE I,
             WF_OBJECT2(30) TYPE C.
      CLEAR : WF_SMOD, WF_BADI , WF_OBJECT2.
* Get the total SMOD.
      LOOP AT JTAB INTO WA_TADIR.
        AT FIRST.
          FORMAT COLOR COL_HEADING INTENSIFIED ON.
          WRITE:/1 SY-VLINE,
          2 'Enhancement/ Business Add-in',
          41 SY-VLINE ,
          42 'Description',
          105 SY-VLINE.
          WRITE:/(105) SY-ULINE.
        ENDAT.
        CLEAR WF_TXT.
        AT NEW OBJECT.
          IF WA_TADIR-OBJECT = 'SMOD'.
            WF_OBJECT2 = 'Enhancement' .
          ELSEIF WA_TADIR-OBJECT = 'SXSD'.
            WF_OBJECT2 = ' Business Add-in'.
          ENDIF.
          FORMAT COLOR COL_GROUP INTENSIFIED ON.
          WRITE:/1 SY-VLINE,
          2 WF_OBJECT2,
          105 SY-VLINE.
        ENDAT.
        CASE WA_TADIR-OBJECT.
          WHEN 'SMOD'.
            WF_SMOD = WF_SMOD + 1.
            SELECT SINGLE MODTEXT INTO WF_TXT
            FROM MODSAPT
            WHERE SPRSL = SY-LANGU
            AND NAME = WA_TADIR-OBJ_NAME.
            FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
          WHEN 'SXSD'.
* For BADis
            WF_BADI = WF_BADI + 1 .
            SELECT SINGLE TEXT INTO WF_TXT
            FROM SXS_ATTRT
            WHERE SPRSL = SY-LANGU
            AND EXIT_NAME = WA_TADIR-OBJ_NAME.
            FORMAT COLOR COL_NORMAL INTENSIFIED ON.
        ENDCASE.
        WRITE:/1 SY-VLINE,
        2 WA_TADIR-OBJ_NAME HOTSPOT ON,
        41 SY-VLINE ,
        42 WF_TXT,
        105 SY-VLINE.
        AT END OF OBJECT.
          WRITE : /(105) SY-ULINE.
        ENDAT.
      ENDLOOP.
      WRITE:/(105) SY-ULINE.
      SKIP.
      FORMAT COLOR COL_TOTAL INTENSIFIED ON.
      WRITE:/ 'No.of Exits:' , WF_SMOD.
      WRITE:/ 'No.of BADis:' , WF_BADI.
    ELSE.
      FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
      WRITE:/(105) 'No userexits or BADis exist'.
    ENDIF.
  ELSE.
    FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
    WRITE:/(105) 'Transaction does not exist'.
  ENDIF.

AT LINE-SELECTION.
  DATA : WF_OBJECT TYPE TADIR-OBJECT.
  CLEAR WF_OBJECT.
  GET CURSOR FIELD FIELD1.
  CHECK FIELD1(8) EQ 'WA_TADIR'.
  READ TABLE JTAB WITH KEY OBJ_NAME = SY-LISEL+1(20).
  MOVE JTAB-OBJECT TO WF_OBJECT.
  CASE WF_OBJECT.
    WHEN 'SMOD'.
      SET PARAMETER ID 'MON' FIELD SY-LISEL+1(10).
      CALL TRANSACTION 'SMOD' AND SKIP FIRST SCREEN.
    WHEN 'SXSD'.
      SET PARAMETER ID 'EXN' FIELD SY-LISEL+1(20).
      CALL TRANSACTION 'SE18' AND SKIP FIRST SCREEN.
  ENDCASE.

只能根据T-CODE查询出口增强
*TABLES : TSTC, TADIR, MODSAPT, MODACT, TRDIR, TFDIR, ENLFDIR.
*TABLES : TSTCT.
*DATA : JTAB LIKE TADIR OCCURS 0 WITH HEADER LINE.
*DATA : FIELD1(30).
*DATA : V_DEVCLASS LIKE TADIR-DEVCLASS.
*PARAMETERS : P_TCODE LIKE TSTC-TCODE OBLIGATORY.
*
*SELECT SINGLE * FROM TSTC WHERE TCODE EQ P_TCODE.
*IF SY-SUBRC EQ 0.
*  SELECT SINGLE * FROM TADIR WHERE PGMID = 'R3TR'
*  AND OBJECT = 'PROG'
*  AND OBJ_NAME = TSTC-PGMNA.
*  MOVE : TADIR-DEVCLASS TO V_DEVCLASS.
*  IF SY-SUBRC NE 0.
*    SELECT SINGLE * FROM TRDIR WHERE NAME = TSTC-PGMNA.
*    IF TRDIR-SUBC EQ 'F'.
*      SELECT SINGLE * FROM TFDIR WHERE PNAME = TSTC-PGMNA.
*      SELECT SINGLE * FROM ENLFDIR WHERE FUNCNAME =
*      TFDIR-FUNCNAME.
*      SELECT SINGLE * FROM TADIR WHERE PGMID = 'R3TR'
*      AND OBJECT = 'FUGR'
*      AND OBJ_NAME EQ ENLFDIR-AREA.
*
*      MOVE : TADIR-DEVCLASS TO V_DEVCLASS.
*    ENDIF.
*  ENDIF.
*  SELECT * FROM TADIR INTO TABLE JTAB
*  WHERE PGMID = 'R3TR'
*  AND OBJECT = 'SMOD'
*  AND DEVCLASS = V_DEVCLASS.
*  SELECT SINGLE * FROM TSTCT WHERE SPRSL EQ SY-LANGU AND
*  TCODE EQ P_TCODE.
*  FORMAT COLOR COL_POSITIVE INTENSIFIED OFF.
*  WRITE:/(19) 'Transaction Code - ',
*  20(20) P_TCODE,
*  45(50) TSTCT-TTEXT.
*  SKIP.
*  IF NOT JTAB[] IS INITIAL.
*    WRITE:/(95) SY-ULINE.
*    FORMAT COLOR COL_HEADING INTENSIFIED ON.
*    WRITE:/1 SY-VLINE,
*    2 'Exit Name',
*    21 SY-VLINE ,
*    22 'Description',
*    95 SY-VLINE.
*    WRITE:/(95) SY-ULINE.
*    LOOP AT JTAB.
*      SELECT SINGLE * FROM MODSAPT
*      WHERE SPRSL = SY-LANGU AND
*      NAME = JTAB-OBJ_NAME.
*      FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
*      WRITE:/1 SY-VLINE,
*      2 JTAB-OBJ_NAME HOTSPOT ON,
*      21 SY-VLINE ,
*      22 MODSAPT-MODTEXT,
*      95 SY-VLINE.
*    ENDLOOP.
*    WRITE:/(95) SY-ULINE.
*    DESCRIBE TABLE JTAB.
*    SKIP.
*    FORMAT COLOR COL_TOTAL INTENSIFIED ON.
*    WRITE:/ 'No of Exits:' , SY-TFILL.
*  ELSE.
*    FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
*    WRITE:/(95) 'No User Exit exists'.
*  ENDIF.
*ELSE.
*  FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
*  WRITE:/(95) 'Transaction Code Does Not Exist'.
*ENDIF.
*
*AT LINE-SELECTION.
*  GET CURSOR FIELD FIELD1.
*  CHECK FIELD1(4) EQ 'JTAB'.
*  SET PARAMETER ID 'MON' FIELD SY-LISEL+1(10).
*  CALL TRANSACTION 'SMOD' AND SKIP FIRST SCREEN.
[x]各个模块常用增强:
MM模块:
USER-EXIT:MBCF0002
实现功能  1、当参照预留过帐时,检查填入数量是否小于预留数量
                 2、移动类型是***的时候,查看RSNUM是否为空
                 3、检查原始单据工厂和库存地点与物料凭证的工厂和库存地点一致
 USER-EXIT:MBCF0009
实现功能1、当移动类型是***的时候,库存地点只能是****
                 2、工单下达日期+时间小于预留需求日期+时间,警告
USER-EXIT:MEREQ001 采购申请中—购买申请中的客户自有数据
USER-EXIT:LMR1M002 采购收货暂估增强—GR/IR科目维护的科目分组
USER-EXIT:MBCF0007 领料单&退料单—客户功能退出:更新预留
USER-EXIT:MM06E005 采购订单屏幕增强—在采购凭证中的客户字段
BADI :ME_GUI_PO_CUST——采购订单
BADI:MB_DOCUMENT_BADI——物料凭证
BADI:BADI_MATERIAL_CHECK——物料主数据检查
BADI:MB_RESERVATION_BADI——预留单增强
BADI:ME_PROCESS_REQ_CUST——采购申请增强
BADI:INVOICE_UPDATE ——预制发票增强—实现功能:检查预制发票中采购订单对应的采购组、采购类型和采购组织的权限
BADI:VENDOR_ADD_DATA—— 供应商增强
            VENDOR_ADD_DATA_CS——供应商主数据屏幕增强
PM模块:
工单——工序——外部
BADI:MRO_CONTRACT —— 实现功能:外部中填入的物料组和维护的物料组是否一致,不一致则报错
BADI:WORKORDER_UPDATE——工单的很多判断都在这个里面来实现 工单——组件增强
工单:
USER-EXIT:CNEX0026 
FUNCTION:EXIT_SAPLCOMK_005
BADI:IWO1_ORDER_BADI INST_AUTHORITY_CHECK 实现功能:IW31和IW32的时候检查是否有权限创建和修改工单
           IWO1_SCREEN_MODIFY——实现功能:修改工单的屏幕字段是否显示
设备增强:
USER-EXIT:IEQM0003——FUNCTION:EXIT_SAPMIEQ0_001
功能位置增强:
USER-EXIT:ILOM0001 FUNCTION:EXIT_SAPMILO0_001
通知单增强:
USER-EXIT:IWOC0001——FUNCTION:EXIT_SAPLIWO1_001   创建的时候检查
                       QQMA0014——FUNCTION:EXIT_SAPMIWO0_020  保存的时候检查
BADI:NOTIF_EVENT_SAVE   保存时检查
维护计划增强: IP41/IP42/IP43
USER-EXIT:IPRM0004——FUNCTION:EXIT_SAPLIWP3_004  保存时候检查
计量点增强:
USER-EXIT:IMRC0001—FUNCTION:EXIT_SAPLIMR0_001 检查权限
                       IMRC0005——FUNCTION:EXIT_SAPLIMR1_005   检查权限
FI增强
会计凭证替代增强:
BADI:AC_DOCUMENT
            ACC_DOCUMENT
SD模块发票增强:
USER-EXIT:SDVFX004 ——FUNCTION:EXIT_SAPLV60B_004  传递发票的一些字段到会计凭证上
客户增强:
BADI:CUSTOMER_ADD_DATA_CS    客户主数据屏幕增强
            CUSTOMER_ADD_DATA
USER-EXIT:SAPMF02D——FUNCTION:EXIT_SAPMF02D_001 客户主数据的销售数据增强
                       SDVFX008——FUNCTION:EXIT_SAPLV60B_008  用销售发票的一些字段替代会计凭证
交货单屏幕增强:
BADI:LE_SHP_TAB_CUST_ITEM  增强屏幕
            LE_SHP_DELIVERY_PROC   逻辑编写
PS模块:
BADI:WBS_USER_FIELDS_F4 ——实现功能:CJ20N创建WBS的时候为特定字段做SEACH HELP
BADI:WORKBREAKDOWN_UPDATE ——实现功能:CJ20N 保存WBS检查
USER-EXIT:CNEX0002——FUNCTION:EXIT_SAPLCNAU_001—— PS的权限检查  注意sap_x_actvt这个参数要打X

各T-CODE增强总结:

计划订单转生产订单增强

WORKORDER_UPDATE~INITIALIZE,此时生产订单还没有生成,不能报错,没有生产订单号。CO40,CO41,COHV,CO02等各种TCODE都会进去。

AT_SAVE可以报错

CO01

保存订单时增强 PPCO0001,不能报错,否则会dump

CO02

已报工订单禁止修改,使用CMOD增强,在增强PPCO0019的出口EXIT_SAPLCOVG_001中

没有权限时禁止查看订单成本,使用隐式增强

生产订单下达增强,使用BADI增强,在WORKORDER_UPDATE方法AT_RELEASE中

生产订单修改记录,CMOD增强,在增强PPCO0001的出口EXIT_SAPLCOBT_001中

修改抬头数据-EXIT_SAPLCOZV_001 ​​​​​​​

生产订单功能状态变更-SE18-WORKORDER_UPDATE-方法REORG_STATUS_ACT_CHECK

方法-BEFORE_UPDATE-变更前后对比检查

CO11N增强

报工检查,使用CMOD增强,在增强CONFPP02的出口EXIT_SAPLCORF_102中。修改数据后回车、点击保存时触发,报工BAPI会触发

报工检查,使用CMOD增强,在增强CONFPP03。填写订单号回车时触发(之后不再触发)

屏幕增加字段,输入员工号查询员工姓名,CMOD,在增强CONFPP07的出口EXIT_SAPLCORF_105中

CO13取消报工增强

CMOD,CONFPP05,EXIT_SAPLCORF_105,报工和取消报工都会触发

VA02

销售订单审核后禁止修改,使用USER_EXIT增强,在程序MV45AFZZ的FORM USEREXIT_SAVE_DOCUMENT_PREPARE中

MM01增强

保存时触发(可用于检查数据,无法修改) CMOD增强MGA00001 ,出口EXIT_SAPLMGMU_001

在此增强中报E类型消息时,输出时会自动转成TYPE ”E’ DISPLAY LIKE ‘S’.

只有修改部分的数据,没有物料的全部数据

BADI_MATERIAL_REF 可用于创建时填充默认值(只有在MM01创建时才会触发增强)

BADI_MATERIAL_CHECK 可用于保存时检查,可以修改部分值(查看changing参数)

添加物料主数据附加数据

ME11

保存时触发:BADI ME_INFOREC_SEND

ME22N

采购订单审核后禁止修改,使用CMOD增强,在增强MM06E005的出口EXIT_SAPMM06E_007中

注:此出口只适用于ME22N修改的情况,ME21N第一次保存时TEKPO表是空的

控制净价字段需要权限才能修改,隐式增强

ME29N、ME28

取消二级审核后才允许取消一级审核,使用CMOD增强,在增强ME06E005的出口EXIT_SAPMM06E_007中

MD16,CO40等

计划订单转生产订单增强,使用隐式增强

MB51

根据权限显示物料部分金额,使用隐式增强

MIGO

收货检查报错,使用CMOD增强,在增强MBCF0002的出口EXIT_SAPMM07M_001中

在增强MBCF0002中,I_MSEG为输入采购订单号回车后生成的显示在屏幕上的物料凭证信息,E_SGTXT为要保存进MSEG-SGTXT的数据;此增强在点击“检查”和“过账”时触发,输出一条物料凭证项目,可用于检查;可写入项目短文本

收货时写入物料凭证项目文本,使用BADI增强,在MB_MIGO_ITEM_BADI方法ITEM_MODIFY中

收货时保存物料凭证到WMS,MB_CF001,EXIT_SAPLMBMB_001;此增强在过账、COMMIT WORK之前,IN UPDATE TASK触发,输出XMKPF(内表),XMSEG(内表),不能修改只能输出,且不能DEBUG和MESSAGE;要想DEBUG,必须在UPDATE TASK之前启动DEBUG,且如果启动了DEBUG就无法ROLL BACK了

创建物料凭证保存时检查:MB_DOCUMENT_BADI的MB_DOCUMENT_BEFORE_UPDAT

VK11

保存条件价格记录时检查,使用BADI增强,在SD_COND_SAVE_A中

增强BADI名SD_COND_DETAIL ,在点击保存时触发

日常增强问题解决:
1、采购申请增强字段在行项目布局不显示问题解决方法:
              SE38- BCALV_BUFFER_DEL_SHARED 进行刷新
2、前序单据增强检查--MB_DOCUMENT_BADI-MB_DOCUMENT_BEFORE_UPDATE 报错信息不提示改用 MB_CHECK_LINE_BADI增强检查
3、增强获取屏幕字段值方法:
   DATA:ZACTION     TYPE GODYNPRO-ACTION.
    DATA:REFDOC     TYPE GODYNPRO-REFDOC.
    DATA: FIELD(50) TYPE C  VALUE '(SAPLMIGO)GODYNPRO-ACTION'.
    DATA: FIELD2(50) TYPE C  VALUE '(SAPLMIGO)GODYNPRO-REFDOC'.
    FIELD-SYMBOLS: <FS_ACTION>    TYPE ANY.
    FIELD-SYMBOLS: <FS_REFDOC>    TYPE ANY.
    ASSIGN (FIELD) TO <FS_ACTION>.
    ASSIGN (FIELD2) TO <FS_REFDOC>.
    IF <FS_ACTION> IS ASSIGNED AND <FS_REFDOC> IS ASSIGNED.
      ZACTION = <FS_ACTION>.
      REFDOC = <FS_REFDOC>.
    ENDIF.
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值