抓取SAP报表ALV GRID上的数据

在开发的产销存报表的过程中,由于数据量过大,且取数逻辑太过于复杂,导致报表性能上很缓慢;

后来业务顾问要求直接在MB5B上取数,一开始有点纳闷,怎么从标准报表上取数。

于是从网络上搜索相关资料发现还真有,即将其转摘下来,以做备用。

 

文章出处:http://www.cnblogs.com/raychenfj/p/3194546.html

 

在项目开发过程中需要从标准报表 MB5B中获取数据,以下是本人实例中的相关部分,程序同样适用于获取其他标准报表的数据。


CL_SALV_BS_RUNTIME_INFO=>SET(
    DISPLAY = ABAP_FALSE
    METADATA = ABAP_FALSE
   DATA = ABAP_TRUE  ).

SUBMIT RM07MLBD                " Tcode MB5B
  WITH WERKS IN S_WERKS      " 填写筛选屏幕字段 
  WITH DATUM IN S_BUDAT
  WITH XSUM = ''
  WITH PA_SUMFL = 'X'
  WITH XCHAR = ''
  WITH LGBST = ''
  WITH BWBST = 'X'
  AND RETURN.

TRY.
    CL_SALV_BS_RUNTIME_INFO=>GET_DATA_REF(
    IMPORTING R_DATA = LS_DATA ).
  ASSIGN LS_DATA->* TO < LT_DATA >.

CATCH CX_SALV_BS_SC_RUNTIME_INFO.

  MESSAGE '无法获取ALV数据' TYPE 'E'.

ENDTRY.

CL_SALV_BS_RUNTIME_INFO=>CLEAR_ALL( ).

IF < LT_DATA > IS ASSIGNED.
  LOOP AT < LT_DATA > ASSIGNING < L_DATA >.
    MOVE-CORRESPONDING < L_DATA > TO LW_MB5B.
    APPEND LW_MB5B TO LT_MB5B.
    CLEAR LW_MB5B.
  ENDLOOP.
ENDIF.

另外,当首次使用的时候,无法确定内表定义字段时,可以在这断点,然后查看< LT_DATA >的字段;

以下是我 MB5B 中出现的字段:


 

8 条评论

  1. jevinxu 说:

    @gyon 额,那可能还真是增强包没更新的原因~~

  2. gyon 说:

    @jevinxu
    我在SE24中查询CL_SALV_BS_RUNTIME_INFO,提示说不存在,我用的是SAP R/3系统,我想问一下是因为系统的原因才会没有这个对象的吗?

  3. jevinxu 说:

    可以参考下,我这边的程序;需要注意的是,SUMBIT时候,在MB51屏幕上,所有变量都需要给到位。
    ——————————————————————————–
    DATA:lr_alv_data TYPE REF TO data.

    FIELD-SYMBOLS : TYPE ANY TABLE .
    FIELD-SYMBOLS : TYPE ANY.

    CLEAR so_budat. “MB5B查询日期范围
    CLEAR so_budat[].
    CONCATENATE ‘IBT’ gv_datum_e_low gv_datum_e_high INTO so_budat.
    APPEND so_budat.

    “如果未输入库存地点 则需要查询工厂下所有库存地点
    IF so_lgort[] IS INITIAL .
    SELECT werks lgort FROM t001l
    INTO TABLE lt_t001l
    WHERE werks EQ so_werks-low.

    LOOP AT lt_t001l.
    CONCATENATE ‘IEQ’ lt_t001l-lgort INTO so_lgort.
    APPEND so_lgort.
    CLEAR lt_t001l.
    ENDLOOP.
    ENDIF.

    LOOP AT so_lgort.
    *&———————————————————————*
    *& “计算特殊库存E的期初期末
    *&———————————————————————*
    cl_salv_bs_runtime_info=>set( EXPORTING display = abap_false
    metadata = abap_false
    data = abap_true ).
    CLEAR lr_alv_data.
    UNASSIGN .

    SUBMIT rm07mlbd “MB5B特殊库存及搜索条件
    WITH matnr IN so_matnr
    WITH werks IN so_werks
    WITH lgort EQ so_lgort-low “循环获取每个库存地点的期初期末
    WITH sobkz EQ ‘E’
    WITH datum IN so_budat
    “库存类型-特殊库存
    WITH lgbst EQ space
    WITH bwbst EQ space
    WITH sbbst EQ ‘X’
    “设置
    WITH xsum EQ space
    WITH pa_sumfl EQ ‘X’
    WITH xchar EQ space
    WITH xnomchb EQ space
    WITH xnomchb EQ space
    WITH nosto EQ space

    WITH pa_dbstd EQ ‘X’
    AND RETURN.

    TRY.
    cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = lr_alv_data ).

    ASSIGN lr_alv_data->* TO .
    CATCH cx_salv_bs_sc_runtime_info.

    MESSAGE ‘Unable to retrieve ALV data! Please try other conditions.’ TYPE ‘E’.
    ENDTRY.

    cl_salv_bs_runtime_info=>clear_all( ).


    IF
    IS ASSIGNED.
    UNASSIGN .
    LOOP AT ASSIGNING .
    CLEAR gt_stock.
    MOVE-CORRESPONDING
    TO gt_stock.
    gt_stock-lgort = so_lgort-low.
    COLLECT gt_stock.”此处区分汇总了所有库存地点的期初期末
    ENDLOOP.
    ENDIF.

    ENDLOOP.

  4. jevinxu 说:

    @gyon 是不是语法写错了,CL_SALV_BS_RUNTIME_INFO 是系统标准类,SET方法也是静态方法。
    可以在SE24里面查看该类方法:

    method set.

    cl_salv_bs_runtime_info=>clear_all( ).

    data:
    ls_runtime_info type s_type_runtime_info.

    ls_runtime_info-display = display.
    ls_runtime_info-metadata = metadata.
    ls_runtime_info-data = data.
    ls_runtime_info-structure = structure.
    ls_runtime_info-structure_line = structure_line.

    export s_runtime_info from ls_runtime_info to memory id cl_salv_bs_runtime_info=>c_memid_info.

    endmethod.

  5. gyon 说:

    运行不了啊,为什么我按什么这样写了之后,检查的时候提示说:The type “CL_SALV_BS_RUNTIME_INFO=>SET(” is unknown.

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>