ABAP User Exit 是 SAP 零碎中一种提供给客户扩大和批改规范程序的技术手段,这种机制容许客户在不批改 SAP 源代码的前提下,实现对规范程序的定制和性能加强。ABAP(Advanced Business Application Programming)是 SAP 的一种编程语言,用于开发企业级应用程序。在 SAP 零碎中,有许多事后定义好的 User Exits,开发人员能够通过编写 ABAP 代码来应用这些 User Exits 实现特定性能。

上面将通过一个例子具体介绍 ABAP User Exit 的应用场景、实现办法和注意事项。假如咱们所在的企业正在应用 SAP ERP 零碎进行销售订单解决,然而在创立销售订单时,咱们须要依据一些特定条件来主动批改客户的付款条件。尽管 SAP 零碎提供了规范的业务逻辑和性能,然而在这个特定场景下,咱们须要对规范程序进行定制,以满足企业的理论需要。在这种状况下,ABAP User Exit 就可能派上用场。

为了实现这个性能,咱们须要遵循以下步骤:

1. 寻找适合的 User Exit

在 SAP 零碎中,有许多预约义的 User Exits,咱们须要找到一个适合的 User Exit 来实现咱们的需要。在本例中,咱们能够应用销售订单创立过程中的一个 User Exit:MV45AFZZ。这个 User Exit 容许咱们在销售订单保留之前,对订单数据进行批改。

2. 编写 ABAP 代码

找到适合的 User Exit 后,咱们须要编写 ABAP 代码来实现咱们的定制性能。在本例中,咱们须要依据特定条件主动批改客户的付款条件。假如当订单金额超过 10000 时,咱们须要将付款条件批改为“预付款”。

首先,咱们须要进入 ABAP 开发工具(SE80 或 SE38),而后关上 User Exit 对应的 ABAP 程序 MV45AFZZ。在这个程序中,咱们须要找到一个适合的办法(FORM 或 FUNCTION MODULE)来实现咱们的性能。在本例中,咱们能够应用 USEREXIT_SAVE_DOCUMENT_PREPARE 办法。

接下来,咱们须要在 USEREXIT_SAVE_DOCUMENT_PREPARE 办法中编写 ABAP 代码。代码示例如下:

FORM USEREXIT_SAVE_DOCUMENT_PREPARE.  DATA: lv_net_value TYPE konv-kwert.  LOOP AT xkomv WHERE kposn = '000000'.    lv_net_value = xkomv-kwert.  ENDLOOP.  IF lv_net_value GT 10000.    LOOP AT xvbak.      xvbak-zterm = '预付款'.      MODIFY xvbak.    ENDLOOP.  ENDIF.ENDFORM.

以上代码首先计算了订单的净价值(lv_net_value),而后依据净价值是否大于 10000 来批改付款条件。

应用下列代码查找零碎里可用的 user exit:

*&---------------------------------------------------------------------**& Report  ZFINDEXIT*&*&---------------------------------------------------------------------**&*&*&---------------------------------------------------------------------*REPORT  ZFINDEXIT.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.SELECTION-SCREEN : BEGIN OF BLOCK b1 WITH FRAME TITLE text-t01.PARAMETERS : p_tcode LIKE tstc-tcode OBLIGATORY.SELECTION-SCREEN : END OF BLOCK b1.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.