SAP ABAP 读取报表ALV数据

当业务顾问无法提供相关字段逻辑的时候,总会甩一个报表过来说,就参考这个报表的逻辑。话很简单,但实际坑很大。如果实在推不掉,只能强行读取另外一个报表的数据了。

当然,读取报表数据的方式有多种,本文章仅介绍通过ALV读取数据。(Ps.  Submit 详解 )

其实就是SUBMIT用法,建议先看看F1。

废话不说了,直接上代码。

以T-CODE:S_P99_41000062为例。

定义部分:

TYPES:
  BEGIN OF s_out, "-- from reort - RKKBMLMAT
    kalnr       TYPE ckmlhd-kalnr,
    mlast       TYPE ckmlhd-mlast,
    matnr       TYPE ckmlhd-matnr,
    bwkey       TYPE ckmlhd-bwkey,
    bwtar       TYPE ckmlhd-bwtar,
    sobkz       TYPE ckmlhd-sobkz,
    vbeln       TYPE ckmlhd-vbeln,
    posnr       TYPE ckmlhd-posnr,
    pspnr       TYPE ckmlhd-pspnr,
    bdatj       TYPE ckmlpp-bdatj,
    poper       TYPE ckmlpp-poper,
    ico_xsettle TYPE ckml_icon4,
    ico_xclose  TYPE ckml_icon4,
    curtp       TYPE ckmlcr-curtp,
    bklas       TYPE mbew-bklas,
    mtart       TYPE mara-mtart,
    matkl       TYPE mara-matkl,
    spart       TYPE mara-spart,
    ktext       TYPE makt-maktx,
    vprsv       TYPE ckmlcr-vprsv,
    lbkum       TYPE ckmlpp-lbkum,
    meins       TYPE mara-meins,
    salk3       TYPE ckmlcr-salk3,
    salkv       TYPE ckmlcr-salkv,
    eb_dif      TYPE cki_doc_ml-eb_dif,
    stprs       TYPE ckmlcr-stprs,
    pvprs       TYPE ckmlcr-pvprs,
    prabw_prz   TYPE ck_prabw_prz,
    peinh       TYPE ckmlcr-peinh,
    waers       TYPE waers,
  END OF s_out. "-- from reort - RKKBMLMAT
DATA: gt_price TYPE TABLE OF s_out,
      gs_price TYPE s_out.

DATA: gt_seltab TYPE TABLE OF rsparams,               "选择条件通用表
*      gt_seltab_comm TYPE TABLE OF rsparams,
      gs_seltab TYPE rsparams.
DATA: gv_programm TYPE ztdco000-programm.

DATA: gs_data TYPE REF TO data.                            "动态语法专用类型
FIELD-SYMBOLS: <gt_data>    TYPE table,
               <gs_data>    TYPE data,
               <dyn_wa>     TYPE any,
               <dyn_field>  TYPE any,
               <dyn_field2> TYPE any,
               <dyn_field3> TYPE any,
               <dyn_value>  TYPE any.

DEFINE mcr_catch_data.                                   "从动态结构中获取数据
  "&1: From 字段名  &2:To 字段名
  ASSIGN COMPONENT &1 OF STRUCTURE <gs_data> TO <dyn_field>.
  IF sy-subrc EQ 0 .
    &2 = <dyn_field>.
  ENDIF.
END-OF-DEFINITION.

调用部分:

"整理选择条件
  CLEAR:gt_seltab.
  IF p_werks IS NOT INITIAL.
    gt_seltab = VALUE #( BASE gt_seltab[]
    ( selname = 'P_WERKS' kind = 'P' sign = 'I' option = 'EQ' low = p_werks )
    ).
  ENDIF.
  IF s_matnr[] IS NOT INITIAL.
    LOOP AT s_matnr.
      gt_seltab = VALUE #( BASE gt_seltab[]
      ( selname = 'R_MATNR' kind = 'S' sign = s_matnr-sign option = s_matnr-option low = s_matnr-low high = s_matnr-high )
       ).
    ENDLOOP.
  ENDIF.

    "期间
    gt_seltab = VALUE #( BASE gt_seltab[]
      ( selname = 'P_POPER' kind = 'P' sign = 'I' option = 'EQ' low = sy-datum+4(2) )
      ).
    "年度
    gt_seltab = VALUE #( BASE gt_seltab[]
    ( selname = 'P_BDATJ' kind = 'P' sign = 'I' option = 'EQ' low = sy-datum(4) )
    ).

  "设置ALV - 不显示
  cl_salv_bs_runtime_info=>set(   display  = ''
                                  metadata = ''
                                  data     = 'X'  ).

  "调用程序
  SUBMIT RKKBMLMAT WITH SELECTION-TABLE gt_seltab AND RETURN.

  TRY.
      cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = gs_data ).
      ASSIGN gs_data->* TO <gt_data>.

    CATCH cx_salv_bs_sc_runtime_info.
      MESSAGE 'UNABLE TO RETRIEVE ALV DATA' TYPE 'E'.

  ENDTRY.

  cl_salv_bs_runtime_info=>clear_all( ).

内表处理部分:

  "转换数据
  IF <gt_data> IS ASSIGNED.
    LOOP AT <gt_data> ASSIGNING <gs_data>.
      CLEAR:gs_price.
      mcr_catch_data 'MATNR'      gs_price-matnr."
      mcr_catch_data 'BWKEY'      gs_price-bwkey."
      mcr_catch_data 'VPRSV'      gs_price-vprsv."
      mcr_catch_data 'SALK3'      gs_price-salk3."
      mcr_catch_data 'SALKV'      gs_price-salkv."
      mcr_catch_data 'STPRS'      gs_price-stprs."
      mcr_catch_data 'PVPRS'      gs_price-pvprs."
      APPEND gs_price TO gt_price.
    ENDLOOP.
  ENDIF.

注意:

这里在接收ALV数据时,最好不要直接使用原报表ALV结构的内表,而是用Field Symbol转换,主要考虑后期原报表可能变更,会导致本程序直接Dump。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值