ALV Grid для встроенной декларации
Как вы отображаете встроенный объявленный тип данных в сетке ALV?
например:
SELECT *
INTO TABLE @DATA(lt_result)
FROM table.
Как можно lt_result
отображаться в сетке ALV?
2 ответа
Вот основной пример:
DATA: alv TYPE REF TO cl_salv_table.
SELECT *
INTO TABLE @DATA(lt_result)
FROM table.
cl_salv_table=>factory( IMPORTING r_salv_table = alv
CHANGING t_table = lt_result ).
alv->display( ).
Вы можете найти другие примеры, используя объектную модель SALV в пакете SALV_OM_OBJECTS.
Это более современный подход, чем использование REUSE_ALV_GRID_DISPLAY, и вам не нужно определять каталог полей.
Вы должны сделать то же самое, независимо от того, как вы создали lt_result. select *
как в вашем примере приведет к тому, что lt_result будет равен, если вы сделали DATA lt_result type table of tablename
В этом случае вы можете отправить имя структуры. Но это работает, только если тип структуры определен в SE11, т.е. если вы делаете select *
без каких-либо соединений или псевдонимов.
В противном случае вам нужно создать и отправить в каталог полей все поля в lt_result, которые вы хотите отобразить.
Пример:
SELECT * FROM mara
UP TO 10 ROWS
INTO TABLE @DATA(lt_mara).
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = sy-repid
i_structure_name = 'MARA'
* it_fieldcat => use this if i_structure_name is not sufficient
TABLES
t_outtab = lt_mara
EXCEPTIONS
OTHERS = 1.
То же самое относится, если вы используете cl_gui_alv_grid.
Изменить: Вы можете заполнить поле каталога динамически, как это:
DATA:
lo_t_struct TYPE REF TO cl_abap_tabledescr,
lo_struct TYPE REF TO cl_abap_structdescr.
lo_t_struct ?= cl_abap_tabledescr=>describe_by_data( lt_result ).
lo_struct ?= lo_t_struct->get_table_line_type( ).
LOOP AT lo_struct->components ASSIGNING FIELD-SYMBOL(<comp>).
"Fill a range-table with <comp>-name
ENDLOOP.
Используйте таблицу диапазонов, чтобы получить описания полей из таблицы dd04t.
Затем цикл в lo_struct->components
снова, и заполните поле каталога именем поля и описанием. Здесь вы также можете добавить специальную логику для любых полей.