如何使用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 的全称,以便后期识别。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/01/fd4b3ea773ba28e71da6623f76fd0df0)
2 当你创建实现的时候,系统自动创建了一个以ZCL_IM_+(去掉Z的实现名称),本例中就是 ZCL_IM_C_RUS5_BADI.双击此类名称,进入CLASS BUILDER(SE24)亦可进入。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/01/acc876d921907ae88e913dffe985f6a7)
3 此时可以看拿到两个方法的名称,分别为 IF_EX_RSU5_BADI~DATA-TRANSFORM 和IF_EX_RSU5_SAPI_BADI~HIER_TRANSFORM.前面的是用来填充数据源的,后一个是用来增强层级的(可以通过SAP NOTE 691154详细了解)。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/01/7b9ece0d16063ce4b7aaad1b2f64dc05)
4 IF_EX_RSU5_BADI~DATA-TRANSFORM 可以用填充数据源,并且数据源已通过附加上所需字段而增强了,对业务数据和主数据通用。将光标放到DATA_TRANSFORM上,点击PARAMERTERS的长按钮,就可以看到接口其中四个IMPORITING 两个CHANGING.
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/01/7b9ece0d16063ce4b7aaad1b2f64dc05)
5 点击程序按钮,上图红圈内按钮,进入编程界面,这里学要了解SEOCOMPO 表,可以通过SE11 看到结构。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/01/cb35a3a81beb180507435b66524c3014)
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 里面自动生成以下代码:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/01/b98d90a73d4d1185255275df718064fc)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/01/43b97b32f9dddf9d69707d469ba8b5b6)
7 自定义方法 M_0FI_AR_4 的代码,这里的代码和CMOD的代码类似。这里为了程序的效率,使用了指针FIELD-SYMBOLS.
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/01/ef8700a5d1a1594201175d50fbca308d)
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,可以看到增加的字段
![](https://oscdn.geek-share.com/Uploads/Images/Content/202006/01/300d81a2b10ffd84096c5786010abc30)
注意:以上的所有的操作,均在ECC中完成。
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中完成。
相关文章推荐
- 如何使用 RowDataBound 事件在数据源中的字段值显示在 GridView 控件中之前修改该值
- 如何使用SMOD和CMOD进行SD的用户增强
- 如何使用SMOD和CMOD进行SD的用户增强
- Web设计中如何使用XML数据源对象
- 如何使用 Excel 服务的Excel表内容作为Microsoft Office PerformancePoint 2007的数据源
- 用javascript操作xml-->Web设计中如何使用XML数据源对象(转载)
- Web设计中如何使用XML数据源对象
- 如何使用 SqlConfigDataSource 创建 ODBC 数据源
- 如何使用 ADO 将数据从 ADO 数据源传输到 Excel
- Web设计中如何使用XML数据源对象(1)
- SSIS如何在包中使用数据源
- 如何使用BADI修改PO (processing to ME21N )
- 如何使用BADI修改PO (processing to ME21N )
- 如何使用微软的SAPI实现发音功能?
- [翻译]如何使用webservice作为数据源去生成Microsoft Reporting Services 2005的报表
- 如何使用SMOD和CMOD进行SD的用户增强
- [翻译]如何使用webservice作为数据源去生成Microsoft Reporting Services 2005的报表
- 如何在JasperReports中使用XML文件作为数据源?
- 如何使用BADI修改PO (processing to ME21N )
- osworkflow使用jdbc如何不用配置数据源。