Иерархический отчет ALV, вызываемый через графический интерфейс, имеет 18 столбцов, а через RFC только 6. Почему?

Я хочу экспортировать отчет RM07MLBS (tcode mb52). Если я вызываю этот отчет через SAP-GUI, он содержит 18 столбцов, а если я вызываю его с помощью следующего кода, он возвращает только maktx, werks, matkl, matnr, name1, mtart столбца:

cl_salv_bs_runtime_info=>set(
 EXPORTING
   display  = abap_false
   metadata = abap_false
   data     = abap_true
).

SUBMIT (IV_REPORT_NAME)
   WITH SELECTION-TABLE selection_table
  AND RETURN.

DATA: lo_data TYPE REF TO data.

cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = lo_data ).

IF lo_data IS NOT BOUND.
  ev_result_json = '[]'.
  EXIT.
ENDIF.

field-SYMBOLS <lv_data> type any table.
ASSIGN lo_data->* TO <lv_data>.
ev_result_json = /ui2/cl_json=>serialize( data = <lv_data> pretty_name = /ui2/cl_json=>pretty_mode-low_case ).

cl_salv_bs_runtime_info=>clear_all( ).

Как получить все столбцы?


person guettli    schedule 05.11.2018    source источник
comment
Запуск исполняемой программы вместо кода транзакции может вести себя иначе. Если вы запустите программу без режима экспорта SALV, разве она не отобразит 6 столбцов? Если так, то вопрос не в SALV, а в том, как вы запускаете программу. Может быть сложно узнать причину, по которой он ведет себя по-другому (часто требуется отладка), и заставить его работать - это еще одна проблема.   -  person Sandra Rossi    schedule 05.11.2018
comment
MB52 отображает иерархический ALV (FM REUSE_ALV_HIERSEQ_LIST_DISPLAY), который использует две внутренние таблицы: заголовок и bestand (см. Программу RM07MLBS Line # 2652 в EHP8 SP9). Когда вы запускаете отчет, данные отображаются из обеих этих внутренних таблиц (вы можете нажать «Изменить макет» и увидеть заголовок и положение). Похоже, что когда вы пытаетесь поймать внутреннюю таблицу (cl_salv_bs_runtime_info = ›get_data_ref ...), она возвращает таблицу заголовков. Может быть, вы также можете попробовать использовать параметр r_data_line описанного выше метода и посмотреть, что произойдет.   -  person József Szikszai    schedule 05.11.2018
comment
@JozsefSzikszai, большое спасибо. Ты дал мне правильное направление. Чтобы поддержать других новичков, таких как я, у которых есть такая же проблема, я дам ответ на свой вопрос ниже.   -  person guettli    schedule 06.11.2018
comment
@guettli Нет проблем ... :)   -  person József Szikszai    schedule 06.11.2018
comment
@JozsefSzikszai спасибо за ваши подсказки. К сожалению, сейчас я столкнулся со следующей проблемой: stackoverflow.com/questions/53172303/   -  person guettli    schedule 06.11.2018
comment
@guettli: добавлен быстрый / короткий ответ   -  person József Szikszai    schedule 06.11.2018


Ответы (1)


Пользователь JozsefSzikszai дал мне необходимую подсказку, чтобы решить эту проблему.

Таким образом, я могу читать все столбцы из иерархического ALV.

SUBMIT (IV_REPORT_NAME)
   WITH SELECTION-TABLE selection_table
  AND RETURN.

FIELD-SYMBOLS <lt_data>             TYPE ANY TABLE.
FIELD-SYMBOLS <lt_data_line>        TYPE ANY TABLE.

DATA          lr_data               TYPE REF TO data.
DATA          lr_data_line          TYPE REF TO data.

cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data_descr      = DATA(lr_data_descr)
                                                 r_data_line_descr = DATA(lr_data_line_descr) ).

CREATE DATA lr_data         TYPE HANDLE lr_data_descr.
CREATE DATA lr_data_line    TYPE HANDLE lr_data_line_descr.
ASSIGN lr_data->*           TO <lt_data>.
ASSIGN lr_data_line->*      TO <lt_data_line>.

cl_salv_bs_runtime_info=>get_data(
  IMPORTING
    t_data      = <lt_data>
    t_data_line = <lt_data_line>
       ).

IF <lt_data> IS INITIAL.
  ev_result_json = '[]'.
  EXIT.
ENDIF.

ev_result_json = /ui2/cl_json=>serialize( data = <lt_data_line> pretty_name = /ui2/cl_json=>pretty_mode-low_case ).
cl_salv_bs_runtime_info=>clear_all( ).

ENDFUNCTION.

Мы приветствуем отзывы и советы, как это улучшить.

person guettli    schedule 06.11.2018
comment
Ваш код работает, но его можно значительно упростить, используя только два других параметра R_DATA и R_DATA_LINE метода GET_DATA_REF, и вы избавитесь от всех строк, которые используют классы RTTI (включая два параметра RTTI, две строки с CREATE DATA и строка вызова метода GET_DATA) - person Sandra Rossi; 10.11.2018