Автор Тема: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран  (Прочитано 150725 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 758
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
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( ).
И все, список документов материала будет выведен на экран в виде таблицы ALV, пример на рисунке ALV-1.png ниже.

Думаю вещь неплохая и главное что работает с минимальными затратами на написание кода. Стандартно поля были выведены в порядке следования их объявления в структуре, последнее поле я просто перетащи в начало. Система сама отметила поля, которые были ключевыми в таблице. И как видим пока эти поля без заголовка, так как при их объявлении я не сослался ни на какой тип словаря данных. Для полей, которые объявлены в таблице или же буду объявлены через ссылку на тип словаря данных, система корректно выполнит объявление заголовков, например если добавить объявление поля материала, то заголовок будет представлен в корректном виде, пример на рисунке ALV-2.png ниже.

В принципе класс имеет все параметры для более точной настройки данных вывода, поэтому пойдем по шагам, сначала добавим для полей, которые созданы без ссылки на элементы словаря данных корректные заголовки. Для этого воспользуемся методом GET_COLUMNS, который является объектом, через который можно работать колонками таблицы, а так же нужно объявить объект колонка таблицы, так как работы идет следующим образом, сначала получаем данные колонок и затем получаем данные конкретной колонки.
Код: You are not allowed to view links. Register or Login
DATA: gc_columns TYPE REF TO cl_salv_columns_table,
      gc_colwork TYPE REF TO cl_salv_column_table.

* Получим каталог полей таблицы
  gc_columns = gc_alv_table->get_columns( ).
* Получим поле по имени
  gc_colwork ?= gc_columns->get_column( 'SEL' ).
* Зададим заголовок колонки обработанных документов
  gc_colwork->set_long_text( 'Обработанные строки в таблице' ).
  gc_colwork->set_medium_text( 'ОбрабСтроки' ).
  gc_colwork->set_short_text( 'ОбрСтр' ).
* Задать центрирование для вывода поля, тип словаря SALV_DO_ALIGNMENT
  gc_colwork->set_alignment( '3' ).

* Получим поле по имени
  gc_colwork ?= gc_columns->get_column( 'MY_DATA' ).
* Задать выравнивание по левому краю для вывода поля, тип словаря SALV_DO_ALIGNMENT
  gc_colwork->set_alignment( '1' ).
В принципе переменные список колонок и колонка являются, как уже было сказано, классами и имеют кучу методов для более точной настройки своего вывода, заканчивая средствами поиска к колонке. Детальную информацию можно просмотреть для каждого из классов в транзакции SE24. Теперь если запустить отчет, колонка SEL будет иметь наш текст, рисунок ALV-3.png ниже.

PS: Данный пост, так же будет содержать все одним файлом, как обычно условия такие -  актуальность данного файла будет приводится в порядок, по мере наличия времени.
« Последнее редактирование: Декабрь 13, 2010, 03:20:47 am от Uukrul »

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 758
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Далее, наверное, будет интересным добавить собственные критерии сортировки данных для колонок таблицы. Для этого у класса есть специальный метод, который работает аналогично методу работы с данными колонок таблицы.
Код: You are not allowed to view links. Register or Login
DATA: gc_sorts type ref to cl_salv_sorts.

* Получить список полей для сортировки
  gc_sorts = gc_alv_table->get_sorts( ).
* Задать сортировку по колонкам
  gc_sorts->add_sort( columnname = 'MBLNR' sequence = '2' ).
  gc_sorts->add_sort( columnname = 'MJAHR' sequence = '2' ).
Как видим требуется задать имя колонки и далее можно указать направление сортировки, по умолчанию они идет по возрастанию, я принудительно сделал сортировки по убыванию, рисунок ALV-4.png ниже. Как и в предыдущем случае у класса сортировки довольно много методов и параметров, подробности в транзакции SE24 для класса CL_SALV_SORTS.

Далее, добавим стандартные кнопки для работы с выведенными данными. Для этого есть специальный метод GET_FUNCTIONS, который тоже возвращает класс для работы с функциональными кнопками. По факту, у объекта, для каждой кнопки, определен свой метод. Любую из стандартных кнопок ALV-таблицы, можно включить или выключить индивидуально. Для ускорения работы создан метод SET_ALL, который включает определенный набор функциональных кнопок.
Код: You are not allowed to view links. Register or Login
DATA: gc_functions TYPE REF TO cl_salv_functions.

* Получим список функциональных клавиш и активируем их все
  gc_functions = gc_alv_table->get_functions( ).
  gc_functions->set_all( 'X' ).
Пример выполнения на рисунке ALV-5.png ниже. По быстрому поковырялся с возможностями добавления своих кнопок, похоже, что такой возможности нет, так как объект в качестве имени функции принимает предопределенный набор констант, хотя возможно я не нашел необходимого метода.

Так же для работы с общими параметрами вывода таблицы есть отдельный класс. Например, на рисунке ALV-5.png в качестве заголовка таблицы выведен текст заголовка имени программы, это можно поменять. Так же данный метод позволяет включать или отключать видимость линий сетки. В общем управляет внешним представлением таблицы.
Код: You are not allowed to view links. Register or Login
DATA: gc_display TYPE REF TO cl_salv_display_settings.

* Изменим заголовок таблицы
  gc_display = gc_alv_table->get_display_settings( ).
  gc_display->set_list_header( 'Заголовок таблицы' ).
Пример работы ALV-6.png

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 758
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Теперь рассмотрим отдельный класс, который позволяет вести управление вариантами представления таблицы.
Код: You are not allowed to view links. Register or Login
DATA: gс_layout TYPE REF TO cl_salv_layout,
      keys TYPE salv_s_layout_key.

* Добавим ведение вариантов отражения таблицы
  gc_layout = gc_alv_table->get_layout( ).
  keys-report = sy-repid.
  gc_layout->set_key( keys ).
  gc_layout->set_save_restriction( ‘3’ ).
Пример показан на рисунке ALV-7.png ниже, из параметров можно задать ведение  с ограничением по пользователям или нет. Подробности в реализации класса.

Агрегирование данных таблицы, используется специальный класс, как и в предыдущих случаях, само собой для агрегации нужно использовать только поля которые могут быть просуммированы иначе получим дамп времени выполнения.
Код: You are not allowed to view links. Register or Login
DATA: gc_aggr TYPE REF TO cl_salv_aggregations.

* Выполнить агрегирование по колонке незапланированных затрат
  gc_aggr = gc_alv_table->get_aggregations( ).
  gc_aggr->add_aggregation( 'FRATH' ).
Как видим все достаточно просто, при этом если мы хотим так же и получить дополнительные подсуммы, то при определении параметров сортировки, нужно для колонки указать, что по нее будет выполняться расчет подсумм. Например, для колонки год хотим получить подсуммы, тогда изменим немного вызов класса сортировки, т.е. объявим колонку сортировки следующим образом:
Код: You are not allowed to view links. Register or Login
gc_sorts->add_sort( columnname = 'MJAHR' sequence = '2' subtotal = 'X' ).

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

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 758
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран, пример программы использования данного класса:

Код: You are not allowed to view links. Register or Login
*&---------------------------------------------------------------------*
*& Report  YTSH_TEMP_GRID
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ytsh_temp_grid.
INCLUDE <icon>.

* Объявляем внутреннюю таблицу, со своими полями + поля из таблицы MKPF
DATA: BEGIN OF gt_mkpf OCCURS 10,
  sel(1) TYPE c.
        INCLUDE STRUCTURE mkpf.
DATA: my_field(5) TYPE c,
      my_data TYPE matnr,
END OF gt_mkpf.

* Объявляем объект типа cl_salv_table, который выведет наши данные в виде ALV
DATA: gc_alv_table TYPE REF TO cl_salv_table,
      gc_columns TYPE REF TO cl_salv_columns_table,
      gc_colwork TYPE REF TO cl_salv_column_table,
      gc_sorts TYPE REF TO cl_salv_sorts,
      gc_functions TYPE REF TO cl_salv_functions,
      gc_display TYPE REF TO cl_salv_display_settings,
      gc_layout TYPE REF TO cl_salv_layout,
      gc_aggr TYPE REF TO cl_salv_aggregations.


DATA: keys TYPE salv_s_layout_key.


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[] ).

* Получим каталог полей
  gc_columns = gc_alv_table->get_columns( ).
* Получим поле по имени
  gc_colwork ?= gc_columns->get_column( 'SEL' ).
* Зададим заголовок колонки обработанных документов
  gc_colwork->set_long_text( 'Обработанные строки в таблице' ).
  gc_colwork->set_medium_text( 'ОбрабСтроки' ).
  gc_colwork->set_short_text( 'ОбрСтр' ).
* Задать центрирование для вывода поля, тип словаря SALV_DO_ALIGNMENT
  gc_colwork->set_alignment( '3' ).

* Получим поле по имени
  gc_colwork ?= gc_columns->get_column( 'MY_DATA' ).
* Задать выравнивание по левому краю для вывода поля, тип словаря SALV_DO_ALIGNMENT
  gc_colwork->set_alignment( '1' ).

* Получить список полей для сортировки
  gc_sorts = gc_alv_table->get_sorts( ).
  gc_sorts->add_sort( columnname = 'MBLNR' sequence = '2' ).
  gc_sorts->add_sort( columnname = 'MJAHR' sequence = '2' subtotal = 'X' ).

* Получим список функциональных клавиш и активируем их все
  gc_functions = gc_alv_table->get_functions( ).
  gc_functions->set_all( 'X' ).

* Изменим заголовок таблицы
  gc_display = gc_alv_table->get_display_settings( ).
  gc_display->set_list_header( 'Заголовок таблицы' ).

* Добавим ведение вариантов отражения таблицы
  gc_layout = gc_alv_table->get_layout( ).
  keys-report = sy-repid.
  gc_layout->set_key( keys ).
  gc_layout->set_save_restriction( '3' ).

* Выполнить агрегирование по колонке незапланированных затрат
  gc_aggr = gc_alv_table->get_aggregations( ).
  gc_aggr->add_aggregation( 'FRATH' ).

* Вывести ALV-таблицу на экран
  gc_alv_table->display( ).

Оффлайн NachDenken

  • Newbie
  • *
  • Сообщений: 158
  • Репутация: +9/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
+ про стандартные примеры пакет SALV_OBJECTS
программы se38 -> SALV*DEMO*
к ним гуи статусы группа функций SALV_METADATA_STATUS

ошень любим этот класс :)

Оффлайн gulya9

  • Newbie
  • *
  • Сообщений: 8
  • Репутация: +0/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYears
А подскажите пожалуйста как можно получить (в другую таблицу, или переменную) подсуммы в этом классе?
Задача состоит в выгрузке в Excel таблицы с промежуточными итогами. Отчет годовой (сумм много) и хотелось бы эти подсуммы не считать заново в программе или Excel, а брать из ALV, подскажите это возможно?

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 758
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
А подскажите пожалуйста как можно получить (в другую таблицу, или переменную) подсуммы в этом классе?
Что-то мне кажется, что это будет сложно реализовать особенно для больших таблиц, которые ALV-таблица не грузит все сразу на клиента. А почему вы сами эти подсуммы в запросе не хотите посчитать и отразить в таблице только их? В общем может после праздников посмотрю на это дело внимательнее.

Оффлайн Паганель

  • Я НЕ ЗАНИМАЮСЬ SAP
  • Administrator
  • Full Member
  • *****
  • Сообщений: 1 367
  • Репутация: +20/-0
  • Пол: Мужской
  • https://noteifyapp.com
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • MacPlus Software
You are not allowed to view links. Register or Login
А подскажите пожалуйста как можно получить (в другую таблицу, или переменную) подсуммы в этом классе?
Задача состоит в выгрузке в Excel таблицы с промежуточными итогами. Отчет годовой (сумм много) и хотелось бы эти подсуммы не считать заново в программе или Excel, а брать из ALV, подскажите это возможно?

Посмотри функции с группы функций SKBH:
Код: You are not allowed to view links. Register or Login
INCLUDE LSKBHU01.   "ALV_GROUPLEVELS_GET
INCLUDE LSKBHU02.   "ALV_SUBTOTALS_GET
INCLUDE LSKBHU03.   "ALV_INTERFACE_CHECK
INCLUDE LSKBHU04.   "ALV_GROUPLEVELS_WITH_FILTER
INCLUDE LSKBHU05.   "ALV_OPTIONS_FOR_SUBTOTALS
INCLUDE LSKBHU06.   "ALV_TABLE_CREATE
INCLUDE LSKBHU09.   "ALV_LIST_SORTING_DEFINE
INCLUDE LSKBHU10.   "ALV_LIST_VARIANT_DEFINE
INCLUDE LSKBHU11.   "ALV_POPUP_TO_SEARCH
INCLUDE LSKBHU12.   "K_KKB_FIELDCAT_MERGE
INCLUDE LSKBHU25.   "ALV_SUMLEVEL_GET
INCLUDE LSKBHU18.   "LVC_FILTER_FROM_SORT
INCLUDE LSKBHU20.   "LVC_FILTER_TO_SORT
INCLUDE LSKBHU22.   "K_KKB_FIELDCAT_COMPLETE
INCLUDE LSKBHU23.   "K_KKB_TOP_OF_PAGE_HEADER
INCLUDE LSKBHU27.   "ALV_SUBTOTALS_GET_H
INCLUDE LSKBHU07.   "ALV_GENERIC_DIALOG
INCLUDE LSKBHU08.   "ALV_CONSISTENCY_CHECK
INCLUDE LSKBHU13.   "ALV_POPUP_TO_SEARCH2
INCLUDE LSKBHU14.   "BCALV_GENERATE_ALV_T_T2
INCLUDE LSKBHU15.   "KKBLO_FILTER_FROM_SORT
INCLUDE LSKBHU16.   "KKBLO_FILTER_TO_SORT
INCLUDE LSKBHU17.   "GET_GLOBALS_FROM_SKBH
INCLUDE LSKBHU19.   "K_KKB_FIELDCAT_MERGE2
INCLUDE LSKBHU21.   "BCALV_GENERATE_TEST_DATA
Я не делал, но вот коллега точно, и вроде бы не плохо получилось
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login

Оффлайн gulya9

  • Newbie
  • *
  • Сообщений: 8
  • Репутация: +0/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Цитата: Uukrul  link=topic=1401.msg8241#msg8241 date=1293445912
Что-то мне кажется, что это будет сложно реализовать особенно для больших таблиц, которые ALV-таблица не грузит все сразу на клиента. А почему вы сами эти подсуммы в запросе не хотите посчитать и отразить в таблице только их? В общем может после праздников посмотрю на это дело внимательнее.

Вот как раз по тому что для больших таблиц отчет нужно делать по этому и думала уже "брать" откуда то подсчитанные суммы - чтоб быстрее было. Конечно есть ещё два варианта - подсчитывать в программе или в экселевском макросе подсуммы, но это мне кажется менее правильно. Ведь класс то уже имеет эти данные, значит их можно как то получить.

Оффлайн gulya9

  • Newbie
  • *
  • Сообщений: 8
  • Репутация: +0/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYears
You are not allowed to view links. Register or Login
Посмотри функции с группы функций SKBH:
Код: You are not allowed to view links. Register or Login
INCLUDE LSKBHU01.   "ALV_GROUPLEVELS_GET
INCLUDE LSKBHU02.   "ALV_SUBTOTALS_GET
INCLUDE LSKBHU03.   "ALV_INTERFACE_CHECK
INCLUDE LSKBHU04.   "ALV_GROUPLEVELS_WITH_FILTER
INCLUDE LSKBHU05.   "ALV_OPTIONS_FOR_SUBTOTALS
INCLUDE LSKBHU06.   "ALV_TABLE_CREATE
INCLUDE LSKBHU09.   "ALV_LIST_SORTING_DEFINE
INCLUDE LSKBHU10.   "ALV_LIST_VARIANT_DEFINE
INCLUDE LSKBHU11.   "ALV_POPUP_TO_SEARCH
INCLUDE LSKBHU12.   "K_KKB_FIELDCAT_MERGE
INCLUDE LSKBHU25.   "ALV_SUMLEVEL_GET
INCLUDE LSKBHU18.   "LVC_FILTER_FROM_SORT
INCLUDE LSKBHU20.   "LVC_FILTER_TO_SORT
INCLUDE LSKBHU22.   "K_KKB_FIELDCAT_COMPLETE
INCLUDE LSKBHU23.   "K_KKB_TOP_OF_PAGE_HEADER
INCLUDE LSKBHU27.   "ALV_SUBTOTALS_GET_H
INCLUDE LSKBHU07.   "ALV_GENERIC_DIALOG
INCLUDE LSKBHU08.   "ALV_CONSISTENCY_CHECK
INCLUDE LSKBHU13.   "ALV_POPUP_TO_SEARCH2
INCLUDE LSKBHU14.   "BCALV_GENERATE_ALV_T_T2
INCLUDE LSKBHU15.   "KKBLO_FILTER_FROM_SORT
INCLUDE LSKBHU16.   "KKBLO_FILTER_TO_SORT
INCLUDE LSKBHU17.   "GET_GLOBALS_FROM_SKBH
INCLUDE LSKBHU19.   "K_KKB_FIELDCAT_MERGE2
INCLUDE LSKBHU21.   "BCALV_GENERATE_TEST_DATA
Я не делал, но вот коллега точно, и вроде бы не плохо получилось

Спасибо, сегодня функцию ALV_SUBTOTALS_GET разбирала, не пришла ни к чему...завтра может со свежей головой найду ответ =)

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 758
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Спасибо, сегодня функцию ALV_SUBTOTALS_GET разбирала, не пришла ни к чему...завтра может со свежей головой найду ответ =)
Как-то у меня это все вызывает сомнения, может лучше тогда потратить время и написать свой подзапрос... хотя конечно если получите положительный результат, то будет интересно.

Оффлайн insaf121

  • Newbie
  • *
  • Сообщений: 25
  • Репутация: +1/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYears
Хочу немножко поделится с народом. :)

Объявить:

Код: You are not allowed to view links. Register or Login
DATA:
       keys TYPE salv_s_layout_key, "для варианта
       lf_variant TYPE slis_vari. "Вариант отображения

Код:
Код: You are not allowed to view links. Register or Login
* Добавим ведение вариантов отражения таблицы


*   1. Set Layout Key .. Unique key identifies the Differenet ALVs
gc_layout = gc_alv_table->get_layout( ).
keys-REPORT = sy-repid.
gc_layout->set_key( keys ).

*   2. Remove Save layout the restriction.
    gc_layout->set_save_restriction( if_salv_c_layout=>restrict_none ).


**   Установка варианта по умолчанию
  lf_variant = '/NUR'.  "Имя варианта  (Комментарий не забудь / в начале имени).

           gc_layout->set_initial_layout( lf_variant ).

« Последнее редактирование: Март 25, 2011, 11:04:59 am от insaf121 »

Оффлайн insaf121

  • Newbie
  • *
  • Сообщений: 25
  • Репутация: +1/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYears
Пример для чекбокса и линков ну и двойное нажатие по аналогии :D

В глобальных переменных:
Код: You are not allowed to view links. Register or Login
class lcl_handle_events definition deferred.   Класс для обработки линков,
двойных кликов и прочего

DATA: gr_events TYPE REF TO lcl_handle_events.

CLASS lcl_handle_events DEFINITION.
  PUBLIC SECTION.
  METHODS:
  on_user_command FOR EVENT added_function OF cl_salv_events
  IMPORTING e_salv_function,

    on_before_salv_function FOR EVENT before_salv_function OF cl_salv_events
  IMPORTING e_salv_function,

    on_after_salv_function FOR EVENT after_salv_function OF cl_salv_events
  IMPORTING e_salv_function,

    on_double_click FOR EVENT double_click OF cl_salv_events_table
  IMPORTING row column,

    on_link_click FOR EVENT link_click OF cl_salv_events_table
  IMPORTING row column.
ENDCLASS.                    "lcl_handle_events DEFINITION

*---------------------------------------------------------------------*
*       CLASS lcl_handle_events IMPLEMENTATION
*---------------------------------------------------------------------*
* §5.2 implement the events for handling the events of cl_salv_table
*---------------------------------------------------------------------*
CLASS lcl_handle_events IMPLEMENTATION.
  METHOD on_user_command.
 ENDMETHOD.                    "on_user_command

  METHOD on_before_salv_function.
  ENDMETHOD.                    "on_before_salv_function

  METHOD on_after_salv_function.
 ENDMETHOD.                    "on_after_salv_function

  METHOD on_double_click.

  ENDMETHOD.                    "on_double_click

  METHOD on_link_click.
        IF row <> 0.
    IF column = 'CHECKBOX'.
      READ TABLE z_tab INTO x_tab INDEX row.
      IF x_tab-CHECKBOX = 'X'.

           LOOP AT z_tab into x_tab WHERE INDX = x_TAB-INDX.
      x_tab-CHECKBOX = ''.
      MODIFY z_tab FROM x_tab.
      ENDLOOP.
gc_alv_table->refresh( ). "Нужно для обработки изменения в экране.
else.
        LOOP AT z_tab into x_tab WHERE INDX = x_TAB-INDX.
      x_tab-CHECKBOX = 'X'.
      MODIFY z_tab FROM x_tab.
      ENDLOOP.
gc_alv_table->refresh( ).
endif.
else.

      READ TABLE z_tab INTO x_tab INDEX row.
        IF x_tab-CHECKBOX = 'X'.


      SET PARAMETER ID: 'BLN' FIELD x_tab-zbelnr,
      'BUK' FIELD '1000',
      'GJR' FIELD '2010'.

      CALL TRANSACTION 'FB02' AND SKIP FIRST SCREEN.
         ENDIF.

 ENDIF.
     ENDIF.
  ENDMETHOD.                    "on_single_click
ENDCLASS.                    "lcl_handle_events IMPLEMENTATION

В теле программы:
Код: You are not allowed to view links. Register or Login
*Получим каталог полей таблицы
  gc_columns = gc_alv_table->get_columns( ).


*-Нажимаемый чекбокс одновременно является ссылкой
  gc_colwork ?= gc_columns->get_column( 'CHECKBOX' ).
  gc_colwork->set_cell_type( if_salv_c_cell_type=>checkbox_hotspot ).
  gc_colwork->set_long_text( 'CHECKBOX' ).

*-Ссылка
  gc_colwork ?= gc_columns->get_column( 'ZBELNR' ).
   gc_colwork->set_cell_type( if_salv_c_cell_type=>hotspot ).
* Получить события для таблицы
  gc_events = gc_alv_table->get_event( ).
*--------------------------------------------------------------------*
*Создание объекта обработки
  CREATE OBJECT gr_events.

*... §6.1 register to the event USER_COMMAND
  SET HANDLER gr_events->on_user_command FOR gc_events.
*... §6.2 register to the event BEFORE_SALV_FUNCTION
  SET HANDLER gr_events->on_before_salv_function FOR gc_events.
*... §6.3 register to the event AFTER_SALV_FUNCTION
  SET HANDLER gr_events->on_after_salv_function FOR gc_events.
*... §6.4 register to the event DOUBLE_CLICK
  SET HANDLER gr_events->on_double_click FOR gc_events.
*... §6.5 register to the event LINK_CLICK
  SET HANDLER gr_events->on_link_click FOR gc_events.
*--------------------------------------------------------------------
[Code/]

Оффлайн liana

  • Newbie
  • *
  • Сообщений: 6
  • Репутация: +0/-0
  • YearsYearsYearsYearsYearsYearsYearsYears
Круто! Спасибо автору! Долго искала решение своей проблемы)

Оффлайн liana

  • Newbie
  • *
  • Сообщений: 6
  • Репутация: +0/-0
  • YearsYearsYearsYearsYearsYearsYearsYears
А что насчет даблклика в рамках этого класса? Можно как-нибудь это проще сделать? Когда щелкаешь по полю или ячейке и происходит call transaction.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 758
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
А что насчет даблклика в рамках этого класса? Можно как-нибудь это проще сделать?
You are not allowed to view links. Register or Login - ну типа как тут написал insaf121, можно сделать.

Оффлайн liana

  • Newbie
  • *
  • Сообщений: 6
  • Репутация: +0/-0
  • YearsYearsYearsYearsYearsYearsYearsYears
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login - ну типа как тут написал insaf121, можно сделать.

 :o Ага, тупанула) сейчас попробуем-с... ;)

Оффлайн liana

  • Newbie
  • *
  • Сообщений: 6
  • Репутация: +0/-0
  • YearsYearsYearsYearsYearsYearsYearsYears
А нет ли скриншота результата работы кода, присланного уважаемым insaf121 ?

Оффлайн liana

  • Newbie
  • *
  • Сообщений: 6
  • Репутация: +0/-0
  • YearsYearsYearsYearsYearsYearsYearsYears
Код: You are not allowed to view links. Register or Login
METHOD on_link_click.
        IF row <> 0.
    IF column = 'CHECKBOX'.
      READ TABLE z_tab INTO x_tab INDEX row.
      IF x_tab-CHECKBOX = 'X'.

Уважаемые! А что за таблицы z_tab  и x_tab .
Как полагаю, сначала определяется type itab (допустим), потом  z_tab type itab и x_tab like z_tab?
Нужна очень ваша помощь...
P.S.: сильно не бить, я начинающая только... ::)

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 758
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Уважаемые! А что за таблицы z_tab  и x_tab .
Это какие-то таблицы которые выводятся на экрана, Вообще-то данный метод возвращает вам две переменные:
Код: You are not allowed to view links. Register or Login
ROW Type SALV_DE_ROW
COLUMN Type SALV_DE_COLUMN
Первая ROW - это строка таблицы где выл выполнен клик мышью, а вторая COLUMN - имя колонки, т.е. что это за переменные, вы когда сказали классу показывать что-то, это же была таблица которуб вы вывели на экран:
Код: You are not allowed to view links. Register or Login
  cl_salv_table=>factory( IMPORTING r_salv_table = gc_alv_table
                          CHANGING t_table = gt_mkpf[] ).
В данном случае это таблица gt_mkpf, так что в этом методе мне будет возвращена строка на которой был клик мышью и имя колонки, т.е. в данном случае может вернутся например что-то типа ROW = 5, а COLUMN = 'BUDAT', т.е пользователь сделал клик мышью в пятой строке на колонке даты проводки документа.

Оффлайн liana

  • Newbie
  • *
  • Сообщений: 6
  • Репутация: +0/-0
  • YearsYearsYearsYearsYearsYearsYearsYears
Спасибо!  ;)
А Вы не в курсе как определять эти таблицы? Просто уже долго возилась в классах с даблкликами, что решила перейти на ФМ и решать проблему там.  :-[

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 758
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Спасибо!  ;)
А Вы не в курсе как определять эти таблицы? Просто уже долго возилась в классах с даблкликами, что решила перейти на ФМ и решать проблему там.  :-[
Что значит как определять? Как обычно это же ваша таблица в которую вы должны прочитать данные, а уже потом передать ее для класса, чтобы он отобрази данные. У меня в примере она объявлена так:
Код: 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.

Оффлайн jacknk88

  • Newbie
  • *
  • Сообщений: 120
  • Репутация: +4/-0
  • YearsYearsYearsYearsYearsYearsYearsYears
БОЛЬШОЕ СПАСИБО автору. Я можно сказать "чайник" -  только начал изучать abap. Все понятно и доступно.
 Есть вопрос к профи:  мне нужно выделить записи (строки) в alv, поставить кнопку в тулбар SELECT ALL и DESELECT ALL, и можно еще пару другтх для удаления, корректировки и т.п. Можно ли это сделать?????????? Повторюсь, я чайник)))

PS. было бы вообще классно если здесь были представлены синтаксесы всех настроек таблицы или напишите плиз где можно найти подробную информацию того что и как делать с таблицами alv?????

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 758
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Есть вопрос к профи:  мне нужно выделить записи (строки) в alv, поставить кнопку в тулбар SELECT ALL и DESELECT ALL, и можно еще пару другтх для удаления, корректировки и т.п. Можно ли это сделать?????????? Повторюсь, я чайник)))
Кнопки сюда добавить можно, чуть позже накидаю пример.  Ограничение правда одно нельзя добавить колонку с кнопкой типа выделить строку (вообще похоже для этого класса нельзя сделать колонку в которой будет выведена кнопка), но можно это решить через колонку типа чек-бокс. Пример чуть позже.
You are not allowed to view links. Register or Login
PS. было бы вообще классно если здесь были представлены синтаксесы всех настроек таблицы или напишите плиз где можно найти подробную информацию того что и как делать с таблицами alv?????
Ну это вряд ли, много писать придется к сожалению, так что дело не быстрое. Кстати этот класс CL_SALV_TABLE, только одна из надстроек над стандартным классом ALV - cl_gui_alv_grid. Он упрощает работу с таблицами, но и накладывает ограничения на некоторые свойства основного класса. Так что если хотите получить полные возможности работы с ALV-таблицей, нужно читать об использовании cl_gui_alv_grid.
« Последнее редактирование: Сентябрь 27, 2012, 01:27:34 am от Uukrul »

Оффлайн jacknk88

  • Newbie
  • *
  • Сообщений: 120
  • Репутация: +4/-0
  • YearsYearsYearsYearsYearsYearsYearsYears
вроде получилось после долгих мучений: только пока не знаю работает ли это правильно

DATA:   go_alv       TYPE REF TO cl_salv_table,
        go_columns   TYPE REF TO cl_salv_columns,
        lr_selections type ref to cl_salv_selections,
        go_column    TYPE REF TO cl_salv_column.


  TRY.
      cl_salv_table=>factory(
         IMPORTING
           r_salv_table = go_alv
         CHANGING
           t_table = gt_all[] ). " моя таблица
    CATCH cx_salv_msg .
      MESSAGE 'Ошибка при создании ALV' TYPE 'E'.
  ENDTRY.


 go_alv->set_screen_status( EXPORTING
                              report = 'SAPLSALV_METADATA_STATUS'
                              pfstatus = 'SALV_TABLE_STANDARD'
                              set_functions = CL_SALV_MODEL_BASE=>C_FUNCTIONS_ALL ).

 lr_selections = go_alv->get_selections( ).

 lr_selections->set_selection_mode( if_salv_c_selection_mode=>ROW_COLUMN  ).


go_alv->display( ). " вызов экрана


теперь надо сделать следующее, но не знаю как: Сделать кнопку при нажатии на которой будут обрабатываться только выделенные строки :(....может знаете что хотябы использовать надо?