问题描述
目标是使用类cl_salv_bs_runtime_info
从报告中读取ALV数据并随后创建自己的ALV。
捕获ALV数据的代码如下:(这是我用于许多ALV报告的标准代码)。
REPORT zhgirm06eps0.
FIELD-SYMBOLS <lt_data> TYPE ANY TABLE.
DATA lr_data TYPE REF TO data.
cl_salv_bs_runtime_info=>set(
EXPORTING display = abap_false
Metadata = abap_false
data = abap_true ).
SUBMIT RM06EPS0 AND RETURN.
TRY.
cl_salv_bs_runtime_info=>get_data_ref(
IMPORTING r_data = lr_data ).
ASSIGN lr_data->* TO <lt_data>.
CATCH cx_salv_bs_sc_runtime_info.
MESSAGE `Unable to retrieve ALV data` TYPE 'E'.
ENDTRY.
cl_salv_bs_runtime_info=>clear_all( ).
LOOP AT <lt_data> ASSIGNING FIELD-SYMBOL(<line>).
...
ENDLOOP.
调试标准代码后,我发现一切正常。标准程序正在获取数据,并且还可以正确运行REUSE_ALV_GRID_disPLAY
。
程序FM06IF03
中ALV的标准代码:
WHILE l_leave_sw IS INITIAL.
...
CALL FUNCTION 'REUSE_ALV_GRID_disPLAY'
...
IF ls_exit_caused_by_user = 'X' OR "1094328
sy-batch = 'X' OR sy-binpt = 'X'.
l_leave_sw = 'X'.
ENDIF.
ENDWHILE.
如您所见,整个部分处于WHILE
循环中。使用SUBMIT
时,不会退出while循环。原因是变量l_leave_sw
永远不会为真。
正常运行报表时,一切正常,并显示ALV。
我尝试在我的代码中将sy-batch
或sy-binpt
设置为true,但未成功。
关于如何使其工作的任何想法?
解决方法
我们需要使用SUBMIT
选项将CALL TRANSACTION
替换为USING bdc_tab
。
通过这种方式,变量sy-binpt
将被设置为'X',并且报表应正确退出而不会出现无限循环。
仅替换提交后的最终代码:
*&---------------------------------------------------------------------*
*& Report zhgirm06eps0
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zhgirm06eps0.
FIELD-SYMBOLS <lt_data> TYPE ANY TABLE.
DATA lr_data TYPE REF TO data.
TYPES:
BEGIN OF lr_record,icon_rang TYPE mere_icon_rang,ebeln TYPE ebeln,ebelp TYPE ebelp,lifnr TYPE lifnr,name1 TYPE name1,submi TYPE submi,ptext TYPE ptext_d,matnr TYPE matnr,matkl TYPE matkl,txz01 TYPE txz01,menge TYPE ktmng,meins TYPE meins,netpr TYPE netpr,zwert TYPE netwr,waers TYPE waers,rang TYPE rang,proze TYPE proze,gzwert TYPE netwr,grang TYPE rank_abs,gproze TYPE rank_per,infnr TYPE infnr,log1 TYPE merel_info,log2 TYPE merel_info,END OF lr_record.
DATA: lr_records TYPE TABLE OF lr_record WITH HEADER LINE,l_record TYPE lr_record.
cl_salv_bs_runtime_info=>set(
EXPORTING display = abap_false
metadata = abap_false
data = abap_true ).
DATA bdc_tab TYPE TABLE OF bdcdata.
CALL TRANSACTION 'ME49' USING bdc_tab.
TRY.
cl_salv_bs_runtime_info=>get_data_ref(
IMPORTING r_data = lr_data ).
ASSIGN lr_data->* TO <lt_data>.
CATCH cx_salv_bs_sc_runtime_info.
MESSAGE `Unable to retrieve ALV data` TYPE 'E'.
ENDTRY.
cl_salv_bs_runtime_info=>clear_all( ).
LOOP AT <lt_data> ASSIGNING FIELD-SYMBOL(<line>).
MOVE-CORRESPONDING <line> TO lr_records.
APPEND lr_records.
ENDLOOP.