Проблема: В ALV GRID-е чтобы отработали события data_changed и data_changed_finished необходимо нажимать enter после редактирования. С числами и текстом это более менее ожидаемо и проблем не возникает. А вот со списками drop-down это совсем неочевидно. Поэтому следующее действие (например, сохранение введённых данных) отрабатывает без учёта этих изменений.
Решение:
IF l_grid_items IS NOT INITIAL.
CALL METHOD l_grid_items->check_changed_data.
ENDIF.
Этот код заканчивает редактирование ALV GRID-а. В моем случае его оказалось достаточно вписать в PAI до обработки параметра user-command.
Подробнее...
Сюда я буду сохранять всякие куски кода, конфигов, ссылки, чтобы в один прекрасный день когда мне это снова понадобится - не вспоминать судорожно где и когда я это применял.
Показаны сообщения с ярлыком ALV GRID. Показать все сообщения
Показаны сообщения с ярлыком ALV GRID. Показать все сообщения
30 августа 2011 г.
29 августа 2011 г.
20 мая 2011 г.
Быстрое создание ALV-таблицы
" например надо отобразить таблицу T_TCJ_POSITIONS
DATA: gc_alv_table TYPE REF TO cl_salv_table.
cl_salv_table=>factory( IMPORTING r_salv_table = gc_alv_table CHANGING t_table = T_TCJ_POSITIONS ).
" показать
gc_alv_table->display( ).
" если необходимо добавить события:
data: events_tb TYPE REF TO CL_SALV_EVENTS_TABLE.
CALL METHOD gc_alv_table->GET_EVENT
RECEIVING
VALUE = events_tb.
data ALV_HANDLER_pay type ref to CL_ALV_HANDLER_pay.
create object ALV_HANDLER_pay.
set handler ALV_HANDLER_pay->handle_doubleclick for events_tb.
" Переименовать колонки:
gc_columns = gc_alv_table->get_columns( ).
gc_colwork ?= gc_columns->get_column( 'P_RECEIPTS' ).
gc_colwork->set_long_text( 'Оплата' ).
gc_colwork->set_medium_text( 'Оплата' ).
gc_colwork->set_short_text( 'Оплата' ).
" там же можно сделать прочие настройки, если надо
" добавим агрегацию
gc_aggr = gc_alv_table->get_aggregations( ).
gc_aggr->add_aggregation( 'P_RECEIPTS' ). Подробнее...
DATA: gc_alv_table TYPE REF TO cl_salv_table.
cl_salv_table=>factory( IMPORTING r_salv_table = gc_alv_table CHANGING t_table = T_TCJ_POSITIONS ).
" показать
gc_alv_table->display( ).
" если необходимо добавить события:
data: events_tb TYPE REF TO CL_SALV_EVENTS_TABLE.
CALL METHOD gc_alv_table->GET_EVENT
RECEIVING
VALUE = events_tb.
data ALV_HANDLER_pay type ref to CL_ALV_HANDLER_pay.
create object ALV_HANDLER_pay.
set handler ALV_HANDLER_pay->handle_doubleclick for events_tb.
" Переименовать колонки:
gc_columns = gc_alv_table->get_columns( ).
gc_colwork ?= gc_columns->get_column( 'P_RECEIPTS' ).
gc_colwork->set_long_text( 'Оплата' ).
gc_colwork->set_medium_text( 'Оплата' ).
gc_colwork->set_short_text( 'Оплата' ).
" там же можно сделать прочие настройки, если надо
" добавим агрегацию
gc_aggr = gc_alv_table->get_aggregations( ).
gc_aggr->add_aggregation( 'P_RECEIPTS' ). Подробнее...
27 апреля 2011 г.
ABAP: добавление своей кнопки в TOOLBAR ALV GRID
Для этого надо создать класс обработчик для обработки событий toolbar и user_command для ALV GRID.
Пример:
CLASS cl_trans_g_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS:
handle_toolbar
FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object e_interactive,
handle_user_command
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
ENDCLASS.
CLASS cl_trans_g_event_receiver IMPLEMENTATION.
METHOD handle_toolbar.
PERFORM method_trans_toolbar USING e_object.
ENDMETHOD.
METHOD handle_user_command.
PERFORM method_trans_user_command USING e_ucomm.
ENDMETHOD.
ENDCLASS.
* Добавление кнопки в тулбар
FORM METHOD_TRANS_TOOLBAR USING P_E_OBJECT TYPE REF TO CL_ALV_EVENT_TOOLBAR_SET.
DATA: ty_toolbar TYPE stb_button.
* разделитель
CLEAR ty_toolbar.
ty_toolbar-butn_type = 3.
APPEND ty_toolbar TO p_e_object->mt_toolbar.
* кнопка
CLEAR ty_toolbar.
ty_toolbar-function = 'MYBUTT'.
ty_toolbar-icon = ICON_HISTORY.
ty_toolbar-butn_type = 0.
ty_toolbar-text = 'Моя кнопка'.
APPEND ty_toolbar TO p_e_object->mt_toolbar.
ENDFORM.
* Обработка команд
FORM METHOD_TRANS_USER_COMMAND USING P_E_UCOMM TYPE SY-UCOMM.
CASE p_e_ucomm.
WHEN 'MYBUTT'.
* ЧТО-ТО ДЕЛАЕМ
ENDCASE.
ENDFORM.
Ну и надо незабыть инициализировать все это после создания грида:
DATA: trans_g_event_receiver TYPE REF TO cl_trans_g_event_receiver.
CREATE OBJECT trans_g_event_receiver.
SET HANDLER trans_g_event_receiver->handle_toolbar FOR trans_grid.
SET HANDLER trans_g_event_receiver->handle_user_command FOR trans_grid. Подробнее...
Пример:
CLASS cl_trans_g_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS:
handle_toolbar
FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object e_interactive,
handle_user_command
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
ENDCLASS.
CLASS cl_trans_g_event_receiver IMPLEMENTATION.
METHOD handle_toolbar.
PERFORM method_trans_toolbar USING e_object.
ENDMETHOD.
METHOD handle_user_command.
PERFORM method_trans_user_command USING e_ucomm.
ENDMETHOD.
ENDCLASS.
* Добавление кнопки в тулбар
FORM METHOD_TRANS_TOOLBAR USING P_E_OBJECT TYPE REF TO CL_ALV_EVENT_TOOLBAR_SET.
DATA: ty_toolbar TYPE stb_button.
* разделитель
CLEAR ty_toolbar.
ty_toolbar-butn_type = 3.
APPEND ty_toolbar TO p_e_object->mt_toolbar.
* кнопка
CLEAR ty_toolbar.
ty_toolbar-function = 'MYBUTT'.
ty_toolbar-icon = ICON_HISTORY.
ty_toolbar-butn_type = 0.
ty_toolbar-text = 'Моя кнопка'.
APPEND ty_toolbar TO p_e_object->mt_toolbar.
ENDFORM.
* Обработка команд
FORM METHOD_TRANS_USER_COMMAND USING P_E_UCOMM TYPE SY-UCOMM.
CASE p_e_ucomm.
WHEN 'MYBUTT'.
* ЧТО-ТО ДЕЛАЕМ
ENDCASE.
ENDFORM.
Ну и надо незабыть инициализировать все это после создания грида:
DATA: trans_g_event_receiver TYPE REF TO cl_trans_g_event_receiver.
CREATE OBJECT trans_g_event_receiver.
SET HANDLER trans_g_event_receiver->handle_toolbar FOR trans_grid.
SET HANDLER trans_g_event_receiver->handle_user_command FOR trans_grid. Подробнее...
ABAP: стили ячеек в ALV GRID.
Список возможных значений стилей можно или даже нужно брать из инклуда <CL_ALV_CONTROL>.
Вариант 1:
Стиль для столбца можно указать в филд-каталоге (LVC_T_FCAT) в полях:
STYLE
STYLE2
STYLE3
STYLE4
Пример:
ls_fcat-style = ALV_STYLE_COLOR_INT_BACKGROUND + ALV_STYLE_ALIGN_CENTER_CENTER.
Вариант 2:
Если необходимо чтобы разные стили были у разных произвольных ячеек, то в стуктуру вашей внутренней таблицы для ALV придется ввести поле типа LVC_T_STYL. В нем будет заполняться таблица стилей для каждой ячейки выбранной строки.
Структура этой таблицы выглядит так:
FIELDNAME TYPE LVC_FNAME,
STYLE TYPE LVC_STYLE,
STYLE2 TYPE LVC_STYLE,
STYLE3 TYPE LVC_STYLE,
STYLE4 TYPE LVC_STYLE,
MAXLEN TYPE INT4.
И собственно заполняется так же как и в филд-каталоге, только для каждой ячейки каждой строки вашей внутренней таблицы для ALV. Важно, таблица стилей должна заполняться так, чтобы в результате получилась таблица отсортированная по FIELDNAME.
Ну и в конце концов необходимо указать имя поля с таблицей стилей в лэйаут ALV (LVC_S_LAYO).
Пример:
tcalend_g_layo-sel_mode = 'A'.
tcalend_g_layo-stylefname = 'CELLTAB'. Подробнее...
Вариант 1:
Стиль для столбца можно указать в филд-каталоге (LVC_T_FCAT) в полях:
STYLE
STYLE2
STYLE3
STYLE4
Пример:
ls_fcat-style = ALV_STYLE_COLOR_INT_BACKGROUND + ALV_STYLE_ALIGN_CENTER_CENTER.
Вариант 2:
Если необходимо чтобы разные стили были у разных произвольных ячеек, то в стуктуру вашей внутренней таблицы для ALV придется ввести поле типа LVC_T_STYL. В нем будет заполняться таблица стилей для каждой ячейки выбранной строки.
Структура этой таблицы выглядит так:
FIELDNAME TYPE LVC_FNAME,
STYLE TYPE LVC_STYLE,
STYLE2 TYPE LVC_STYLE,
STYLE3 TYPE LVC_STYLE,
STYLE4 TYPE LVC_STYLE,
MAXLEN TYPE INT4.
И собственно заполняется так же как и в филд-каталоге, только для каждой ячейки каждой строки вашей внутренней таблицы для ALV. Важно, таблица стилей должна заполняться так, чтобы в результате получилась таблица отсортированная по FIELDNAME.
Ну и в конце концов необходимо указать имя поля с таблицей стилей в лэйаут ALV (LVC_S_LAYO).
Пример:
tcalend_g_layo-sel_mode = 'A'.
tcalend_g_layo-stylefname = 'CELLTAB'. Подробнее...
7 декабря 2010 г.
ABAP: Цвета в ALV GRID
Пример:
REPORT ZTEST_ALV_COLORS.
TYPES: BEGIN OF my_itab_wa,
COLOR(4) TYPE C, " Поле для указания цвета строки
TEXT(255) TYPE C, " Просто текст
END OF my_itab_wa,
my_itab_t TYPE TABLE OF my_itab_wa.
DATA: my_itab TYPE my_itab_t.
DATA: my_grid type ref to CL_GUI_ALV_GRID, " грид
my_g_cont type ref to CL_GUI_DOCKING_CONTAINER, " контейнер
my_g_fcat type LVC_T_FCAT,
my_g_layo type LVC_S_LAYO,
my_g_vari type DISVARIANT.
CALL SCREEN '0100'.
* Заполняем внутреннюю таблицу для ALV
FORM UPDATE_ITAB.
DATA: lv_c1 TYPE C.
DATA: ls_itab TYPE my_itab_wa.
lv_c1 = '0'.
DO 7 TIMES.
lv_c1 = lv_c1 + 1.
CONCATENATE 'C' lv_c1 '00' INTO ls_itab-COLOR.
CONCATENATE 'This is' ls_itab-COLOR INTO ls_itab-TEXT SEPARATED BY SPACE.
APPEND ls_itab TO my_itab.
CONCATENATE 'C' lv_c1 '10' INTO ls_itab-COLOR.
CONCATENATE 'This is' ls_itab-COLOR INTO ls_itab-TEXT SEPARATED BY SPACE.
APPEND ls_itab TO my_itab.
CONCATENATE 'C' lv_c1 '01' INTO ls_itab-COLOR.
CONCATENATE 'This is' ls_itab-COLOR INTO ls_itab-TEXT SEPARATED BY SPACE.
APPEND ls_itab TO my_itab.
ENDDO.
ENDFORM.
* Создаем грид
FORM CREATE_ALV_GRID.
DATA: ls_fcat TYPE LVC_S_FCAT.
IF my_g_cont IS INITIAL.
CREATE OBJECT my_g_cont
EXPORTING
repid = sy-repid
dynnr = sy-dynnr
extension = 3000
side = cl_gui_docking_container=>dock_at_top.
CREATE OBJECT my_grid
EXPORTING
I_SHELLSTYLE = 4
I_PARENT = my_g_cont
I_APPL_EVENTS = 'X'.
my_g_vari-REPORT = sy-repid.
my_g_vari-username = sy-uname.
my_g_vari-handle = 'MYGR'.
my_g_layo-cwidth_opt = ''.
my_g_layo-sel_mode = 'A'.
* В лэйауте указываем имя поля в котором
* будем хранить цвет строки
my_g_layo-info_fname = 'COLOR'.
ls_fcat-fieldname = 'TEXT'.
ls_fcat-coltext = 'Текст'.
ls_fcat-reptext = 'Текст'.
ls_fcat-scrtext_l = 'Текст'.
ls_fcat-scrtext_m = 'Текст'.
ls_fcat-scrtext_s = 'Текст'.
APPEND ls_fcat TO my_g_fcat.
CALL METHOD my_grid->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_LAYOUT = my_g_layo
IS_VARIANT = my_g_vari
I_SAVE = 'A'
CHANGING
IT_OUTTAB = my_itab
IT_FIELDCATALOG = my_g_fcat.
ENDIF.
ENDFORM.
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS 'GUI_0100'.
PERFORM UPDATE_ITAB.
PERFORM CREATE_ALV_GRID.
ENDMODULE. " STATUS_0100 OUTPUT
MODULE EXIT_COMMAND_0100 INPUT.
LEAVE TO SCREEN 0.
ENDMODULE. " EXIT_COMMAND_0100 INPUT
Статья на аналогичную тему на английском: Report and ALV Colors
Подробнее...
3 ноября 2010 г.
ABAP: добавление кнопок (и не только) в TOOLBAR ALV GRID, созданного через REUSE_ALV_GRID_DISPLAY
REUSE_ALV_GRID_DISPLAY позволяет указать PF-STATUS который будет использоваться при выводе грида, и название формы в которой будет происходить обработка юзер-комманд. Этим и стоит воспользоваться.
PF-STATUS лучше делать не с нуля, а в транзакции SE41 скопировать из программы SAPLSLVC_FULLSCREEN статус STANDARD_FULLSCREEN, чтобы иметь на тулбаре все стандартные кнопки грида.
После того как статус создан можно писать код.
ПРИМЕР:
В скопированный GUI-STATUS добавил кнопку
*--------------------------------------------------------------*
* сохраняем в перемнную имя программы
lv_repid = sy-repid.
* вызывавем ФМ, указываем в нем названия форм которые
* устанавливают pf-status и обрабатывают команды
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = lv_repid
I_CALLBACK_PF_STATUS_SET = 'SET_PF_STATUS'
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
I_GRID_TITLE = 'Отчет по планированию доходов'
IT_FIELDCAT_LVC = lt_fcat
TABLES
T_OUTTAB = it_plantab
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2
.
* устанавливаем PF-STATUS
FORM SET_PF_STATUS USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'GUI_ALVGRIDX'.
ENDFORM.
* обрабатываем команды
FORM USER_COMMAND USING p_ucomm LIKE sy-ucomm
ps_selfield TYPE slis_selfield.
CASE p_ucomm.
WHEN 'PXLS'.
" выполняем что-то крайне важное
ENDCASE.
ENDFORM.
*--------------------------------------------------------------*
Подробнее...
PF-STATUS лучше делать не с нуля, а в транзакции SE41 скопировать из программы SAPLSLVC_FULLSCREEN статус STANDARD_FULLSCREEN, чтобы иметь на тулбаре все стандартные кнопки грида.
После того как статус создан можно писать код.
ПРИМЕР:
В скопированный GUI-STATUS добавил кнопку
* сохраняем в перемнную имя программы
lv_repid = sy-repid.
* вызывавем ФМ, указываем в нем названия форм которые
* устанавливают pf-status и обрабатывают команды
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = lv_repid
I_CALLBACK_PF_STATUS_SET = 'SET_PF_STATUS'
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
I_GRID_TITLE = 'Отчет по планированию доходов'
IT_FIELDCAT_LVC = lt_fcat
TABLES
T_OUTTAB = it_plantab
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2
.
* устанавливаем PF-STATUS
FORM SET_PF_STATUS USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'GUI_ALVGRIDX'.
ENDFORM.
* обрабатываем команды
FORM USER_COMMAND USING p_ucomm LIKE sy-ucomm
ps_selfield TYPE slis_selfield.
CASE p_ucomm.
WHEN 'PXLS'.
" выполняем что-то крайне важное
ENDCASE.
ENDFORM.
*--------------------------------------------------------------*
25 октября 2010 г.
ABAP: Всплывающие подсказки к значениям в ALV GRID
Для этого надо заполнить таблицу типа ALV_T_QINF. В ней для каждого значения которому необходима подсказка заполнить поля:
TYPE - тип,
VALUE - значение,
TEXT - текст подсказки.
Тип берется из констант класса cl_salv_tooltip:
- C_TYPE_ICON,
- C_TYPE_SYMBOL,
- C_TYPE_COLOR,
- C_TYPE_EXCEPTION,
- C_TYPE_TREE_STYLE.
Потом необходимо передать эту таблицу в методе SET_TABLE_FOR_FIRST_DISPLAY во входном параметре IT_EXCEPT_QINFO.
Пример:
DATA: l_t_qinf TYPE ALV_T_QINF.
DATA: l_s_qinf TYPE ALV_S_QINF.
l_s_qinf-TYPE = cl_salv_tooltip=>C_TYPE_ICON.
l_s_qinf-VALUE = ICON_HISTORY.
l_s_qinf-TEXT = 'Есть ПП'.
APPEND l_s_qinf TO l_t_qinf.
CALL METHOD my_alv_grid->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_LAYOUT = my_alv_layo
IS_VARIANT = my_alv_vari
I_SAVE = 'A'
IT_EXCEPT_QINFO = l_t_qinf
CHANGING
IT_OUTTAB = my_alv_it[]
IT_FIELDCATALOG = my_alv_fcat. Подробнее...
TYPE - тип,
VALUE - значение,
TEXT - текст подсказки.
Тип берется из констант класса cl_salv_tooltip:
- C_TYPE_ICON,
- C_TYPE_SYMBOL,
- C_TYPE_COLOR,
- C_TYPE_EXCEPTION,
- C_TYPE_TREE_STYLE.
Потом необходимо передать эту таблицу в методе SET_TABLE_FOR_FIRST_DISPLAY во входном параметре IT_EXCEPT_QINFO.
Пример:
DATA: l_t_qinf TYPE ALV_T_QINF.
DATA: l_s_qinf TYPE ALV_S_QINF.
l_s_qinf-TYPE = cl_salv_tooltip=>C_TYPE_ICON.
l_s_qinf-VALUE = ICON_HISTORY.
l_s_qinf-TEXT = 'Есть ПП'.
APPEND l_s_qinf TO l_t_qinf.
CALL METHOD my_alv_grid->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_LAYOUT = my_alv_layo
IS_VARIANT = my_alv_vari
I_SAVE = 'A'
IT_EXCEPT_QINFO = l_t_qinf
CHANGING
IT_OUTTAB = my_alv_it[]
IT_FIELDCATALOG = my_alv_fcat. Подробнее...
14 октября 2010 г.
ABAP: Установка позиции вертикального скролла в ALV GRID
DATA: LS_COL_INFO TYPE LVC_S_COL,
LS_ROW_INFO TYPE LVC_S_ROW.
* Получаем информацию о текущей позиции скролла
CALL METHOD req_grid->GET_SCROLL_INFO_VIA_ID
IMPORTING
ES_ROW_INFO = LS_ROW_INFO
ES_COL_INFO = LS_COL_INFO.
* нужно для того чтобы не вываливалось в дамп
* после вызова предыдущего метода
CALL METHOD CL_GUI_CFW=>FLUSH
EXCEPTIONS
CNTL_SYSTEM_ERROR = 1
CNTL_ERROR = 2.
* Указываем индекс нужной нам строки
LS_ROW_INFO-INDEX = lv_index.
* Устанавливаем скролл в нужную позицию
CALL METHOD req_grid->SET_SCROLL_INFO_VIA_ID
EXPORTING
IS_ROW_INFO = LS_ROW_INFO
IS_COL_INFO = LS_COL_INFO.
* нужно для того чтобы не вываливалось в дамп
* после вызова предыдущего метода
CALL METHOD CL_GUI_CFW=>FLUSH
EXCEPTIONS
CNTL_SYSTEM_ERROR = 1
CNTL_ERROR = 2. Подробнее...
LS_ROW_INFO TYPE LVC_S_ROW.
* Получаем информацию о текущей позиции скролла
CALL METHOD req_grid->GET_SCROLL_INFO_VIA_ID
IMPORTING
ES_ROW_INFO = LS_ROW_INFO
ES_COL_INFO = LS_COL_INFO.
* нужно для того чтобы не вываливалось в дамп
* после вызова предыдущего метода
CALL METHOD CL_GUI_CFW=>FLUSH
EXCEPTIONS
CNTL_SYSTEM_ERROR = 1
CNTL_ERROR = 2.
* Указываем индекс нужной нам строки
LS_ROW_INFO-INDEX = lv_index.
* Устанавливаем скролл в нужную позицию
CALL METHOD req_grid->SET_SCROLL_INFO_VIA_ID
EXPORTING
IS_ROW_INFO = LS_ROW_INFO
IS_COL_INFO = LS_COL_INFO.
* нужно для того чтобы не вываливалось в дамп
* после вызова предыдущего метода
CALL METHOD CL_GUI_CFW=>FLUSH
EXCEPTIONS
CNTL_SYSTEM_ERROR = 1
CNTL_ERROR = 2. Подробнее...
20 августа 2010 г.
ABAP: Узнать какие строки выделены (selected rows) в ALV GRID.
DATA: gi_index_rows TYPE lvc_t_row,
g_selected_row LIKE lvc_s_row.
CALL METHOD %ALV_GRID%->GET_SELECTED_ROWS
IMPORTING
ET_INDEX_ROWS = gi_index_rows. Подробнее...
Подписаться на:
Сообщения (Atom)