На этапе создания экземпляра объекта (фабричным методом) мы определяем, как мы хотим использовать объект ALV таблицы, будет ли это полноэкранный режим, либо мы хотим поместить объект в подготовленный заранее контейнер. Данный выбор влияет на способ установки GUI статуса для ALV таблицы.
В полноэкранном режиме для установки GUI статуса необходимо использовать метод SET_SCREEN_STATUS, параметр REPORT отвечает за то из какой программы будет взят GUI статус, PFSTATUS – имя GUI статуса, SET_FUNCTIONS – определяет какие стандартные функции будут использованы в программе. Может принимать значения: C_FUNCTIONS_DEFAULT – сортировки, фильтры, выбор формата. C_FUNCTIONS_ALL – все функции ALV, C_FUNCTIONS_NONE – по умолчанию, только пользовательские функции. Константы определены в классе: CL_SALV_MODEL_BASE
Стандартный GUI статус можно взять в группе функций: SALV_METADATA_STATUS – статус: SALV_TABLE_STANDARD или SALV_TABLE_STDPOPUP, скопировать в свою программу и расширить необходимыми функциями.
Для того чтобы динамически исключить какую либо функцию можно применить класс cl_salv_functions, но вместо метода remove_function использовать метод set_function, параметр name определяет какую функцию будем скрывать, boolean — определяет скрыта она или нет, если скрываем ставим в abap_true. Метод remove_function не работает для полно-экранного грида.
Пример измененного GUI статуса (функции начинающиеся с & являются стандартными):
Когда ALV объект создается в контейнере, для настройки функций используется класс: cl_salv_functions. Получить экземпляр этого класса можно используя метод — get_functions( ) главного объекта ALV. Для установки функций по умолчанию можно воспользоваться методом set_default( ) или set_all( ) – для установки всех функций ALV объекта. Чтобы добавить свою функцию существует метод add_function. Ниже пример того как это сделать:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
REPORT zalv_simple. PARAMETERS p_dummy. DATA: gt_data TYPE spfli_tab, " Таблица с данными go_functions TYPE REF TO cl_salv_functions, go_alv TYPE REF TO cl_salv_table. INITIALIZATION. SELECT * FROM spfli INTO CORRESPONDING FIELDS OF TABLE gt_data. " Фабричный метод возвращяет экзмепляр ALV объекта TRY. cl_salv_table=>factory( EXPORTING r_container = cl_gui_container=>screen0 IMPORTING r_salv_table = go_alv CHANGING t_table = gt_data ). CATCH cx_salv_msg . MESSAGE 'Ошибка при создании ALV' TYPE 'E'. ENDTRY. " Установка функций (кнопок) go_functions = go_alv->get_functions( ). IF go_functions IS BOUND. go_functions->set_all( abap_true ). go_functions->add_function( EXPORTING NAME = 'ADDFUNC' icon = '@01@' text = 'ДопКнопка' tooltip = 'Всплывающая подсказка' POSITION = if_salv_c_function_position=>right_of_salv_functions ). ENDIF. " показать alv go_alv->display( ). |
Не работает если событие не INITIALIZATION. Что можно использовать вместо r_container = cl_gui_container=>screen0 ? Все вроде нормально, но просто ничего не выводит на экран.
Посмотрите пример создания таблицы тут http://abap-blog.ru/abap/abap-objects/salv-table-vvedenie/
Это я понимаю. Мне охото воспользоватся вот этим:
go_functions->add_function(
EXPORTING
NAME = ‘ADDFUNC’
icon = ‘@01@’
text = ‘ДопКнопка’
tooltip = ‘Всплывающая подсказка’
POSITION = if_salv_c_function_position=>right_of_salv_functions ).
А это без контейнера не работает.
А если создавать контейнер как у Вас указано и событие не INITIALIZATION, а например после сел. экрана то тогда go_alv->display( ) ничего не показывает. Без контейнера и добавление кнопки все корректно.
Добрый вечер, данный метод нельзя использовать для полноэкранного alv, см.: http://help.sap.com/saphelp_nw70ehp3/helpdata/en/4e/c39dbb88d22b90e10000000a42189d/frameset.htm
Попробуйте следующий код:
PARAMETERS p_dummy.
DATA:
gt_data TYPE spfli_tab, » Таблица с данными
go_functions TYPE REF TO cl_salv_functions,
go_alv TYPE REF TO cl_salv_table.
START-OF-SELECTION.
WRITE ».
SELECT * FROM spfli INTO CORRESPONDING FIELDS OF TABLE gt_data.
» Фабричный метод возвращяет экзмепляр ALV объекта
TRY.
cl_salv_table=>factory(
EXPORTING
r_container = cl_gui_container=>default_screen
IMPORTING
r_salv_table = go_alv
CHANGING
t_table = gt_data ).
CATCH cx_salv_msg .
MESSAGE ‘Ошибка при создании ALV’ TYPE ‘E’.
ENDTRY.
» Установка функций (кнопок)
go_functions = go_alv->get_functions( ).
IF go_functions IS BOUND.
go_functions->set_all( abap_true ).
go_functions->add_function(
EXPORTING
NAME = ‘ADDFUNC’
icon = ‘@01@’
text = ‘ДопКнопка’
tooltip = ‘Всплывающая подсказка’
POSITION = if_salv_c_function_position=>right_of_salv_functions ).
ENDIF.
» показать alv
go_alv->display( ).
Спасибо. Так заработало.
Добрый день.
А есть ли в классе cl_salv_table возможность вывести функциональную кнопку при нажатии на которую будет раскрываться меню с выбором команд. В классе cl_gui_alv_grid такое реализуемо, а тут не могу найти никак возможность сделать это.
Добрый вечер! Подобной задачи никогда не стояло, вероятно можно получив ссылку на объект cl_gui_alv_grid это сделать, как было сделано редактирование, посмотрите тут:
http://zevolving.com/2008/12/salv-table-10-editable-salv-model-overcome-the-restriction-of-salv-model/
Добрый день! А каким образом можно вывести стандартные кнопки «выделить» и «снять выделение»? методом set_all они почему то не выводятся.
Добрый! Попробуйте поменять способ выделения строк:
DATA: go_selections TYPE REF TO cl_salv_selections.
go_selections = go_alv->get_selections( ).
go_selections->set_selection_mode( if_salv_c_selection_mode=>row_column ).