BW增强数据源的两种方法
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
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,更加便于管理.
BW增强数据源的两种方法的更多相关文章
- Java学习笔记——可视化Swing中JTable控件绑定SQL数据源的两种方法
		
在 MyEclipse 的可视化 Swing 中,有 JTable 控件. JTable 用来显示和编辑常规二维单元表. 那么,如何将 数据库SQL中的数据绑定至JTable中呢? 在这里,提供两种方 ...
 - DataTable的筛选,过滤后绑定数据源的两种方法(DataTable的select和使用linq返回List集合)
		
一般数据处理使用DataTable的情况会很多,而我们很多时候会对得到的DataTable的数据进行筛选后绑定到Combobox.GridView.Repeat等控件中,现在分享一下两种DataTab ...
 - HibernateTemplate、HibernateDaoSupport两种方法实现增删改查Good(转)
		
Spring+Hibernate两种方法实现增删改查 首先,定义一个Customer的bean类,设置好Customer.hbm.xml文件.再定义好一个Dao接口.准备好一个jdbc.propert ...
 - 安卓ListView操作的两种方法
		
举例做一个微信的中间部分(好友消息等信息通知) 第一种:BaseAdapter() package com.example.wx; import java.util.ArrayList;import ...
 - DataGridView显示数据的两种方法
		
1.简介 DataGridView空间是我们经常使用的显示数据的控件,它有极高的可配置性和可扩展性. 2.显示数据 DataGridView显示数据一般我们经常使用的有两种方法,一种是直接设置Data ...
 - C++类的实例化的两种方法
		
C++ 类的实例化有两种方法: 直接定义对象: 先定义一个类: class A { public: A(); virtual ~A(); ... ... }; 类实现略. 用的时候: A a; ...
 - 转载]PhpCms V9调用指定栏目子栏目文章的两种方法
		
PhpCms V9调用指定栏目子栏目文章的两种方法 第一种.直接写子栏目id ,用cat in {pc:get sql="SELECT * from v9_news where status ...
 - C++连接mysql数据库的两种方法
		
本文主要介绍了C++连接mysql数据库的两种方法,希望通过本文,能对你有所帮助,一起来看. 现在正做一个接口,通过不同的连接字符串操作不同的数据库.要用到mysql数据库,以前没用过这个数据库,用a ...
 - 可采用两种方法得到一个EJB对象
		
(本文是转载其他人的技术文章,觉得说得挺浅显易懂,特借来学习) 在前面学习的例子中,只有一个EJB,但是对于一个真实的项目,EJB的数量可以有很多,而且EJB之间也会互相调用,那么在一个EJB ...
 
随机推荐
- 【bzoj1041】圆上的整点
			
题意 给定一个圆\(x^2+y^2=z^2\),求圆周上有多少个点的坐标是整数. \(r\leq 2*10^9\) 分析 这道题目关键要知道一些勾股数的性质,剩下的就很好处理了. 勾股数的性质 参考: ...
 - Java虚拟机类加载机制——案例分析
			
转载: Java虚拟机类加载机制--案例分析 在<Java虚拟机类加载机制>一文中详细阐述了类加载的过程,并举了几个例子进行了简要分析,在文章的最后留了一个悬念给各位,这里来揭开这个悬 ...
 - 《基于MVC的Javascript》
			
var Class = function(){ var klass = function(){ this.init.apply(this,arguments); } klass.prototype.i ...
 - Linux配置邮箱发送(MUTT/MSMTPQ)
			
配置邮箱发送 http://www.ilanni.com/?p=10589
 - la----3695 City Game(最大子矩阵)
			
Bob is a strategy game programming specialist. In his new city building game the gaming environment ...
 - Android 编程下的代码混淆
			
什么是代码混淆 Java 是一种跨平台的.解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中.由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名.方法名,并且通 ...
 - springmvc:BeanNameViewResolver访问内部资源视图对象和访问外部资源视图对象
			
<!-- 处理器映射器 --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerM ...
 - SVMshow
			
SVMshow % http://www.peteryu.ca/tutorials/matlab/visualize_decision_boundaries % load RankData % Num ...
 - Objective-C(面向对象的三大特性)
			
封装 set方法 作用:提供一个方法给外界设置成员变量值,可以在方法里面进行过滤 命名规范 1. 方法名必须以set开头 2. set后面跟上成员变量的名称,成员变量的首字母必须大写 3. 返回值一定 ...
 - Go运行环境搭建(Mac\Linux)
			
转载:http://blog.csdn.net/nellson/article/details/51523159 1. 下载安装文件 http://www.golangtc.com/download ...