La commande SUBMIT est bloquée dans le rapport ME49 / rm06eps0

Oct 02 2020

Le but est d'utiliser la classe cl_salv_bs_runtime_infopour lire les données ALV du rapport et créer mon propre ALV par la suite.

Le rapport d'origine crée un ALV:

Le code pour capturer les données ALV est le suivant: (Il s'agit du code standard que j'ai utilisé avec de nombreux rapports 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.

Après avoir débogué le code standard, j'ai découvert que tout devrait fonctionner correctement. le programme standard obtient les données et s'exécute également REUSE_ALV_GRID_DISPLAYcorrectement.

MAIS juste après le code de grille ALV, il y a une condition qui crée le problème.

Code standard pour l'ALV dans le programme 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.

Comme vous pouvez le voir, toute la section est en WHILEboucle. Cette boucle while NE se termine PAS lors de l'utilisation de SUBMIT. La raison en est que la variable l_leave_swne devient jamais vraie.

Lorsque vous exécutez le rapport normalement, tout fonctionne correctement et l'ALV s'affiche.

J'ai essayé de définir sy-batchou sy-binptde true dans mon code, mais cela n'a pas abouti.

Des idées sur la façon de le faire fonctionner?

Réponses

1 e4rthdog Oct 03 2020 at 17:03

Nous devons remplacer l' option SUBMITpar CALL TRANSACTIONavec USING bdc_tab.

De cette façon, la variable sy-binptsera définie sur «X» et le rapport devrait se terminer correctement sans une boucle sans fin.

Code final après avoir simplement remplacé soumettre:

*&---------------------------------------------------------------------*
*& 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.