Function Module-如何基于簇表建立数据源

MISSION: 基于簇表建立数据源。

难度:簇表不能用RSO2直接建立数据源,也不能建VIEW来建数据源。所以只能用FM。

SAP 有一个 FM: RSAX_BIW_GET_DATA_SIMPLE,可以作为样板。代码如下:

 

RSAX_BIW_GET_DATA_SIMPLE

 

FUNCTION ZBW_SD_YUFEI1.
*"--------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_REQUNR) TYPE  SRSC_S_IF_SIMPLE-REQUNR
*"     VALUE(I_DSOURCE) TYPE  SRSC_S_IF_SIMPLE-DSOURCE OPTIONAL
*"     VALUE(I_MAXSIZE) TYPE  SRSC_S_IF_SIMPLE-MAXSIZE OPTIONAL
*"     VALUE(I_INITFLAG) TYPE  SRSC_S_IF_SIMPLE-INITFLAG OPTIONAL
*"     VALUE(I_READ_ONLY) TYPE  SRSC_S_IF_SIMPLE-READONLY OPTIONAL
*"     VALUE(I_REMOTE_CALL) TYPE  SBIWA_FLAG DEFAULT SBIWA_C_FLAG_OFF
*"  TABLES
*"      I_T_SELECT TYPE  SRSC_S_IF_SIMPLE-T_SELECT OPTIONAL
*"      I_T_FIELDS TYPE  SRSC_S_IF_SIMPLE-T_FIELDS OPTIONAL
*"      E_T_DATA STRUCTURE  ZBWS001 OPTIONAL
*"  EXCEPTIONS
*"      NO_MORE_DATA
*"      ERROR_PASSED_TO_MESS_HANDLER
*"--------------------------------------------------------------------

* Example: DataSource for table SFLIGHT
  TABLES: KONV.

  DATA: wa_zKONV LIKE LINE OF e_t_data,
        l_tline LIKE tline OCCURS 0 WITH HEADER LINE,
        l_name(70) TYPE c.

  DATA: rsal_save_subrc LIKE sy-subrc,
        rsal_s_logparms LIKE rslogparms.

  DEFINE log_write.
    rsal_save_subrc = sy-subrc.
    rsal_s_logparms-msgty = &1.
    rsal_s_logparms-msgid = &2.
    rsal_s_logparms-msgno = &3.
    rsal_s_logparms-msgv1 = &4.
    rsal_s_logparms-msgv2 = &5.
    call function 'RSAL_LOG_WRITE'
         exporting
              i_msgty      = rsal_s_logparms-msgty
              i_msgid      = rsal_s_logparms-msgid
              i_msgno      = rsal_s_logparms-msgno
              i_msgv1      = rsal_s_logparms-msgv1
              i_msgv2      = rsal_s_logparms-msgv2.
    sy-subrc = rsal_save_subrc.
  END-OF-DEFINITION.



* Auxiliary Selection criteria structure
  DATA: l_s_select TYPE srsc_s_select.

* Maximum number of lines for DB table
  STATICS: s_s_if TYPE srsc_s_if_simple,

* counter
          s_counter_datapakid LIKE sy-tabix,

* cursor
          s_cursor TYPE cursor.

* Select ranges
  RANGES: l_r_KNUMV  FOR KONV-KNUMV,
          l_r_KPOSN  FOR KONV-KPOSN,
          l_r_STUNR  FOR KONV-STUNR,
          l_r_ZAEHK  FOR KONV-ZAEHK,
          l_r_KSCHL  FOR KONV-KSCHL,
          l_r_KBETR FOR KONV-KBETR.


* Initialization mode (first call by SAPI) or data transfer mode
* (following calls) ?
  IF i_initflag = sbiwa_c_flag_on.

************************************************************************
* Initialization: check input parameters
*                 buffer input parameters
*                 prepare data selection
************************************************************************

* Check DataSource validity
    CASE i_dsource.
      WHEN 'Z_BW_001'.
      WHEN OTHERS.
        IF 1 = 2.
          MESSAGE e009(r3).
        ENDIF.
* this is a typical log call. Please write every error message like this
        log_write 'E'                  "message type
                  'R3'                 "message class
                  '009'                "message number
                  i_dsource   "message variable 1
                  ' '.                 "message variable 2
        RAISE error_passed_to_mess_handler.
    ENDCASE.

    APPEND LINES OF i_t_select TO s_s_if-t_select.

* Fill parameter buffer for data extraction calls
    s_s_if-requnr    = i_requnr.
    s_s_if-dsource = i_dsource.
    s_s_if-maxsize   = i_maxsize.

* Fill field list table for an optimized select statement
* (in case that there is no 1:1 relation between InfoSource fields
* and database table fields this may be far from beeing trivial)
    APPEND LINES OF i_t_fields TO s_s_if-t_fields.

  ELSE.                 "Initialization mode or data extraction ?

************************************************************************
* Data transfer: First Call      OPEN CURSOR + FETCH
*                Following Calls FETCH only
************************************************************************

* First data package -> OPEN CURSOR
    IF s_counter_datapakid = 0.

* Fill range tables BW will only pass down simple selection criteria
* of the type SIGN = 'I' and OPTION = 'EQ' or OPTION = 'BT'.
      LOOP AT s_s_if-t_select INTO l_s_select WHERE fieldnm = 'KNUMV'.
        MOVE-CORRESPONDING l_s_select TO l_r_KNUMV.
        APPEND l_r_KNUMV.
      ENDLOOP.

      LOOP AT s_s_if-t_select INTO l_s_select WHERE fieldnm = 'KPOSN'.
        MOVE-CORRESPONDING l_s_select TO l_r_KPOSN.
        APPEND l_r_KPOSN.
      ENDLOOP.


      LOOP AT s_s_if-t_select INTO l_s_select WHERE fieldnm = 'STUNR'.
        MOVE-CORRESPONDING l_s_select TO l_r_STUNR.
        APPEND l_r_STUNR.
      ENDLOOP.

      LOOP AT s_s_if-t_select INTO l_s_select WHERE fieldnm = 'ZAEHK'.
        MOVE-CORRESPONDING l_s_select TO l_r_ZAEHK.
        APPEND l_r_ZAEHK.
      ENDLOOP.

       LOOP AT s_s_if-t_select INTO l_s_select WHERE fieldnm = 'KSCHL'.
        MOVE-CORRESPONDING l_s_select TO l_r_KSCHL.
        APPEND l_r_KSCHL.
      ENDLOOP.

       LOOP AT s_s_if-t_select INTO l_s_select WHERE fieldnm = 'KBETR'.
        MOVE-CORRESPONDING l_s_select TO l_r_KBETR.
        APPEND l_r_KBETR.
      ENDLOOP.

* Determine number of database records to be read per FETCH statement
* from input parameter I_MAXSIZE. If there is a one to one relation
* between DataSource table lines and database entries, this is trivial.
* In other cases, it may be impossible and some estimated value has to
* be determined.
      OPEN CURSOR WITH HOLD s_cursor FOR
*      SELECT (s_s_if-t_fields) FROM mchb
      SELECT KNUMV KPOSN KSCHL KBETR
      FROM KONV
     WHERE KONV~KNUMV IN l_r_KNUMV
       AND KONV~KPOSN IN l_r_KPOSN
       AND KONV~STUNR IN l_r_STUNR
       AND KONV~ZAEHK IN l_r_ZAEHK
       AND KONV~KSCHL IN l_r_KSCHL
       AND KONV~KBETR IN l_r_KBETR.

    ENDIF.                             "First data package ?

* Fetch records into interface table.
*   named E_T_'Name of extract structure'.
    FETCH NEXT CURSOR s_cursor
    APPENDING CORRESPONDING FIELDS OF TABLE e_t_data
    PACKAGE SIZE s_s_if-maxsize.

    IF sy-subrc <> 0.
      CLOSE CURSOR s_cursor.
      RAISE no_more_data.
    ENDIF.


    LOOP AT e_t_data INTO wa_zkonv.


*******The feature values
*      IF wa_zmch1_mchb-cuobj_bm IS NOT INITIAL.
*        SELECT SINGLE atflv FROM ausp INTO wa_zmch1_mchb-atflv1
*         WHERE objek = wa_zmch1_mchb-cuobj_bm
*           AND klart = '023'
*           AND atinn = '0000000001'.
*
*        SELECT SINGLE atflv FROM ausp INTO wa_zmch1_mchb-atflv2
*        WHERE objek = wa_zmch1_mchb-cuobj_bm
*          AND klart = '023'
*          AND atinn = '0000000002'.
*
*        SELECT SINGLE atflv FROM ausp INTO wa_zmch1_mchb-atflv3
*         WHERE objek = wa_zmch1_mchb-cuobj_bm
*           AND klart = '023'
*           AND atinn = '0000000003'.
*
*        SELECT SINGLE atwrt FROM ausp INTO wa_zmch1_mchb-atwrt1
*         WHERE objek = wa_zmch1_mchb-cuobj_bm
*           AND klart = '023'
*           AND atinn = '0000000006'.
*
*        SELECT SINGLE atwrt FROM ausp INTO wa_zmch1_mchb-atwrt2
*         WHERE objek = wa_zmch1_mchb-cuobj_bm
*           AND klart = '023'
*           AND atinn = '0000000007'.
*
*        SELECT SINGLE atwrt FROM ausp INTO wa_zmch1_mchb-atwrt3
*         WHERE objek = wa_zmch1_mchb-cuobj_bm
*           AND klart = '023'
*           AND atinn = '0000000013'.
*
*        SELECT SINGLE atwrt FROM ausp INTO wa_zmch1_mchb-atwrt4
*         WHERE objek = wa_zmch1_mchb-cuobj_bm
*           AND klart = '023'
*           AND atinn = '0000000014'.
*      ENDIF.



                .
      IF sy-subrc <> 0.
        MESSAGE 'NO DATA' TYPE 'S'.
* Implement suitable error handling here
      ENDIF.

      READ TABLE l_tline INDEX 1.
*      wa_zkonv-chtxt = l_tline-tdline.


      MODIFY e_t_data FROM wa_zkonv.
    ENDLOOP.

    s_counter_datapakid = s_counter_datapakid + 1.

  ENDIF.              "Initialization mode or data extraction ?

ENDFUNCTION.

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值