вторник, 28 апреля 2015 г.

Вывод таблицы через ALV

Набивший оскомину пример:

DATA:

  g_container        
TYPE scrfname VALUE 'GRID_CONT_1000_01',
  grid               
TYPE REF TO cl_gui_alv_grid,
  g_custom_container 
TYPE REF TO cl_gui_custom_container,

INITIALIZATION.
  SELECT *
    FROM /bic/azloc_map00
    INTO TABLE @DATA(itable)  “BW 7.4, когда лень объявлять таблицу
    UP TO 10 ROWS.
START-OF-SELECTION.
  
CALL SCREEN 1000.     “Контейнер


MODULE status_1000 OUTPUT.
  
SET PF-STATUS 'ZNN_MENU'.
  
SET TITLEBAR 'ZNN_TBAR'.

  
IF g_custom_container IS INITIAL.
    
CREATE OBJECT g_custom_container
      
EXPORTING
        container_name 
g_container.
    
CREATE OBJECT grid
      
EXPORTING
        i_parent 
g_custom_container.

    
CALL METHOD grid->set_table_for_first_display

      
CHANGING
        it_outtab        
itable.

  
ENDIF.
ENDMODULE.


п.с. если внутреннюю таблицу определяем копией внешней, то для метода  cl_gui_alv_grid ->set_table_for_first_display можно не указывать структуру полей. В противном случае - она обязательна.


А вот так быстрее - http://sapforum.biz/index.php?topic=1401.0
На всякий случай, основное:
CL_SALV_TABLE – Класс для быстрого вывода данных в формате AVL-таблицы. В принципе можно конечно все это сделать, используя или функцию REUSE_ALV_LIST_DISPLAY или как вариант использовать базовый класс для вывода таблицы CL_GUI_ALV_GRID. Однако и в том и в другом случае нужно выполнить определенный объем предварительной работы по подготовке каталога данных описывающих поля выводимой таблицы и т.д. Конечно, есть функциональные модули, которые позволяют это ускорить, например, такой как LVC_FIELDCATALOG_MERGE. Однако SAP позаботился о том, чтобы и тут можно было все сделать намного проще, реализовав упрощение вывода ALV-таблиц через класс CL_SALV_TABLE.

В общем виде для вывода любой таблицы данных, а что самое хорошее, это то что можно для отображения использовать не только таблицы, объявленные в словаре данных, но и объявленные внутри своих программ локальные внутренние таблицы, нужно написать буквально несколько строк кода (примеры будут базироваться на таблице MKPF – Заголовки документов движения материала, единственное что возмжно ограничьте выборку документов хотя бы годом, а то в реальной системе может ну очень долго висеть, все таки в IDES документов значительно меньше будет):  
Код: You are not allowed to view links. Register or Login
* Объявляем внутреннюю таблицу, со своими полями + поля из таблицы MKPF
DATA: BEGIN OF gt_mkpf OCCURS 10,
      sel(1) TYPE c.
        INCLUDE STRUCTURE mkpf.
DATA: my_field(5) TYPE c,
      END OF gt_mkpf.
* Объявляем объект типа cl_salv_table, который выведет наши данные в виде ALV
DATA: gc_alv_table TYPE REF TO cl_salv_table.

START-OF-SELECTION.
* Выбираем данные из MKPF
  SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_mkpf FROM mkpf.

* Статический метод класса для создания объекта и связывания с нашей таблицей
  cl_salv_table=>factory( IMPORTING r_salv_table = gc_alv_table
                          CHANGING t_table = gt_mkpf[] ).
* Вывести ALV-таблицу на экран
  gc_alv_table->display( ).

6 комментариев:

  1. Анонимный11/28/2017 01:43:00 PM

    Я люблю нефть!

    ОтветитьУдалить
    Ответы
    1. Анонимный11/28/2017 01:44:00 PM

      #metoo

      Удалить
    2. Пока в России есть нефть - в Милане есть я.

      Удалить
    3. Анонимный2/16/2022 03:58:00 PM

      Если в Милане есть я, значит в России есть нефть

      Удалить
  2. Ещё проще!
    SELECT * INTO TABLE @DATA(lt_tcurr) FROM tcurr WHERE FCURR = 'USD'.
    cl_salv_table=>factory( Importing = DATA(lo_alv) Changing = lt_tcurr ).
    lo_alv->display( ).

    ОтветитьУдалить