有些情况我们需要取一些标准报表的数据,如果自己重写比较复杂,用SUBMIT … AND RETURN可以调用标准报表并获取获取返回值。
参考:ZEROTEST69
语法:SUBMIT [程序名] WITH [调用程序屏幕的参数名]IN/= 值 AND RETURN
加上 EXPORTING LIST TO MEMORY 将程序返回的alv输出到MEMORY可以用函数取出
网上也有很多类似的例子,这里自己以MB5B测试了一个例子
列子:
*&---------------------------------------------------------------------*
*& Report ZEROTEST69
*& 测试直接取MB5B 历史库存的数据
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT zerotest69.
TABLES: t001w,mard,mkpf.
DATA:ls_data TYPE REF TO data.
FIELD-SYMBOLS: <lt_data> TYPE table,
<l_data> TYPE data.
DATA BEGIN OF itab_list OCCURS 0.
INCLUDE STRUCTURE abaplist.
DATA END OF itab_list.
DATA:BEGIN OF t_str OCCURS 0,
str(20) TYPE c,
END OF t_str.
DATA: BEGIN OF vlist OCCURS 0, "这个调用程序ALV输出的长度要根据实际长度来确认
filler1(100) TYPE c,
field1(50) TYPE c,
filler(50) TYPE c,
field2(50) TYPE c,
filler3(50) TYPE c,
END OF vlist.
DATA: str1(100) TYPE c,
str2(100) TYPE c.
SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE text-bl1.
SELECT-OPTIONS:
s_werks FOR t001w-werks,
s_matnr FOR mard-matnr,
s_budat FOR mkpf-budat.
SELECTION-SCREEN END OF BLOCK bl1.
START-OF-SELECTION.
PERFORM get_mb5b_data.
*&---------------------------------------------------------------------*
*& Form get_mb5b_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM get_mb5b_data.
* 以下此句如果加上 程序获取不到数据,具体原因未知
cl_salv_bs_runtime_info=>set(
display = abap_false
metadata = abap_false
data = abap_true ).
SUBMIT rm07mlbd WITH werks IN s_werks WITH matnr IN s_matnr WITH datum IN s_budat WITH lgbst = 'X' AND RETURN EXPORTING LIST TO MEMORY."TCODE:MB5B
CALL FUNCTION 'LIST_FROM_MEMORY'
TABLES
listobject = itab_list
EXCEPTIONS
not_found = 4
OTHERS = 8.
CALL FUNCTION 'LIST_TO_ASCI'
EXPORTING
list_index = -1
TABLES
listasci = vlist
listobject = itab_list
EXCEPTIONS
empty_list = 1
list_index_invalid = 2
OTHERS = 3.
IF sy-subrc = 0.
READ TABLE vlist INDEX 5.
IF sy-subrc = 0 .
SPLIT vlist-filler1 AT '' INTO TABLE t_str . "根据空格拆分
ENDIF.
ENDIF.
DELETE t_str WHERE str = ''. "删除空行
READ TABLE t_str INDEX 3.
IF sy-subrc = 0.
WRITE: t_str-str.
ENDIF.
* 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 gt_tab.
** APPEND gt_tab.
* ENDLOOP.
* ENDIF.
ENDFORM. "
测试界面:
测试结果:
输出的库存和MB5B的结果是一样的
MB5B界面:
MB5B结果:
字符串处理一下可以得到总库存:
测试控制台:
参考:http://blog.csdn.net/zhongguomao/article/details/50924058
---------------------
作者:zero灬小火柴
来源:CSDN
原文:https://blog.csdn.net/m0_37062693/article/details/75050216
版权声明:本文为博主原创文章,转载请附上博文链接!