加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2011-12-29 01:04:40)
标签:

sap

bw

分类: SAP

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

准备工作(自建数据源)

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

http://s7/bmiddle/9d51fca2xb52a1f312996&690

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

http://s2/bmiddle/9d51fca2xb52a4199c131&690

继续点击 保存

http://s6/bmiddle/9d51fca2xb52a45b5e905&690

2)RSA6 选择刚刚创建的数据源 点击 https://hekijq.blu.livefilestore.com/y1meEQABspT90HLx7ZIP949QYOs6x7xtsTSjS03NNEbvWbMRx8d0TMRyeToEfPOCJGy1t-39-LGGuc7yK0J9OxzOD0kw1KvBxi1fJT5oM_EwHciaDgVROeDENuvC1pkKQLUv43A_ZvJdBzUwOSItfb2PA/clip_image008_thumb.jpg

http://s9/bmiddle/9d51fca2xb52a4670daa8&690

创建一个附加结构,用系统自带的名称即可,点击https://hekijq.blu.livefilestore.com/y1majzNNP13XVpAMh6C-PnBMgUr2_vCiepfgKGt0pie_klx1j6l4IujBHoYPGS2oW54HmlE153R3So5gmDB1RSCLDu4aOt4e44OlSR99U4IDCxu1NPXHMeXEY1zh2WP4kX4aGGGspHw1-pRXzmE8Z8oRg/clip_image012_thumb.jpg

http://s13/bmiddle/9d51fca2xb52a47aa597c&690

填写短文本,及要增加的字段 (在此我们增加了一个字段FLAG,对于容量>=90%的航班,我们打算以FLAG为‘X’标记),然后点击https://hekijq.blu.livefilestore.com/y1mgRG3Uh6ioADAdsnssSoHBF1aSpRE397hwDel5DvkLXy9zHsy67444aswVC5O8_QOBKs4Z0Mz6LFIH8CnbVfjD2HmOdPMwDAfLbK-iLXFg2AZ3RSBueItX65_Kml5w3D9x8lhnEZGA5WOi0Q53LfUTg/clip_image016_thumb.jpg 激活附加结构

http://s5/bmiddle/9d51fca2xb52a52e226a4&690

RSA3 测试提取一下

http://s8/bmiddle/9d51fca2xb52a4bea7e17&690

ALV GRID查看一下提取结果

http://s8/bmiddle/9d51fca2xb52a665e9c07&690

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

http://s10/bmiddle/9d51fca2xb52a680964d9&690

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

1)CMOD 创建一个新项目 BW

http://s1/bmiddle/9d51fca2xb52a68bca0b0&690

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

http://s2/bmiddle/9d51fca2xb52a6a25f691&690

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

http://s9/bmiddle/9d51fca2x78843e0c2328&690

4)点击https://hekijq.blu.livefilestore.com/y1meo_aCzbDPPIfEk8w_eP-5R8eIHRedxVyYx-0mjUZhM3cHPUeu1Tcha2AziCI4YyXtM49XY_MmXpaogXngzzSsshtxUJouB2qORLXCHmZyOEqVIhaxmawKzrV7N9HN4V6U86Zm3cYk7K9uQjKvo2NkA/clip_image032_thumb.jpg 激活组件

http://s8/bmiddle/9d51fca2xb52a7a19f787&690

可以看到4个用户出口状态都已经变绿,选中用户出口,点击https://hekijq.blu.livefilestore.com/y1mcbVpdg6Q44Qt0NwVSpiPFZDoPrSGcv4A0pB-jv1BNyeZTfr1r3HMWvNSRQb_jZMB_ULx6mkKjCWKAwVuPDbly0p0yl8yjN2Y8xAehJmi6bZPBEHL3PTCO2TInwRALygC49lKYHeN_shn2IJAdB8xbA/clip_image036_thumb.jpg

http://s7/bmiddle/9d51fca2xb52a80861066&690

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

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

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

004用于层次的数据源

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

http://s1/bmiddle/9d51fca2xb52a82af2d80&690

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

http://s11/bmiddle/9d51fca2xb52a832a33da&690

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

http://s10/bmiddle/9d51fca2xb52a83e9c989&690

8)点击 是

http://s5/bmiddle/9d51fca2xb52a887012f4&690

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

http://s8/bmiddle/9d51fca2xb52a897f7707&690

*&------------------------------------------------------------------*
*&  包括                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> LIKE ZOXSRD0110.

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 测试提取,结果如下:

http://s7/bmiddle/9d51fca2xb52a8a128876&690

方法二:BAdI

1)SE19

http://s16/bmiddle/9d51fca2xb52a8d629b5f&690

2)创建一个Implementation BAdI Name: RSU5_SAPI_BADI

http://s11/bmiddle/9d51fca2xb52a8e4fdbaa&690

Implementation Name: ZRSU5_SAPI_BADI

http://s9/bmiddle/9d51fca2xb52a97316738&690

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

http://s16/bmiddle/9d51fca2xb52a97ab2cbf&690

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

双击这个class

http://s15/bmiddle/9d51fca2xb52a98ac346e&690

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

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

HIER_TRANSFORM 用于层次数据的增强

http://s3/bmiddle/9d51fca2xb52a994af7f2&690

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

http://s2/bmiddle/9d51fca2xb52a99b48e21&690

为了便于管理,我们为每一个需要增强的数据源创建一个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

http://s16/bmiddle/9d51fca2xb52a9f1c4f2f&690

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

http://s14/bmiddle/9d51fca2xb52ab49d546d&690

保存后,返回Method界面

http://s2/bmiddle/9d51fca2xb52ac61cbbd1&690

点击Code

http://s11/bmiddle/9d51fca2xb52abf4b57da&690

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

http://s16/bmiddle/9d51fca2xb52aa88611df&690

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 测试提取,结果如下:

http://s9/bmiddle/9d51fca2xb52aa7d8f0f8&690

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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有