Показаны сообщения с ярлыком ALV. Показать все сообщения
Показаны сообщения с ярлыком ALV. Показать все сообщения

30 августа 2011 г.

Принудительное подтверждение изменений в ALV GRID

Проблема: В 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.
Подробнее...

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' ). Подробнее...

3 мая 2011 г.

ALV-контейнеры с одинаковыми именами

Проблема: В программе с ALV-контейнером на экране вызывается фм. В рамках ФМ-а открываются другие экраны с ALV-контейнерами. Один из которых называется также, как контейнер программы.
В результате при возврате из фм в программу ALV может не отрисовываться.

Выход: делать ALV-контейнеры с уникальными именами. Работает.
Возможно можно избежать такой проблемы подобрав параметры конструктора контейнера (указать программу-REPID и экран-DYNNR), но у меня не получилось. Подробнее...

28 апреля 2011 г.

Вызов PBO из событий ALV

Проблема: в событии ALV изменились какие-либо значения, отображаемые экраном DynPro, но так как события PBO не было - пользователь видит старые значения.
Подобрал два варианта:
1. Имитировать событие PBO.

CALL FUNCTION 'SAPGUI_SET_FUNCTIONCODE'EXPORTINGFUNCTIONCODE           = '='EXCEPTIONSFUNCTION_NOT_SUPPORTED = 1OTHERS                 = 2.

Работает, но медленно. Возможно если использовать другой FUNCTIONCODE, будет лучше. знак равенства предлагался как значение по умолчанию.

2. Обновить значение самостоятельно.

Пробовал использовать функции DYNP_VALUES_READ и DYNP_VALUES_UPDATE, но не получилось. зато получилось с

DATA: dynpfields_tb  TYPE TABLE OF dynpread,
dynpfields_ln  TYPE dynpread. 
DEFINE AddField.
dynpfields_ln-fieldname  = '&1'.
dynpfields_ln-fieldvalue = &1.
APPEND dynpfields_ln to dynpfields_tb.
END-OF-DEFINITION.
AddField MAT_INFO_STR-MATNR.
AddField MAT_INFO_STR-MATERIAL_NAME.
CALL FUNCTION 'DYNP_UPDATE_FIELDS'
EXPORTING
DYNAME               = sy-repid
DYNUMB               = '1210'
TABLES
DYNPFIELDS           = dynpfields_tb
EXCEPTIONS
INVALID_ABAPWORKAREA = 1
INVALID_DYNPROFIELD  = 2
INVALID_DYNPRONAME   = 3
INVALID_DYNPRONUMMER = 4
INVALID_REQUEST      = 5
NO_FIELDDESCRIPTION  = 6
UNDEFIND_ERROR       = 7
OTHERS               = 8.

Работает, быстро, но есть казусы (возможно имеют решения, но я пока их не знаю):
- иногда теряются часть текста после переключения закладок с этими данными.
- не получилось использовать для чисел - пришлось менять тип на текстовый, что не всегда допустимо.
- пришлось отказаться от программ преобразования - вызываю их сам в коде, что тоже не всегда удобно.

3. У конструктора ALV GRID-а есть параметр i_appl_events. если его взвести - при нажатии вызывается PAI, а после PBO. Но тоже медленно всё работает. Возможно у других объектов есть такой же способ.

4. cl_gui_cfw=>set_new_ok_code. Тоже медленно.
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'DUMMY'.
CL_GUI_CFW=>FLUSH. Подробнее...

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.
Подробнее...

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'.
Подробнее...

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.

*--------------------------------------------------------------*
Подробнее...

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.
Подробнее...

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. 
Подробнее...

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.
Подробнее...