当系统提供的标准数据源或者我们自建的数据源无法满足要求时,我们可以通过增加几个字段来实现业务需求。
Sap增强方式一般来说有五种,我下面说的前三种可能搞过ABAP的都知道,user-exit,badi,modifcation,还有最新流行的两种就是ENHANCEMENT-POINT和隐式的ENHANCEMENT-POINT。这里我们只介绍User-Exit和BADI。
User-Exit
这个相对简单那,比较早,现在应用也很扩。
BADI
BAPI的增强,类似面向对象开发的接口,比较复杂。
Modifcation
修改SAP标准程序,这种方式风险较高,升级后有影响。
ENHANCEMENT-POINT
ECC5.0,nw 2004以后sap提供这个标准的增强方式,未来sap增强的趋势,应用场合广范,好处是不像user-exit那么难找,不像badi那么麻烦,只需在 业务所对应的FM中找就到ENHANCEMENT-POINT就可以,系统升级也不会有影响,只有你想不到的,没有你改不了的。
自建表: 如果是系统中完全自己建的表,即在R3标准数据源中根本见不到的结构,需要通过以下方法来实现:
输入T-code SBIW-->维护一般数据源
点击进入以下界面
其中分为业务数据、主数据属性以及文本,和标准数据源完全对应,所以不再赘述;
直接输入增强数据源名称,点击创建
其中应用程序组件就是需要选择增强数据源属于哪一模块,需要挂在那个标准数据源目录下;
输入文本描述,然后从右图的三个选项中选出提取的对象
从视图提取,就是从VIEW或者DB中直接提取数据;
从查询提取,即从query中提取;
按财务管理提取,从function(功能模块)中提取;
自己测试建立了一个从DB视图提取的增强数据源,先选择“视图/表”,如下:
然后点击页面左上方的“一般DELTA”维护增量机制;
其中的字段名就是用来做delta机制的字段,如果是凭证类字段,一般选择“数字指针”属性,对于日期字段,可以选择“时间标记”;
做完这些操作后,就可以直接保存,这样新增数据源就保存啦, 保存后需要做的就是和标准数据源一样,需要激活数据,这时候RSA5反而派不上用场了,因为在RSA5中我们找不到我们自己的增强,所以进入RSA6,在相应的目录下找到我们的增强,如下:
然后选中,点击左上方的“数据源”,选择“激活数据源”,就可以激活我们的增强,最后一步的操作就是进入R3端replicate一下,就看到了,over!
以上是对结构中没有的数据源增强的介绍,对于R3已有结构的增强需要看下面的介绍。
BW增强数据源 - 通过增加字段增强数据源(两种方法)
前言:我们经常会遇到系统标准的数据源,或者我们自建的数据源无法满足要求的情况,这个时候在数据源中添加几个相关的字段,可能就能满足我们的要求,这个时候就要用到数据源的增强。下面介绍的两种增强方法都是发生在数据源提取数据结束以后将要写到结果表的时候。
准备工作(自建数据源)
1)RSO2 创建一个简单的数据源:SFLIGHT 业务数据
选择一个应用程序组件,填写文本信息,直接到数据库SFLIGHT取数,点击保存
继续点击 保存
2)RSA6 选择刚刚创建的数据源 点击 下面中的“增强提取结构”。
创建一个附加结构,用系统自带的名称即可,点击“继续“。
填写短文本,及要增加的字段 (在此我们增加了一个字段FLAG,对于容量>=90%的航班,我们打算以FLAG为‘X’标记),然后点击激活按钮来激活附加结构。
RSA3 测试提取一下
ALV GRID查看一下提取结果
可以看到最后一个字段 标识,现在为空(例如第一条,占用374,容量385,使用率97.14%大于90%,但是现在标识仍然为空)
方法一:用户出口(User Exit)
1)CMOD 创建一个新项目 BW
2)填写短文本,保存,点击Enhancement assignments (增强分配)
3)分配增强“RSAP0001”(注:这个增强是固定的,每个系统都一样),保存,点击 组件
4)点击 激活组件
可以看到4个用户出口状态都已经变绿,选中用户出口,点击增强。
可知:001用于事务数据的数据源
002用于主数据或文本的数据源
003只能用于BW版本1.2B,2.0A以后被002替换
004用于层次的数据源
5)双击一个用户出口,进入Function Module界面
6)这个FM中,只是INCLUDE了一个程序,这个程序现在是不存在的,双击 ZXRSAU01
7)不要理会系统警告,回车
8)点击 是
INCLUEDE程序ZXRSAU01创建成功,下面就可以根据FM的输入输入参数进行CODING
*&------------------------------------------------------------------*
*& 包括 ZXRSAU01
*&------------------------------------------------------------------*
FIELD-SYMBOLS: <S> LIKE ZOXHHD0148.
DATA: RATE TYPE P DECIMALS 2.
*判断数据名称
CASE I_DATASOURCE.
WHEN 'SFLIGHT'.
*只有数据源为 SFLITH 时,才执行以下代码
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.
ENDCASE.
RSA3 测试提取,结果如下:
方法二:BAdI
BADI 是 Business Add-in 的缩写。它是一种新的功能增强概念,使用 ABAP 对象技术。这是一种使用面向对象的方法来进行 SAP 增强。实现 BADI 要用到类、接口及方法等面向对象的概念。
要对一个 SAP 应用程序进行增强,必须首先定义 BADI。为 BADI 创建一个接口,接着创建一个适配器类(Adapter Class)来实现��个接口, 然后创建这个适配器类的实例。
1)SE19
2)创建一个Implementation BAdI Name: RSU5_SAPI_BADI
Implementation Name: ZRSU5_SAPI_BADI
填写描述,点击激活这个Implementation
在Interface选项卡,会看到系统自动创建了一个class: ZCL_IM_RSU5_SAPI_BADI
双击这个class
进入Class Interface界面,会看到有两个method:
DATA_TRANSFORM 用于一般数据的增强(事务数据,主数据和文本)
HIER_TRANSFORM 用于层次数据的增强
双击method,就可以根据method的参数进行CODING了
为了便于管理,我们为每一个需要增强的数据源创建一个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
设置参数(只比DATA_TRANSFORM的参数少了一个I_DATASOURCE)如下:
保存后,返回Method界面
点击Code
下面就跟CMOD一样了,可以进行CODING了
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 测试提取,结果如下:
比较: 建议使用BAdI的方式, User Exit方式增强RSAP0001只能包含在一个项目中, 而BAdI方式可以为RSU5_SAPI_BADI创建多个Implementation,这样就可以为每个模块建一个Implementation,每个数据源建一个method,更加便于管理.