BW增强数据源的两种方法

2009-04-01, by SAPBI

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

准备工作(自建数据源)

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增强数据源的两种方法的更多相关文章

  1. Java学习笔记——可视化Swing中JTable控件绑定SQL数据源的两种方法

    在 MyEclipse 的可视化 Swing 中,有 JTable 控件. JTable 用来显示和编辑常规二维单元表. 那么,如何将 数据库SQL中的数据绑定至JTable中呢? 在这里,提供两种方 ...

  2. DataTable的筛选,过滤后绑定数据源的两种方法(DataTable的select和使用linq返回List集合)

    一般数据处理使用DataTable的情况会很多,而我们很多时候会对得到的DataTable的数据进行筛选后绑定到Combobox.GridView.Repeat等控件中,现在分享一下两种DataTab ...

  3. HibernateTemplate、HibernateDaoSupport两种方法实现增删改查Good(转)

    Spring+Hibernate两种方法实现增删改查 首先,定义一个Customer的bean类,设置好Customer.hbm.xml文件.再定义好一个Dao接口.准备好一个jdbc.propert ...

  4. 安卓ListView操作的两种方法

    举例做一个微信的中间部分(好友消息等信息通知) 第一种:BaseAdapter() package com.example.wx; import java.util.ArrayList;import ...

  5. DataGridView显示数据的两种方法

    1.简介 DataGridView空间是我们经常使用的显示数据的控件,它有极高的可配置性和可扩展性. 2.显示数据 DataGridView显示数据一般我们经常使用的有两种方法,一种是直接设置Data ...

  6. C++类的实例化的两种方法

    C++ 类的实例化有两种方法: 直接定义对象: 先定义一个类:   class A { public: A(); virtual ~A(); ... ... };   类实现略. 用的时候: A a; ...

  7. 转载]PhpCms V9调用指定栏目子栏目文章的两种方法

    PhpCms V9调用指定栏目子栏目文章的两种方法 第一种.直接写子栏目id ,用cat in {pc:get sql="SELECT * from v9_news where status ...

  8. C++连接mysql数据库的两种方法

    本文主要介绍了C++连接mysql数据库的两种方法,希望通过本文,能对你有所帮助,一起来看. 现在正做一个接口,通过不同的连接字符串操作不同的数据库.要用到mysql数据库,以前没用过这个数据库,用a ...

  9. 可采用两种方法得到一个EJB对象

    (本文是转载其他人的技术文章,觉得说得挺浅显易懂,特借来学习)     在前面学习的例子中,只有一个EJB,但是对于一个真实的项目,EJB的数量可以有很多,而且EJB之间也会互相调用,那么在一个EJB ...

随机推荐

  1. HTML5 localStorage and sessionStorage

    转载至:http://blog.csdn.net/fdipzone/article/details/25517615 HTML5 提供两种web存储方法,localStorage 与 sessionS ...

  2. HTML5自学笔记[ 12 ]canvas绘图小示例之鼠标画线

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  3. 菜单滑动-menu swipe

    http://tympanus.net/codrops/ http://www.idangero.us/sliders/swiper/index.php //触摸滑动

  4. Runner之记计账项目的典型用户分析

  5. Hibernate映射之实体映射

    1.使用@注解配置实体类 实体类一般有ID.普通属性.集合属性等,分别对应数据库的主键.普通列.外键.@注解配置中,实体类用@Entity注解,用@Table指定对应的数据表,用@Id配置主键,用@C ...

  6. <mvc:annotation-driven />注解意义

    <mvc:annotation-driven /> 是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案. <mvc:annotation-dr ...

  7. js从千分位格式

    从千分位格式化谈JS性能优化 http://heeroluo.net/article/detail/115 方法六 // 方法六 function toThousands(num) { ).toStr ...

  8. 9. shell环境

    • printenv –打印部分或所有的环境变量 • set –设置 shell 选项 • export —导出环境变量,让随后执行的程序知道. • alias –创建命令别名 1.shell环境:s ...

  9. ThoughtWorks微服务架构交流心得

      ThoughtWorks微服务架构交流心得: (1)<人月神话>中谈到软件开发没有银弹,根源在于软件所解决的领域问题本身固有的复杂性,微服务正是从领域问题角度上进行服务拆分,来降低软件 ...

  10. ORACLE 一致性读原理记录

    什么是一致性读? 一致性读指的是在从查询那一刻起,中间的变化不予理会. 举例说明 比如我有两个帐户A,B. A 有1000块,B有1000快.我查询的时候查询速度比较慢.中间A转500到B账户. 已经 ...