ABAP - CODE - FIND THE EXIT/BADI

本文介绍了一个ABAP程序,用于查找指定SAP事务代码的用户出口(User Exit)或BADI。通过输入事务代码,程序能显示相关联的退出点名称及其描述,并允许用户直接导航到SAP的修改管理工具(SMOD)进行进一步操作。
 *&---------------------------------------------------------------------*
*& Report  Z_EXIT_FIND
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  z_exit_find NO STANDARD PAGE HEADING.

*&---------------------------------------------------------------------*
*& Report  Z_DEMO_ALEX01
*& 查找事务代码所在程序的用户出口
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

TABLES: tstc     , " SAPTransaction Codes
        tadir    , " Directory of Repository Objects
        modsapt  , " SAP Enhancements - Short Texts
        sxs_attrt, " SAPBADI- short text
        modact   , " Modifications
        trdir    , " System table TRDIR
        tfdir    , " Function Module
        enlfdir  , " Additional Attributes for Function Modules
        tstct    . " Transaction Code Texts

*&---------------------------------------------------------------------*
*& Variables
*&---------------------------------------------------------------------*
DATA: jtab        LIKE tadir OCCURS 0 WITH HEADER LINE.
DATA: field1(30).
DATA: v_devclass  LIKE tadir-devclass.
DATA: object      LIKE tadir-object.
DATA: bdcdata_wa  TYPE bdcdata,
      bdcdata_tab TYPE TABLE OF bdcdata.
DATA: opt         TYPE ctu_params.

*&---------------------------------------------------------------------*
*& Selection Screen Parameters
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK a01 WITH FRAME"TITLE text-001.
SELECTION-SCREEN SKIP.
PARAMETERS: p_tcode LIKE tstc-tcode OBLIGATORY.
SELECTION-SCREEN SKIP.
PARAMETERSexit RADIOBUTTON GROUP 1 DEFAULT 'X',
            badi RADIOBUTTON GROUP 1.
SELECTION-SCREEN END OF BLOCK a01.

DEFINE bdc_program.
  clear bdcdata_wa.
  bdcdata_wa-program  = &1.
  bdcdata_wa-dynpro   = &2.
  bdcdata_wa-dynbegin = &3.
  append bdcdata_wa to bdcdata_tab.
END-OF-DEFINITION.

DEFINE bdc_detail.
  clear bdcdata_wa.
  bdcdata_wa-fnam = &1.
  bdcdata_wa-fval = &2.
  append bdcdata_wa to bdcdata_tab.
END-OF-DEFINITION.

*&---------------------------------------------------------------------*
*& Start of main program
*&---------------------------------------------------------------------*
START-OF-SELECTION.
  IF exit = 'X'.
    object = 'SMOD'.  " User-exit!
  ELSE.
    object = 'SXSD'.  " BADI!
  ENDIF.

* 检查输入T-CODE是否存在
  SELECT SINGLE *
    FROM tstc
   WHERE tcode = p_tcode.

  IF sy-subrc EQ 0.
*   开发类取得
    SELECT SINGLE *
      FROM tadir
     WHERE pgmid    = 'R3TR'
       AND object   = 'PROG'
       AND obj_name = tstc-pgmna.             " 程序名

    v_devclass = tadir-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 = enlfdir-area.

        v_devclass = tadir-devclass.          " 开发类
      ENDIF.
    ENDIF.

*   Find SAP Modifactions:
    SELECT *
      FROM tadir
      INTO TABLE jtab
     WHERE pgmid    = 'R3TR'
       AND object   = object
       AND devclass = v_devclass.

    SELECT SINGLE *
      FROM tstct
     WHERE sprsl = sy-langu
       AND tcode = 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.
*     Exit:
      IF exit = 'X'.
        WRITE: /1  sy-vline,
                2  'Exit Name',
                22 sy-vline ,
                23 'Description',
                95 sy-vline.
*     BADI:
      ELSE.
        WRITE: /1  sy-vline,
                2  'BADI Name',
                22 sy-vline ,
                23 'Description',
                95 sy-vline.
      ENDIF.
      WRITE:/(95) sy-uline.

      LOOP AT jtab.
*       EXIT:
        IF exit = 'X'.
          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,
                  22 sy-vline ,
                  23 modsapt-modtext,
                  95 sy-vline.
*       BADI:
        ELSE.
          SELECT SINGLE *
            FROM sxs_attrt
           WHERE sprsl     = sy-langu
             AND exit_name = jtab-obj_name.

          FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
          WRITE: /1  sy-vline,
                  2  jtab-obj_name HOTSPOT ON,
                  22 sy-vline ,
                  23 sxs_attrt-text,
                  95 sy-vline.
        ENDIF.
      ENDLOOP.

      WRITE: /(95) sy-uline.
      DESCRIBE TABLE jtab.
      SKIP.

      FORMAT COLOR COL_TOTAL INTENSIFIED ON.
      IF exit = 'X'.
        WRITE: / 'No of Exits:', sy-tfill.
      ELSE.
        WRITE: / 'No of BADIs:', sy-tfill.
      ENDIF.
    ELSE.                                                   " IF 2
      FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
      WRITE: /(95'No User Exit exists'.
    ENDIF.                                                  " IF 2
  ELSE.                                                     " IF 1
    FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
    WRITE: /(95'Transaction Code Does Not Exist'.
  ENDIF.                                                    " IF 1


* Take the user to SMOD for the Exit that was selected:
AT LINE-SELECTION.
  GET CURSOR FIELD field1.
  CHECK field1(4EQ 'JTAB'.

* For exit:
  IF exit = 'X'.
    SET PARAMETER ID 'MON' FIELD sy-lisel+1(10).
    CALL TRANSACTION 'SMOD' AND SKIP FIRST SCREEN.

* For BADI:
  ELSE.
    CLEAR: bdcdata_wa, bdcdata_tab[].

    bdc_program 'SAPLSEXO'   '0100'       'X'.
    bdc_detail  'BDC_CURSOR' 'G_IS_BADI'.
    bdc_detail  'BDC_OKCODE' '=ISSPOT'.
    bdc_detail  'G_IS_BADI'  'X'.

    bdc_program 'SAPLSEXO'   '0100'       'X'.
    bdc_detail  'BDC_CURSOR' 'G_BADINAME'.
    bdc_detail  'BDC_OKCODE' '=SHOW'.
    bdc_detail  'G_BADINAME' sy-lisel+1(20).

    opt-dismode = 'E'.
    opt-defsize = 'X'.
    CALL TRANSACTION 'SE18' USING bdcdata_tab OPTIONS FROM opt.
  ENDIF.
### SAP ABAP 中 FB60、FV60、FB70、FV70 的增强功能及实现方式 #### 一、概述 SAP ABAP 提供了多种工具和技术来扩展标准事务码的功能,这些技术可以帮助开发者满足特定业务需求。对于 FB60(供应商发票输入)、FV60(客户发票输入)、FB70(供应商付款凭证录入)以及 FV70(客户收款凭证录入),可以通过不同的增强机制实现定制化开发。 --- #### 二、增强实现方式 1. **User Exits** User Exits 是一种传统的增强方法,在许多标准事务中都有预定义的退出点。通过调用 Function Module 来执行额外逻辑。例如,在处理 FB60 或 FV60 时,可以利用 `EXIT_SAPLFXX_XXX` 类型的标准函数模块[^1]。 2. **Enhancement Points (BAdIs 和 Subroutine Pool Enhancements)** BAdI(Business Add-In)是一种现代化的增强手段,允许在不修改标准代码的情况下插入自定义逻辑。某些事务可能已经内置了 Enhancement Points,可以直接配置并实现接口类中的方法。如果没有现成的 Enhancement Point,则可以选择创建新的 Subroutine Pool Enhancement[^2]。 3. **附加字段(Append Structures and Custom Fields)** 对于需要新增字段的情况,可以在相关透明表(如 `BKPF`, `BSEG` 等)上追加结构体,并将其映射至屏幕界面。具体操作涉及维护 Append Structure 及其关联关系,同时确保数据一致性。需要注意的是,当文档处于 Parked 状态时,部分字段仅存储于临时表(如 `VBSEG*`) 而未同步到正式表 (`BSEG`) 上。 4. **Custom Code via SPDD or SMOD Transactions** 使用 SE93 创建 Customer Exit 或者借助 SPAU/SPAD 修改现有程序段落也是可行方案之一。不过这种方法风险较高,建议谨慎采用以免影响后续升级兼容性。 5. **Class-Based Enhancements** 随着 OO-ABAP 的普及,基于对象模型的设计越来越受到青睐。针对上述四个事务码所对应的后台处理流程,可通过重写或继承相应的核心类完成个性化调整。比如 `CL_VBELN_BAPI` 这样的通用基类往往提供了丰富的钩子用于插件式开发[^1]。 --- #### 三、典型应用场景分析 以下是几种常见的使用场景及其解决方案: - **自动填充默认值** 当用户打开某个过账窗口时,希望依据一定规则预先设定某些参数项。此时可选用合适的 User Exit 或 Event Handler 实现动态计算与赋初值。 - **验证业务约束条件** 在保存记录之前加入额外校验步骤以防止非法输入发生。这通常涉及到拦截 Save Action 并触发自定义算法检查合法性。 - **集成外部系统交互** 如果企业内部存在其他管理系统需同财务模块协同工作,则可在适当位置嵌入 Web Service Callout 或 RFC Connection Logic 达成双向通讯目的。 - **报表统计优化** 结合实际运营状况设计专属查询视图以便更高效获取所需信息资源;此类改动多集中体现在展示层面上而非核心运算层面之上。 --- #### 四、注意事项 尽管拥有众多灵活的技术选项可供挑选,但在实施过程中仍需注意以下几点事项: - 彻底测试所有变更后的行为表现以防引入新缺陷; - 文档记录清楚每一步骤的具体意图便于后期维护人员理解; - 尽量减少对原始源文件直接篡改动作从而降低未来版本迁移难度系数。 ```abap REPORT zdemo_fb60_enhance. DATA: lv_amount TYPE decfloat16, lt_bseg TYPE TABLE OF bseg. START-OF-SELECTION. SELECT * FROM bseg INTO TABLE lt_bseg WHERE bukrs EQ '1000'. IF sy-subrc EQ 0 AND lines( lt_bseg ) GT 0. READ TABLE lt_bseg INDEX 1 ASSIGNING FIELD-SYMBOL(<fs_bseg>). IF <fs_bseg>-wrbtr IS NOT INITIAL. lv_amount = <fs_bseg>-wrbtr / 100. " Convert to Euro WRITE: / 'Total Amount:', lv_amount, '(EUR)'. ENDIF. ELSE. WRITE: / 'No data found.'. ENDIF. ``` --- 问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值