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


    BW增强数据源的两种方法

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

    准备工作(自建数据源)

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

    clip_image002

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

    clip_image004

    继续点击 保存

    clip_image006

    2)RSA6 选择刚刚创建的数据源 点击 clip_image008

    clip_image010

    创建一个附加结构,用系统自带的名称即可,点击clip_image012

    clip_image014

    填写短文本,及要增加的字段 (在此我们增加了一个字段FLAG,对于容量>=90%的航班,我们打算以FLAG为‘X’标记),然后点击clip_image016 激活附加结构

    clip_image018

    RSA3 测试提取一下

    clip_image020

    ALV GRID查看一下提取结果

    clip_image022

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

    clip_image024

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

    1)CMOD 创建一个新项目 BW

    clip_image026

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

    clip_image028

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

    clip_image030

    4)点击clip_image032 激活组件

    clip_image034

    可以看到4个用户出口状态都已经变绿,选中用户出口,点击clip_image036

    clip_image038

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

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

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

    004用于层次的数据源

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

    clip_image040

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

    clip_image042

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

    clip_image044

    8)点击 是

    clip_image046

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

    clip_image048

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

    clip_image050

    方法二:BAdI

    1)SE19

    clip_image052

    2)创建一个Implementation BAdI Name: RSU5_SAPI_BADI

    clip_image054

    Implementation Name: ZRSU5_SAPI_BADI

    clip_image056

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

    clip_image058

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

    双击这个class

    clip_image060

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

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

    HIER_TRANSFORM 用于层次数据的增强

    clip_image062

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

    clip_image064

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

    clip_image066

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

    clip_image068

    保存后,返回Method界面

    clip_image070

    点击Code

    clip_image072

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

    clip_image074

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

    clip_image050[1]

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

  • 相关阅读:
    DJango简单的后台定义登录验证
    简单聊聊HTTP/TCP/IP协议
    简单的线程说明
    设计模式 -- 常用设计模式
    网络知识 -- 第二部
    c#利用脚本,本地执行linux命令
    Json和类之间的转化
    关于地址映射穿透和套接字复用的说明
    多线程调用中的注意事项
    Task多线程的常规用法
  • 原文地址:https://www.cnblogs.com/goodsmith/p/3420790.html
Copyright © 2020-2023  润新知