https://blog.csdn.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.csdn.net/zhongguomao/article/details/50924058