SAP BW数据源增强的两种方法

前言:我们经常会遇到系统标准的数据源,或者我们自建的数据源无法满足要求的情况,这个时候在数据源中添加几个相关的字段,可能就能满足我们的要求,这个时候就要用到数据源的增强。下面介绍的两种增强方法都是发生在数据源提取数据结束以后将要写到结果表的时候。

 

准备工作(自建数据源)

1)RSO2 创建一个简单的数据源:SFLIGHT 业务数据

clip_image002

选择一个应用程序组件,填写文本信息,直接到数据库SFLIGHT取数,点击保存

clip_image004

继续点击 保存

clip_image006

2)RSA6 选择刚刚创建的数据源 点击clip_image008

clip_image010

创建一个附加结构,用系统自带的名称即可,点击clip_image012

clip_image014

填写短文本,及要增加的字段(在此我们增加了一个字段FLAG,对于容量>=90%的航班,我们打算以FLAG为‘X’标记),然后点击clip_image016 激活附加结构

clip_image018

RSA3 测试提取一下

clip_image020

ALV GRID查看一下提取结果

clip_image022

可以看到最后一个字段标识,现在为空(例如第一条,占用374,容量385,使用率97.14%大于90%,但是现在标识仍然为空)

clip_image024

方法一:用户出口(User Exit)

1)CMOD 创建一个新项目 BW

clip_image026

2)填写短文本,保存,点击Enhancement assignments (增强分配)

clip_image028

3)分配增强“RSAP0001”(注:这个增强是固定的,每个系统都一样),保存,点击组件

clip_image030

4)点击clip_image032 激活组件

clip_image034

可以看到4个用户出口状态都已经变绿,选中用户出口,点击clip_image036

clip_image038

可知:001用于事务数据的数据源

002用于主数据或文本的数据源

003只能用于BW版本1.2B,2.0A以后被002替换

004用于层次的数据源

5)双击一个用户出口,进入Function Module界面

clip_image040

6)这个FM中,只是INCLUDE了一个程序,这个程序现在是不存在的,双击 ZXRSAU01

clip_image042

7)不要理会系统警告,回车

clip_image044

8)点击 是

clip_image046

INCLUEDE程序ZXRSAU01创建成功,下面就可以根据FM的输入输入参数进行CODING

clip_image048

*&------------------------------------------------------------------*
*& 包括 ZXRSAU01
*&------------------------------------------------------------------*

DATA: RATE TYPE P DECIMALS 2.

DEFINE WA_FS.

FIELD-SYMBOLS <&1> TYPE &1.

END-OF-DEFINITION.

CASE I_DATASOURCE.

***数据源增强部分。

*判断数据名称

WHEN 'Z_SFLIGHT'.

  WA_FS ZOXSRD0107.

*只有数据源为 Z_SFLITH 时,才执行以下代码

  LOOP AT C_T_DATA ASSIGNING <ZOXSRD0107>.

    IF <ZOXSRD0107>-SEATSMAX IS NOT INITIAL.

*计算航班使用率

      RATE = <ZOXSRD0107>-SEATSOCC / <ZOXSRD0107>-SEATSMAX * 100.

      IF RATE >= '1.00'.

        <ZOXSRD0107>-FLAG = 'X'. "使用率大于90%,打上标记

      ENDIF.

    ENDIF.

    CLEAR RATE.

  ENDLOOP.

ENDCASE.

或者这样:

FIELD-SYMBOLS:<S>LIKEZOXSRD0110.

DATA: RATE TYPE P DECIMALS 2.

WHEN'ZFLIGHT1'.
*WA_FS ZOXSRD0110.
*只有数据源为 Z_SFLITH 时,才执行以下代码
LOOP AT C_T_DATA ASSIGNING<S>.
IF <S>-SEATSMAX IS NOT INITIAL.
*计算航班使用率
RATE = <S>-SEATSOCC/<S>-SEATSMAX * 100.
IF RATE >= '1.00'.
<S>-FLAG ='X'."使用率大于1%,打上标记
ENDIF.
ENDIF.
CLEAR RATE.
ENDLOOP.


RSA3 测试提取,结果如下:

clip_image050

方法二:BAdI

1)SE19

clip_image052

2)创建一个Implementation BAdI Name: RSU5_SAPI_BADI

clip_image054

Implementation Name: ZRSU5_SAPI_BADI

clip_image056

填写描述,点击clip_image016[1] 激活这个Implementation

clip_image058

在Interface选项卡,会看到系统自动创建了一个class: ZCL_IM_RSU5_SAPI_BADI

双击这个class

clip_image060

进入Class Interface界面,会看到有两个method:

DATA_TRANSFORM 用于一般数据的增强(事务数据,主数据和文本)

HIER_TRANSFORM 用于层次数据的增强

clip_image062

双击method,就可以根据method的参数进行CODING了

clip_image064

为了便于管理,我们为每一个需要增强的数据源创建一个method,然后在方法DATA_TRANSFORM和HIER_TRANSFORM中动态调用

METHOD IF_EX_RSU5_SAPI_BADI~DATA_TRANSFORM.
DATA: LV_METHOD TYPE SEOCMPNAME.
* check if any data is extracted
CHECK C_T_DATA IS NOT INITIAL.
* get method name for datasource
* add one character as methods can't start with a number

CONCATENATE 'M_' I_DATASOURCE INTO LV_METHOD.
* check whether method exist
SELECT SINGLE CMPNAME
INTO LV_METHOD
FROM SEOCOMPO
WHERE CLSNAME = 'ZCL_IM_RSU5_SAPI_BADI'
AND CMPNAME = LV_METHOD.
CHECK SY-SUBRC EQ 0.
* check method is implemented
CALL METHOD (LV_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.

建一个Static Method M_SFLIGHT(注意:这里我们以'M_' + 数据源名称作为 Method的名称,因为有些系统的数据源以数字开头,而Method不允许以数字开头) 点击 Parameters

clip_image066

设置参数(只比DATA_TRANSFORM的参数少了一个I_DATASOURCE)如下:

clip_image068

保存后,返回Method界面

clip_image070

点击Code

clip_image072

下面就跟CMOD一样了,可以进行CODING了

clip_image074

METHOD SFLIGHT.
FIELD-SYMBOLS: <S> TYPE ZOXHHD0148.
DATA: RATE TYPE P DECIMALS 2.
* map the data
LOOP AT C_T_DATA ASSIGNING <S>.
CHECK <S>-SEATSMAX IS NOT INITIAL.
CLEAR RATE.
*计算航班使用率
RATE = <S>-SEATSOCC / <S>-SEATSMAX * 100.
IF RATE >= '90.00'.
<S>-FLAG = 'X'. "使用率大于90%,打上标记
ENDIF.
ENDLOOP.
ENDMETHOD.

RSA3 测试提取,结果如下:

clip_image050[1]

比较: 建议使用BAdI的方式, User Exit方式增强RSAP0001只能包含在一个项目中, 而BAdI方式可以为RSU5_SAPI_BADI创建多个Implementation,这样就可以为每个模块建一个Implementation,每个数据源建一个method,更加便于管理. 

 

来源:http://blog.sina.com.cn/u/2639396002

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值