La commande SUBMIT est bloquée dans le rapport ME49 / rm06eps0
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
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.