ABAP:SUBMIT执行其他报表并返回的数据
https://blog.****.net/m0_37062693/article/details/75050216
有些情况我们需要取一些标准报表的数据,如果自己重写比较复杂,用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.****.net/zhongguomao/article/details/50924058