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

标签:
sapbw |
分类: 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
*&------------------------------------------------------------------*
*&
*&------------------------------------------------------------------*
DATA: RATE TYPE P DECIMALS 2.
DEFINE WA_FS.
END-OF-DEFINITION.
CASE I_DATASOURCE.
***数据源增强部分。
*判断数据名称
*只有数据源为 Z_SFLITH 时,才执行以下代码
*计算航班使用率
ENDCASE.
或者这样:
FIELD-SYMBOLS:<S>
DATA: RATE TYPE P DECIMALS 2.
*WA_FS
*只有数据源为
*计算航班使用率
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
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
CHANGING
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.
*计算航班使用率
IF RATE >= '90.00'.
ENDIF.
ENDLOOP.
ENDMETHOD.
RSA3 测试提取,结果如下:
http://s9/bmiddle/9d51fca2xb52aa7d8f0f8&690
比较: 建议使用BAdI的方式, User Exit方式增强RSAP0001只能包含在一个项目中,
而BAdI方式可以为RSU5_SAPI_BADI创建多个Implementation,这样就可以为每个模块建一个Implementation,每个数据源建一个method,更加便于管理.