当业务顾问无法提供相关字段逻辑的时候,总会甩一个报表过来说,就参考这个报表的逻辑。话很简单,但实际坑很大。如果实在推不掉,只能强行读取另外一个报表的数据了。
当然,读取报表数据的方式有多种,本文章仅介绍通过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。