您的位置:首页 > 其它

如何使用BADI RSU5_SAPI_BADI 增强数据源0FI_AR_04--图解

2015-04-08 08:00 686 查看
本文讲解了如何使用另外一种更加高效的的数据源增强方式,RSU5_SAPI_BADI. 使用CMOD 的方法会产生巨大的INCLUDE 文件,并且无法协同作业,一旦

CMOD 被锁定,其他开发人员无法使用RSAP0001.使用ABAP OO 的BADI RSU5_SAPI_BADI就避免这些问题的发生。本方法略去了增加字段到数据源的方法,因为与CMOD的方法完全相同。

1,创建BADI RSU5_SAPI_BADI 的实现(做名词理解,原文为implementation),这里的实现和面向对象语言的概念相同。 到SE19,按图所示。实现命名为 ZC_RSU5_SAPI_BADI,这里的命名一般要包括BADI 的全称,以便后期识别。



2 当你创建实现的时候,系统自动创建了一个以ZCL_IM_+(去掉Z的实现名称),本例中就是 ZCL_IM_C_RUS5_BADI.双击此类名称,进入CLASS BUILDER(SE24)亦可进入。



 3 此时可以看拿到两个方法的名称,分别为 IF_EX_RSU5_BADI~DATA-TRANSFORM 和IF_EX_RSU5_SAPI_BADI~HIER_TRANSFORM.前面的是用来填充数据源的,后一个是用来增强层级的(可以通过SAP NOTE 691154详细了解)。



4  IF_EX_RSU5_BADI~DATA-TRANSFORM 可以用填充数据源,并且数据源已通过附加上所需字段而增强了,对业务数据和主数据通用。将光标放到DATA_TRANSFORM上,点击PARAMERTERS的长按钮,就可以看到接口其中四个IMPORITING 两个CHANGING.



5 点击程序按钮,上图红圈内按钮,进入编程界面,这里学要了解SEOCOMPO 表,可以通过SE11 看到结构。



method IF_EX_RSU5_SAPI_BADI~DATA_TRANSFORM.

*声明变量L_METHOD,其中包含方法

    DATA: L_METHOD TYPE SEOCMPNAME.

* 方法无法以数字开头(恰好标准数据源都是以数字开头,譬如:0FI_AR_04),增加M,这里可以按需要改为自己的命名规范确定的字母

  CONCATENATE 'M_' I_DATASOURCE INTO L_METHOD.

*检查数据源有数据。

  CHECK C_T_DATA[ ] IS NOT INITIAL.

*读取表SEOCOMPO中成员方法的名称,这张表里面包含你创建的方法名称,你的方法中应该包含,遍历数据库读取所需增强字段的内容。

  SELECT SINGLE CMPNAME FROM SEOCOMPO INTO L_METHOD WHERE

         CLSNAME = 'ZCL_IM_C_RSU5_BAPI_BADI' AND CMPNAME = L_METHOD.

*读取成功,方法存在。

  CHECK SY-SUBRC EQ 0.

*继续执行,唤起方法 L_METHOD。

    CALL METHOD (L_METHOD)

    EXPORTING

      I_UPDMODE   = I_UPDMODE

      I_T_SELECT   = I_T_SELECT

      I_T_FIELDS  = I_T_FIELDS

   CHANGING

     C_T_DATA = C_T_DATA

     C_T_MESSAGES = C_T_MESSAGES.

endmethod.

激活,并回到CLASS BUILDER 主界面。

6 创建自定义的方法。LEVEL 为STATIC METHOD , 可见度为:PRIVATE

注意自定义的方法为 STATIC METHOD ,属性为PRIVATE. (其实也可以定义为INSTANCE ,和PUBLIC ,但是就无法直接使用该方法,必须创建实例才能调用)。这是在方法的PRIVATE SECTION 里面自动生成以下代码:





7 自定义方法 M_0FI_AR_4 的代码,这里的代码和CMOD的代码类似。这里为了程序的效率,使用了指针FIELD-SYMBOLS.



method M_0FI_AR_4.

    FIELD-SYMBOLS: <L_S_DATA> TYPE DTFIAR_3.

  TYPES: BEGIN OF IT_VBRK,

          V_VBELN TYPE VBELN_VF,

          V_VKORG TYPE VKORG,

          V_VTWEG TYPE VTWEG,

          V_SPART TYPE SPART,

        END OF IT_VBRK.

  DATA: ZBW_VBRK TYPE STANDARD TABLE OF IT_VBRK,

        L_T_DATA TYPE STANDARD TABLE OF DTFIAR_3,

        WA_VBRK TYPE IT_VBRK.

 L_T_DATA[] = C_T_DATA[].

 IF NOT L_T_DATA IS INITIAL.

   SELECT VBELN VKORG VTWEG SPART

     FROM VBRK INTO TABLE ZBW_VBRK

     FOR ALL ENTRIES IN L_T_DATA

     WHERE  VBELN = L_T_DATA-BELNR.
LOOP AT L_T_DATA ASSIGNING <L_S_DATA>.

  READ TABLE ZBW_VBRK INTO WA_VBRK WITH KEY V_VBELN = <L_S_DATA>-BELNR BINARY SEARCH.

  IF SY-SUBRC = 0.

    <L_S_DATA>-ZZVKORG = WA_VBRK-V_VKORG.

    <L_S_DATA>-ZZVTWEG  = WA_VBRK-v_VTWEG.

    <L_S_DATA>-ZZSPART = WA_VBRK-V_SPART.

  ENDIF.

  ENDLOOP.
ENDIF.

  C_T_DATA[] = L_T_DATA[].

  REFRESH : L_T_DATA,

            ZBW_VBRK.

endmethod.

7,可以看到增加的字段



注意:以上的所有的操作,均在ECC中完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息