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-batchsy-binpt 设置为 true 但没有成功。

关于如何让它发挥作用有什么想法吗?

我们需要用 CALL TRANSACTIONUSING 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.