SUBMIT 命令在 ME49/rm06eps0 报告中挂起
SUBMIT command hungs in ME49/rm06eps0 report
目标是使用class cl_salv_bs_runtime_info
从报告中读取ALV数据,然后创建自己的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.
在调试标准代码后,我发现一切都应该工作得很好。标准程序正在获取数据,并且 运行s REUSE_ALV_GRID_DISPLAY
正确。
但是在 ALV 网格代码之后有一个条件会产生问题。
程序中 ALV 的标准代码 FM06IF03
:
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 但没有成功。
关于如何让它发挥作用有什么想法吗?
我们需要用 CALL TRANSACTION
和 USING bdc_tab
选项替换 SUBMIT
。
这样,变量 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.
目标是使用class cl_salv_bs_runtime_info
从报告中读取ALV数据,然后创建自己的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.
在调试标准代码后,我发现一切都应该工作得很好。标准程序正在获取数据,并且 运行s REUSE_ALV_GRID_DISPLAY
正确。
但是在 ALV 网格代码之后有一个条件会产生问题。
程序中 ALV 的标准代码 FM06IF03
:
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 但没有成功。
关于如何让它发挥作用有什么想法吗?
我们需要用 CALL TRANSACTION
和 USING bdc_tab
选项替换 SUBMIT
。
这样,变量 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.