Link Search Menu Expand Document

ALV внутри другого ALV

Как показать консультанту что сумма рассчитана правильно?

Часто само написание отчета занимает немного времени, но дальнейшая “Разборка в Бронксе” совместный поиск ошибки занимает намного больше физических и ментальных усилий, как разработчика так и постановщика задачи.

Один из самых простых способов - это показать в popup ALV из чего сложилась данная сумма.
Те предположим что отчет с collect-ил сумму в основной таблице, при drilldown показываем все позиции из чего данную сумму собрали


Примеры ZCL_EUI_ALV

" Тестовые данные
SELECT * INTO TABLE @DATA(lt_flight)
FROM sflight.

" Создаем ALV & передаем таблицу
DATA(lo_alv) = NEW zcl_eui_alv(
  ir_table = REF #( lt_flight ) ).

" Показ в полном экране
lo_alv->show( ).

image

" Тестовые данные
SELECT * INTO TABLE @DATA(lt_flight) FROM sflight.

" Создаем ALV & передаем таблицу
DATA(lo_alv) = NEW zcl_eui_alv(
  ir_table = REF #( lt_flight )
  " Set title
  is_layout = VALUE lvc_s_layo( grid_title = `Demo title`
                                smalltitle = 'X' )
  " Hotspot & суммы по маске
  it_mod_catalog = VALUE lvc_t_fcat( ( fieldname = 'CONNID' hotspot = 'X' )
                                     ( fieldname = 'SEATS*' do_sum  = 'X' ) ) ).

" Показ в полном экране
lo_alv->show( ).

image

REPORT zeui_test_alv.

...

METHODS:
  " Стандартные события CL_GUI_ALV_GRID
  on_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid
    IMPORTING
        sender     " <-- сам объект CL_GUI_ALV_GRID
        e_row_id
        e_column_id,

  on_user_command FOR EVENT user_command OF cl_gui_alv_grid
    IMPORTING
        e_ucomm,

  " Используем split container
  on_top_of_page FOR EVENT top_of_page OF cl_gui_alv_grid
    IMPORTING
        e_dyndoc_id. " <-- REF TO CL_DD_DOCUMENT

...

" Создаем ALV & тулбар
DATA(lo_alv) = NEW zcl_eui_alv(
  ir_table   = REF #( lt_flight )
  it_toolbar = VALUE ttb_button( ( function = 'TEST_BUTTON'
                                   icon     = icon_complete
                                   text     = 'Press me!' ) ) ).

" <<<Установка обработчиков событий за раз>>>
lo_alv->show( io_handler = me ).

...

METHOD on_top_of_page.
  e_dyndoc_id->add_text( text      = 'Test of ZCL_EUI_ALV'
                         sap_style = cl_dd_area=>large ).

  e_dyndoc_id->new_line( repeat = 1 ).

  e_dyndoc_id->add_link( text =  'EUI library'
                         url  =  'https://bizhuka.github.io/eui/' ).
ENDMETHOD.

METHOD on_user_command.
  CHECK e_ucomm = 'TEST_BUTTON'.
ENDMETHOD.

image


Описание класса обертки

Азы и Буки большинства ABAP-ра наверное классы CL_GUI_ALV_GRID и CL_SALV_TABLE

Хоть и последний является более новым, он:

  • по умолчанию не поддерживает редактирование (есть конечно же несколько видов трюков как это можно обойти)
  • настройка field catalog, toolbar, layout и variant происходит через вызовы методов
    те имхо CL_SALV_TABLE более многословный чем CL_GUI_ALV_GRID (начиная с 7.40) где вся настройка ALV происходит, по старинке, через таблицы и структуры

CL_GUI_ALV_GRID в свою очередь имеет 1 но очень существенный недостаток - рисовать скрины для основной и popup таблицы любят делать мазохисты весьма утомительное занятие для и без того загруженного работой программиста между сном и просмотрами сериальчика во время обеда


Для простых случаев весь показ ALV можно написать почти 1 строкой

 NEW zcl_eui_alv( ir_table = REF #( mt_alv ) )->
    popup( )->
    show( ).

Написано в 3 строки для ясности
Да и то что можно так писать, не означает что так нужно делать


Более подробно

Сразу перейдем к синтаксису 7.40

1) CREATE

      " Create new ALV
      DATA(lo_alv) = NEW zcl_eui_alv(
       " Данные для проваливания
       ir_table       = REF #( lt_rt )

       " Что за виды оплат используем
       it_filter      = VALUE LVC_T_FILT( ( fieldname = 'LGART'
                                            sign      = 'I'
                                            option    = 'EQ'
                                            low       = '0101' ) )

       " Поставим поле сумма ближе к началу
       it_mod_catalog = VALUE LVC_T_FCAT( ( fieldname = 'BETRG'
                                            col_pos   = 5
                                            do_sum    = 'X' ) )

       " В шапке табельный номер + тех информация
       is_layout      = VALUE LVC_S_LAYO(
          grid_title = |{ <ls_alv>-pernr } - ({ <ls_lgart>-label })|
          smalltitle = abap_true )

       " Если данных много лучше дополнительно сгруппировать данные
       it_sort        = VALUE LVC_T_SORT(
         ( fieldname = 'SRTZA' subtot = abap_true expa = abap_true )
         ( fieldname = 'LGART' subtot = abap_true expa = abap_true ) ) ).

Для тех кто помнит не только REUSE, но и вывод отчетов с помощью WRITE + COLOR + HOTSPOT события тот старый пердун все думаю понятно.
А так однократное проваливание в LVC_S_LAYO и DISVARIANT (вариант) и двукратное проваливание LVC_T_FILT, LVC_T_FCAT, TTB_BUTTON (toolbar) и LVC_T_SORT снимет большинство вопросов про то как это работает.

Параметр IT_MOD_CATALOG не собранный с нуля field catalog! Он просто дополняет его не пустыми значениями. Также для удобства можно указывать маску для полей
fieldname = 'SUM*' do_sum = 'X' hotspot = 'X'


2) POPUP

Как и в SALV если popup не нужен ничего не делаем, иначе вызываем

      " As popup
      lo_alv->popup( ).

В него можно передать размеры окна

  • IV_COL_BEG
  • IV_COL_END
  • IV_ROW_BEG
  • IV_ROW_END

Собственно ради этого метода и создавался данный класс (вложенность popup ограничена 7 экранами)


3) SHOW

Вызываем сам показ ALV

      " show ALV
      lo_alv->show( ).

Данный метод возвращает код функции закрытия. К примеру если check lo_alv->show( ) = 'OK'.
PF-STATUS и TITLE BAR можно указать статический в конструкторе или динамический по событию

      on_pbo_event FOR EVENT pbo_event OF zif_eui_manager
        IMPORTING
            sender    "<-- CAST to ZCL_EUI_ALV
            iv_dynnr.

В данном событии можно получить сам контрол CL_GUI_ALV_GRID вызвав ZCL_EUI_ALV->GET_GRID( )

Но в большинстве случаев в SHOW можно передать объект io_handler который может иметь обработчики события CL_GUI_ALV_GRID:

  • on_user_command
  • on_hotspot_click
  • on_double_click
  • on_toolbar
  • on_top_of_page
  • on_data_changed

В них sender это и есть CL_GUI_ALV_GRID.


Редактирование

Последний handler on_data_changed нужен только для случая когда редактируется GRID LVC_S_LAYO-EDIT = ‘X’ или отдельное поле LVC_S_FCAT-EDIT

Проверку введенных данных можно осуществить в методе

      on_pai_event FOR EVENT pai_event OF zif_eui_manager
        IMPORTING
            iv_command
            cv_close. " Установите cv_close->* = abap_false для отмены закрытия

Если двух кнопок ‘OK’ и ‘CANCEL’ не достаточно (только CANCEL для режима READ_ONLY)

небольшая ремарка

  • можно поменять статус по событию on_pbo_event (для динамики)
  • Или 1 раз в конструкторе (при статике)
    • IV_STATUS_NAME
    • IV_STATUS_PROG
    • IT_STATUS_EXCLUDE
    • IV_STATUS_TITLE