Sapforum.Biz

Инструменты => ABAP - Инструментальные средства => SE24 - Построитель объектов => Тема начата: Uukrul от Декабрь 13, 2010, 03:05:06 am

Название: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Декабрь 13, 2010, 03:05:06 am
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: Данный пост, так же будет содержать все одним файлом, как обычно условия такие -  актуальность данного файла будет приводится в порядок, по мере наличия времени.
Название: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Декабрь 13, 2010, 03:06:59 am
Далее, наверное, будет интересным добавить собственные критерии сортировки данных для колонок таблицы. Для этого у класса есть специальный метод, который работает аналогично методу работы с данными колонок таблицы.
Код: 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
Название: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Декабрь 13, 2010, 03:08:19 am
Теперь рассмотрим отдельный класс, который позволяет вести управление вариантами представления таблицы.
Код: 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' ).

В общем если нужно быстро вывести таблицу на экран то можно воспользоваться данным классом, значительно оптимизирует время написания необходимого кода. Возможности класса очень большие, так что если разбираться в его тонкостях времени потребуется много, а поэтому если кто-то получит свои примеры, например раскопает возможность добавления своих кнопок, то надеюсь поделится своими знаниями в этой теме.
Название: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Декабрь 13, 2010, 03:09:17 am
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( ).
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: NachDenken от Декабрь 13, 2010, 11:18:52 am
+ про стандартные примеры пакет SALV_OBJECTS
программы se38 -> SALV*DEMO*
к ним гуи статусы группа функций SALV_METADATA_STATUS

ошень любим этот класс :)
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: gulya9 от Декабрь 26, 2010, 09:06:01 am
А подскажите пожалуйста как можно получить (в другую таблицу, или переменную) подсуммы в этом классе?
Задача состоит в выгрузке в Excel таблицы с промежуточными итогами. Отчет годовой (сумм много) и хотелось бы эти подсуммы не считать заново в программе или Excel, а брать из ALV, подскажите это возможно?
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Декабрь 27, 2010, 12:31:52 pm
You are not allowed to view links. Register or Login
А подскажите пожалуйста как можно получить (в другую таблицу, или переменную) подсуммы в этом классе?
Что-то мне кажется, что это будет сложно реализовать особенно для больших таблиц, которые ALV-таблица не грузит все сразу на клиента. А почему вы сами эти подсуммы в запросе не хотите посчитать и отразить в таблице только их? В общем может после праздников посмотрю на это дело внимательнее.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Паганель от Декабрь 27, 2010, 01:09:34 pm
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
Я не делал, но вот коллега точно, и вроде бы не плохо получилось
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: gulya9 от Декабрь 27, 2010, 05:00:04 pm
Цитата: Uukrul  link=topic=1401.msg8241#msg8241 date=1293445912
Что-то мне кажется, что это будет сложно реализовать особенно для больших таблиц, которые ALV-таблица не грузит все сразу на клиента. А почему вы сами эти подсуммы в запросе не хотите посчитать и отразить в таблице только их? В общем может после праздников посмотрю на это дело внимательнее.

Вот как раз по тому что для больших таблиц отчет нужно делать по этому и думала уже "брать" откуда то подсчитанные суммы - чтоб быстрее было. Конечно есть ещё два варианта - подсчитывать в программе или в экселевском макросе подсуммы, но это мне кажется менее правильно. Ведь класс то уже имеет эти данные, значит их можно как то получить.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: gulya9 от Декабрь 27, 2010, 05:02:13 pm
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 разбирала, не пришла ни к чему...завтра может со свежей головой найду ответ =)
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Декабрь 28, 2010, 12:37:24 am
You are not allowed to view links. Register or Login
Спасибо, сегодня функцию ALV_SUBTOTALS_GET разбирала, не пришла ни к чему...завтра может со свежей головой найду ответ =)
Как-то у меня это все вызывает сомнения, может лучше тогда потратить время и написать свой подзапрос... хотя конечно если получите положительный результат, то будет интересно.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: insaf121 от Март 25, 2011, 11:00:44 am
Хочу немножко поделится с народом. :)

Объявить:

Код: 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 ).

Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: insaf121 от Март 25, 2011, 11:13:16 am
Пример для чекбокса и линков ну и двойное нажатие по аналогии :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/]
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: liana от Август 01, 2012, 08:32:02 am
Круто! Спасибо автору! Долго искала решение своей проблемы)
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: liana от Сентябрь 06, 2012, 03:04:21 pm
А что насчет даблклика в рамках этого класса? Можно как-нибудь это проще сделать? Когда щелкаешь по полю или ячейке и происходит call transaction.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Сентябрь 06, 2012, 03:39:57 pm
You are not allowed to view links. Register or Login
А что насчет даблклика в рамках этого класса? Можно как-нибудь это проще сделать?
http://sapforum.biz/index.php/topic,1401.msg8616.html#msg8616 - ну типа как тут написал insaf121, можно сделать.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: liana от Сентябрь 07, 2012, 08:59:48 am
You are not allowed to view links. Register or Login
http://sapforum.biz/index.php/topic,1401.msg8616.html#msg8616 - ну типа как тут написал insaf121, можно сделать.

 :o Ага, тупанула) сейчас попробуем-с... ;)
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: liana от Сентябрь 07, 2012, 09:41:15 am
А нет ли скриншота результата работы кода, присланного уважаемым insaf121 ?
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: liana от Сентябрь 10, 2012, 06:35:23 am
Код: 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.: сильно не бить, я начинающая только... ::)
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Сентябрь 10, 2012, 02:54:44 pm
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', т.е пользователь сделал клик мышью в пятой строке на колонке даты проводки документа.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: liana от Сентябрь 12, 2012, 10:15:39 am
Спасибо!  ;)
А Вы не в курсе как определять эти таблицы? Просто уже долго возилась в классах с даблкликами, что решила перейти на ФМ и решать проблему там.  :-[
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Сентябрь 12, 2012, 10:41:24 am
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.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: jacknk88 от Сентябрь 26, 2012, 06:45:35 pm
БОЛЬШОЕ СПАСИБО автору. Я можно сказать "чайник" -  только начал изучать abap. Все понятно и доступно.
 Есть вопрос к профи:  мне нужно выделить записи (строки) в alv, поставить кнопку в тулбар SELECT ALL и DESELECT ALL, и можно еще пару другтх для удаления, корректировки и т.п. Можно ли это сделать?????????? Повторюсь, я чайник)))

PS. было бы вообще классно если здесь были представлены синтаксесы всех настроек таблицы или напишите плиз где можно найти подробную информацию того что и как делать с таблицами alv?????
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Сентябрь 27, 2012, 01:25:53 am
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.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: jacknk88 от Сентябрь 27, 2012, 07:29:12 am
вроде получилось после долгих мучений: только пока не знаю работает ли это правильно

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( ). " вызов экрана


теперь надо сделать следующее, но не знаю как: Сделать кнопку при нажатии на которой будут обрабатываться только выделенные строки :(....может знаете что хотябы использовать надо?
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: jacknk88 от Сентябрь 27, 2012, 09:16:29 am
1) кнопку тоже установил, а прописывать где - вот здесь-perform vigr (если кнопка одна!)?:
Код: You are not allowed to view links. Register or Login
class lcl_handle_events definition deferred. "Объявляем локальный класс для обработки события
class lcl_handle_events definition.
  public section.
    methods:
      on_user_command for event added_function of cl_salv_events
        importing e_salv_function.
endclass.

class lcl_handle_events implementation.
  method on_user_command.
    perform vigr.
  endmethod.

если 4 кнопки то так чтоли?

Код: You are not allowed to view links. Register or Login
class lcl_handle_events definition.
  public section.
    methods:
      on_user_command for event added_function of cl_salv_events
        importing e_salv_function,

endclass.

class lcl_handle_events implementation.
  method on_user_command.
    perform handle_user_command using e_salv_function.
  endmethod.
form handle_user_command using i_ucomm type salv_de_function.

form d0100_pbo .
 try.
      l_text = text-b01.
      lr_functions->add_function(
        name     = 'GET_SEL'
        icon     = space
        text     = l_text
        tooltip  = l_text
        position = if_salv_c_function_position=>right_of_salv_functions ).
      catch cx_salv_wrong_call cx_salv_existing.
    endtry.

    try.
      l_text = text-b02.
      lr_functions->add_function(
        name     = 'SET_ROWS'
        icon     = space
        text     = l_text
        tooltip  = l_text
        position = if_salv_c_function_position=>right_of_salv_functions ).
      catch cx_salv_wrong_call cx_salv_existing.
    endtry.

    try.
      l_text = text-b03.
      lr_functions->add_function(
        name     = 'SET_COLS'
        icon     = space
        text     = l_text
        tooltip  = l_text
        position = if_salv_c_function_position=>right_of_salv_functions ).
      catch cx_salv_wrong_call cx_salv_existing.
    endtry.

    try.
      l_text = text-b04.
      lr_functions->add_function(
        name     = 'SET_CELL'
        icon     = space
        text     = l_text
        tooltip  = l_text
        position = if_salv_c_function_position=>right_of_salv_functions ).
      catch cx_salv_wrong_call cx_salv_existing.
    endtry.
endform.
  form handle_user_command using i_ucomm type salv_de_function.

  case i_ucomm.
    when 'GET_SEL'.
      perform get_selections.
    when 'SET_ROWS'.
      perform set_selected_rows.
    when 'SET_COLS'.
      perform set_selected_cols.
    when 'SET_CELL'.
      perform set_current_cell.
  endcase.

endform.
только для этого видимо надо создать экран и прописать это
Код: You are not allowed to view links. Register or Login
process before output.
  module d0100_pbo.

process after input.
  module d0100_pai.

эти модули выглядят так:
Код: You are not allowed to view links. Register or Login
module d0100_pbo output.
  perform d0100_pbo.
endmodule.                 " d0100_pbo  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  d0100_pai  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
module d0100_pai input.
  perform d0100_pai.
endmodule.

так ??? все это я выдернул из SALV_DEMO_TABLE_SELECTIONS и SALV_DEMO_TABLE_EVENTS

только вот с экраном не получилось у меня...на module ссылается типа не объявлен....каков порядок действий в этом случаи (SALV_DEMO_TABLE_SELECTIONS ): куда, что и как создать надо чтобы все заработало???

2) а вот как определить и использовать выделенные строки - не знаю(((

3) чем отличается cl_salv_columns_table (который вы используете) и cl_salv_columns и аналогично для cl_salv_column_table и  cl_salv_column ?????

отрывок из вашего кода
Код: 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.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: jacknk88 от Сентябрь 27, 2012, 10:46:40 am
You are not allowed to view links. Register or Login
если кто-то получит свои примеры, например раскопает возможность добавления своих кнопок, то надеюсь поделится своими знаниями в этой теме.
вы это имели ввиду - то что я выше описал??
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Сентябрь 27, 2012, 12:59:24 pm
1. Делать модули PAI и PBO для этого класса будет лишним, это вы уже про глобальный класс построения ALV полезли читать, там где сетка размещается в специальном элементе экрана, контейнере, но в данном случае это не ваш метод.

2. Ниже идет пример как вывести поле с чек-боксом и обрабатывать его изменение путем двойного клика мышью в ячейке, а так же пример как добавить свои кнопки на панель инструментов и как их обрабатывать. Тонкость оказалась в том, что если мы используем стандартный класс работы с кнопками ALV-таблицы, то в данном случае метод CALL METHOD gc_functions->add_function не реализован т.е. добавить свою кнопку нельзя, поэтому надо использовать полностью свой статус. Шаблон статуса можно скопировать в свою программу из программы SAPLSALV_METADATA_STATUS, примеры на рисунках ниже. А далее уже в своей программе добавить в него свои кнопки, убрал лишнюю функциональность, так как тулбар к сожалению имеет ограниченную длину.

Ну и сам код программы:
Код: You are not allowed to view links. Register or Login
*&---------------------------------------------------------------------*
*& Report  YTSH_TEMP_GRID
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ytsh_temp_grid.

* Объявляем внутреннюю таблицу, со своими полями + поля из таблицы MKPF
DATA: BEGIN OF gt_mkpf OCCURS 10,
  check_box(1) TYPE c.
        INCLUDE STRUCTURE mkpf.
DATA: my_field(5) TYPE c,
      my_data TYPE matnr,
END OF gt_mkpf.
DATA: gs_mkpf LIKE 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_selections TYPE REF TO cl_salv_selections,
      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,
      gc_events TYPE REF TO cl_salv_events_table.

DATA: keys TYPE salv_s_layout_key,
      g_report TYPE syrepid,
      g_pfstatus TYPE sypfkey.


*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
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
DATA: gr_events TYPE REF TO lcl_handle_events.
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*



START-OF-SELECTION.
* Выбираем данные из MKPF
  SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_mkpf FROM mkpf.

  LOOP AT gt_mkpf.
* Все CHECK_BOX = "Х" для примера, перед первым показом данных
    gt_mkpf-check_box = 'X'.
*   Какое-то свое поле, занесем тоже значение перед выводом на экран
    gt_mkpf-my_data = gt_mkpf-vgart.
    MODIFY gt_mkpf.
  ENDLOOP.

* Статический метод класса для создания объекта и связывания с нашей таблицей
  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( 'CHECK_BOX' ).
* Зададим заголовок колонки обработанных документов
  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->set_cell_type( if_salv_c_cell_type=>checkbox ).


* События в таблице для пользовательской обработки
  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.

* Получим поле по имени
  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' ).

* Получим список функциональных клавиш и активируем их все, но так как нам нужные допонительные
* кнопки на экране, а метод CALL METHOD gc_functions->add_function не поддреживается, то создаем
* свой статус экрана содержащий стандартные кнопки + наши дополнительные кнопки.
  "gc_functions = gc_alv_table->get_functions( ).
  "gc_functions->set_all( 'X' ).

* Испльзуем свой PF-статус так как к стандартному кнопики не добавлются
  gc_alv_table->set_screen_status( report = sy-cprog pfstatus = 'PF_TABLE_STANDARD'
                                   set_functions = cl_salv_model_base=>c_functions_all ).

* Класс для работы с выделеными строками таблицы
  gc_selections = gc_alv_table->get_selections( ).
  gc_selections->set_selection_mode( if_salv_c_selection_mode=>row_column  ).

* Изменим заголовок таблицы
  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( ).

*---------------------------------------------------------------------*
*       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.
    DATA: l_index LIKE sy-tabix,
          lt_rows TYPE salv_t_row.

    CASE e_salv_function.
      WHEN 'BTN_1'.
*       Нажата первая кнопка

*       Получить выделенные строки
        gc_selections->get_selected_rows( RECEIVING value  = lt_rows ).
        LOOP AT lt_rows INTO l_index.
*         Прочитать данные таблицы для выделенной строки
          READ TABLE gt_mkpf INTO gs_mkpf INDEX l_index.
*         какя-нить обработка
        ENDLOOP.

      WHEN 'BTN_2'.
*       Нажата вторая кнопка
    ENDCASE.
  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.
    DATA: ls_stable TYPE lvc_s_stbl.
    IF row <> 0.
      IF column = 'CHECK_BOX'.
        READ TABLE gt_mkpf INTO gs_mkpf INDEX row.
        IF gs_mkpf-check_box = 'X'. gs_mkpf-check_box = space. ELSE. gs_mkpf-check_box = 'X'. ENDIF.
        MODIFY gt_mkpf FROM gs_mkpf INDEX row.
        ls_stable-row = 'X'.
        ls_stable-col = 'X'.
        gc_alv_table->refresh( ls_stable ). "Нужно для обработки изменения в экране.
      ENDIF.
    ENDIF.
  ENDMETHOD.                    "on_double_click

  METHOD on_link_click.

  ENDMETHOD.                    "on_single_click
ENDCLASS.                    "lcl_handle_events IMPLEMENTATION

PS: Вызов событий взят из примера предоставленного insaf121.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Сентябрь 27, 2012, 01:02:50 pm
Пример как это выглядит на рисунке ниже. Как видим две свои кнопки, возможность выделения строк и поле с чек-боксом который меняет свой статус по двойному клику в ячейке.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: jacknk88 от Сентябрь 27, 2012, 01:27:09 pm
спасибо огромное...я почти тоже самое сделал...но зачем создавать дополнительно поле CheckBox, если есть крайнее левое поле, кот-я уже позволяет выделять строки???
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Сентябрь 27, 2012, 01:32:29 pm
You are not allowed to view links. Register or Login
спасибо огромное...я почти тоже самое сделал...но зачем создавать дополнительно поле CheckBox, если есть крайнее левое поле, кот-я уже позволяет выделять строки???
Ну это я для примера... если работать без поля кнопки, ну и показать как обрабатывать клики мышью в ячейках, так сказать объединил два примера в одной программе.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: jacknk88 от Сентябрь 27, 2012, 03:04:31 pm
спасибо...все понятно и доступно...очень полезная вещь...вот добавить это в Ваш первоначальный pdf и будет супер)))

PS: все-таки чем отличается cl_salv_columns_table (который вы используете) и cl_salv_columns ?
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Сентябрь 27, 2012, 04:25:05 pm
You are not allowed to view links. Register or Login
спасибо...все понятно и доступно...очень полезная вещь...вот добавить это в Ваш первоначальный pdf и будет супер)))
Добавлю позже. Файл это так сказать типа из полезных дополнений и его обновление в отличии от форума на регулярной основе не выполянется  8)

You are not allowed to view links. Register or Login
PS: все-таки чем отличается cl_salv_columns_table (который вы используете) и cl_salv_columns ?
Ну я понял что имеется в виду вот это:

1.    gc_columns TYPE REF TO cl_salv_columns_table, "<- Список всех колонок таблицы
2.    gc_colwork TYPE REF TO cl_salv_column_table,  "<- Колонка таблицы для обработки

потому что именно cl_salv_columns, такого типа я у себя в программе не вижу в упор...

Так собственно вот ответ:

* Получим каталог полей это тип: cl_salv_columns_table т.е. класс который содержит все колонки
* таблицы которые будут показываться.
  gc_columns = gc_alv_table->get_columns( ).

* Получим поле по имени это тип cl_salv_columns, т.е. класс который содержит одну выбранную
* колонку с которой типа начинаем работать. В данном случае это колонка 'CHECK_BOX
  gc_colwork ?= gc_columns->get_column( 'CHECK_BOX' ).

т.е. фактически конечно можно было бы написать что-то типа так: gc_alv_table->get_columns( )->get_column( 'CHECK_BOX' )->set_long_text( 'Обработанные строки в таблице' )., но с точки зрения написания кода, длинно каждый раз так писать, да и по производительности будет хуже, так как раждый раз будет метод вызываться, который будет возвращать список из которого мы будем брать одну колонку из которой будем далее брать какое-то одно свойство... согласитесь наглядность падает.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: jacknk88 от Сентябрь 28, 2012, 07:13:31 am
спасибо за ответ..теперь стало понятней..но я имел ввиду именно то что написал:
вы используете cl_salv_columns_table , но есть и cl_salv_columns - кот-ый вы НЕ используете...это 2 разных класса, но выполняющих почти одни и теже функции...в cl_salv_columns_table намного больше методов, чем в cl_salv_columns.....просто я думал, что cl_salv_columns является подклассом cl_salv_columns_table - выходит ошибался...думал может вы знаете и объясните?
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Октябрь 29, 2012, 03:26:44 pm

Здравствуйте, уважаемые! Огромное спасибо Uukrul, очень полезный и простой класс показал. Я АБАПер начинающий, не судите пожалуйста строго, у меня возник вопрос по этому классу, я сначала воспользовался
Код: You are not allowed to view links. Register or Login
DATA: gc_alv_table TYPE REF TO cl_salv_table.
 cl_salv_table=>factory( IMPORTING r_salv_table = gc_alv_table
                           CHANGING t_table = im_tab[] ).
  gc_alv_table->display( ).

и вроде бы нормально, но мне нужно чтобы было чтобы и метод GET_FUNCTIONS, котоырй вы описали тоже работал
Код: 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' ).

Я извиняюсь ещё раз, я АБАПер начинающий, может кто поподробней объяснит,  а то я вставляю в начало тела программы, после объявления всех данных и переменных
Код: You are not allowed to view links. Register or Login
DATA: gc_alv_table TYPE REF TO cl_salv_table.
DATA: gc_functions TYPE REF TO cl_salv_functions.
.............

 cl_salv_table=>factory( IMPORTING r_salv_table = gc_alv_table
                           CHANGING t_table = im_tab[] ).
  gc_alv_table->display( ).

gc_functions = gc_alv_table->get_functions( ).
  gc_functions->set_all( 'X' ).


Но второй метод не отрабатывает, т.е. табличка отображается нормально то стандартной панели с кнопочками нету, может я что не так делаю? Может там ещё надо что нибудь дописывать? Буду весьма признателен за помощь.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Октябрь 29, 2012, 03:37:37 pm
 gc_alv_table->display( ) -  вот это вот показывает твою таблицу, т.е. его надо вставить в самом конце кода, а то у тебя сформировать таблицу и показать, а потом уже стоит активировать кнопки таблицу, но активировать то уже нечего.

Должно быть что-то типа такого:
Код: You are not allowed to view links. Register or Login
DATA: gc_alv_table TYPE REF TO cl_salv_table.
DATA: gc_functions TYPE REF TO cl_salv_functions.
.............

 cl_salv_table=>factory( IMPORTING r_salv_table = gc_alv_table
                           CHANGING t_table = im_tab[] ).

gc_functions = gc_alv_table->get_functions( ).
  gc_functions->set_all( 'X' ).

  gc_alv_table->display( ).
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Октябрь 29, 2012, 03:51:23 pm
Спасибо, дейвствительно, как вы и сказали, сделал, заработало. Буду изучать синтаксис...
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Октябрь 30, 2012, 07:54:30 am
Доброго времени суток, уважаемые! У меня опыть возникли затруднения с использованием этого класса. Возникла необходимость изменения имени некоторых столбцов выводимой таблички. Синтаксис пишу такой же какой вы и тут предоставили.
Код: You are not allowed to view links. Register or Login
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_functions TYPE REF TO cl_salv_functions.
START-OF-SELECTION.

Select * from......
........................

cl_salv_table=>factory( IMPORTING r_salv_table = gc_alv_table
                           CHANGING t_table = im_tab[] ).

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



* Получим список функциональных клавиш и активируем их все

 gc_functions = gc_alv_table->get_functions( ).
  gc_functions->set_all( 'X' ).

  gc_alv_table->display( ).

При компиляции падает в дамп


Не могу понять в чём дело? Может кто подскажет, буду весьма признателен.

Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Октябрь 30, 2012, 08:02:16 am
You are not allowed to view links. Register or Login
gc_colwork ?= gc_columns->get_column( 'Имя' ).
Мда?! Т.е. у вас поля внутренней таблицы названы русскими буквами? Не ну в 1С там можно конечно, про ABAP не видел. Значит так, ищем вот эту книгу: http://sapforum.biz/index.php/topic,117.0.html, других просто по ABAP нет, и читаем ее...
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Октябрь 30, 2012, 08:29:28 am
You are not allowed to view links. Register or Login
Мда?! Т.е. у вас поля внутренней таблицы названы русскими буквами? Не ну в 1С там можно конечно, про ABAP не видел. Значит так, ищем вот эту книгу: http://sapforum.biz/index.php/topic,117.0.html, других просто по ABAP нет, и читаем ее...

ой, запарился, извиняюcь,  имя сомого поля конечно же на английском языке name1, получается пишу

Код: You are not allowed to view links. Register or Login
gc_colwork ?= gc_columns->get_column( 'Name1' ).
  gc_colwork->set_medium_text( 'Имя на рус.' ).

Могу я так обозвать это поле в соответствии с вашим примером? Всё равно в дамп падает. Я понимаю что знаний мне не хватает, ту книжку которую вы предлагаете я постоянно читаю, но может вы всё же подскажете что не так на данный момент, а то мне буквально осталось то несколько названий полей поменять и запрос будет готов. Please!!!



Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Октябрь 30, 2012, 08:37:00 am
Я не много не допонял, происходит изменения краткого описания поля выводимого на экран на русском языке, т.е. поле Имя или происходит изменение поля выводимого их внутренней таблицы унаследованное с поля физической таблицы с именем name?
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Октябрь 30, 2012, 08:43:46 am
You are not allowed to view links. Register or Login
Я не много не допонял, происходит изменения краткого описания поля выводимого на экран на русском языке, т.е. поле Имя или происходит изменение поля выводимого их внутренней таблицы унаследованное с поля физической таблицы с именем name?
Есть внутренняя таблица описанная например так:
DATA: BEFIN OF lt_table OCCURS 1,
  name_one LIKE mseg-matnr,
  name_two LIKE mseg-matnr,
END OF lt_table.

Так вот это значит что в ALV будут выведены 2 колонки. Имена колонок (в смысле заглавия столбиков) будут выведены из описания домена/типа на который они ссылаются. Так вот вам надо было написать что-то типа такого:

gc_colwork ?= gc_columns->get_column( 'name_one' ).
gc_colwork->set_medium_text( 'Заголовок колонки один' ).

gc_colwork ?= gc_columns->get_column( 'name_two' ).
gc_colwork->set_medium_text( 'Заголовок колонки два' ).

ну где-то так.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Октябрь 30, 2012, 10:07:46 am
Ну вот у меня приблизительно тоже самое
Код: You are not allowed to view links. Register or Login
DATA: begin of im_tab OCCURS 100,
 im_bukrs LIKE lfb1-bukrs,   " балансовая единица
  im_lifnr LIKE lfa1-lifnr,   " номер кредитора
  im_name1 LIKE lfa1-name1,   " Наименование организации на рус. яз.
  im_name2 LIKE lfa1-name2,
END OF im_tab.

Ну вот я так и пишу как у вас в примере, сначала объвляю ссылки на классы
gc_colwork TYPE REF TO cl_salv_column_table,
      gc_functions TYPE REF TO cl_salv_functions.

затем пытаюсь

gc_columns = gc_alv_table->get_columns( ).
gc_colwork ?= gc_columns->get_column( 'Name1' ).
  gc_colwork->set_medium_text( 'Имя на рус.' ).

при компиляции падает в дамп.
(http://)

ругается на один из модулей, судя по скриншоту, может у вас ещё какие нибудь догадки?
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Октябрь 30, 2012, 10:09:42 am
Извиняюсь, скриншот не вставился.



Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Октябрь 30, 2012, 10:17:01 am
You are not allowed to view links. Register or Login
Извиняюсь, скриншот не вставился.
Мда, оно говорит что объект "Столбец" не найден?! Таки где-то похоже русский используется не там где надо.. потому что такого объекта на русском быть не должно.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Октябрь 30, 2012, 10:51:48 am
Да чо та я любое другое имя внутренней таблицы пытаюсь изменить тоже самое в дамп падает. И так же ругается что не может найти столбец с именем. Не пойму в чём дело.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Октябрь 30, 2012, 12:15:28 pm
You are not allowed to view links. Register or Login
Да чо та я любое другое имя внутренней таблицы пытаюсь изменить тоже самое в дамп падает. И так же ругается что не может найти столбец с именем. Не пойму в чём дело.
Текст программы в студию.. других вариантов нет. Но похоже что вы там уже такое накрутили, что помочь даже не знаю как.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Октябрь 30, 2012, 12:28:05 pm
Да текст собственно не очень то и мудрёный.
TABLES: lfa1, " Данные поставщиков
              lfb1. " Данные по БЕ
DATA: im_lfa1 LIKE lfa1 OCCURS 100 WITH HEADER LINE,
          im_lfb1 LIKE lfb1 OCCURS 100 WITH HEADER LINE.


TABLES: lfa1, " Данные поставщиков
              lfb1. " Данные по БЕ

DATA: begin of im_tab OCCURS 100,
 im_bukrs LIKE lfb1-bukrs,   
  im_lifnr LIKE lfa1-lifnr,   " номер кредитора
  im_name1 LIKE lfa1-name1,   " Наименование организации на рус. яз.
  im_name2 LIKE lfa1-name2,   " Наименование организации на англ.яз.
  im_erdat LIKE lfb1-erdat,   " Дата создания кредитора (На уровне БЕ)
  im_ernam like lfb1-ernam,   " Кем был создан кредитор (на уровне БЕ)
  im_loevm LIKE lfa1-loevm,   " метка удаления (Все БЕ)
  im_sperr LIKE lfa1-sperr,   " Блокировка (Все БЕ)
  im_sperm LIKE lfa1-sperm,   " Блокировка2 (Все закупочные организации).
  im_sperr2 like lfb1-sperr,  " Блокировка на уровне БЕ.
  im_loevm2 like lfb1-loevm,  " Метка удаления на уровне БЕ
  im_zahls like lfb1-zahls,   " Блокировка платежа на уровне БЕ
  im_stcd1 LIKE lfa1-stcd1,   " РНН организации
  im_stcd3 LIKE lfa1-stcd3,   " БИН организации
  im_stceg LIKE lfa1-stceg, 
Далее идёт selection screen
SELECTION-SCREEN BEGIN OF BLOCK lb WITH FRAME TITLE text-001.
SELECT-OPTIONS im_bukrs FOR lfb1-bukrs.
SELECT-OPTIONS im_name1 FOR lfa1-name1 DEFAULT 'AA' TO 'ZZ'.
SELECT-OPTIONS im_erdat FOR lfa1-erdat.
PARAMETERS: im_lifnr LIKE lfa1-lifnr,
            im_stcd1 LIKE lfa1-stcd1,
            im_stcd3 like lfa1-stcd3.
SELECTION-SCREEN END OF BLOCK lb.

SELECTION-SCREEN BEGIN OF BLOCK lb1 WITH FRAME TITLE text-002.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 5.
PARAMETERS: button1 RADIOBUTTON GROUP bt.
SELECTION-SCREEN COMMENT  10(30) text-003.
SELECTION-SCREEN END OF LINE.

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_functions TYPE REF TO cl_salv_functions.

START-OF-SELECTION.


IF button1 EQ 'X'.
    SELECT  * FROM lfb1 INTO  im_lfb1 WHERE bukrs IN im_bukrs .         " Условие выбора всех кредиторов
      im_tab-im_bukrs = im_lfb1-bukrs .
      im_tab-im_erdat = im_lfb1-erdat.
      im_tab-im_ernam = im_lfb1-ernam.
      im_tab-im_sperr2 = im_lfb1-sperr.
      im_tab-im_loevm2 = im_lfb1-loevm.
      im_tab-im_zahls = im_lfb1-zahls.
      SELECT * FROM lfa1  INTO im_lfa1
              WHERE lifnr = im_lfb1-lifnr.
        im_tab-im_lifnr = im_lfa1-lifnr.
        im_tab-im_name1 = im_lfa1-name1.
        im_tab-im_name2 = im_lfa1-name2.
        im_tab-im_erdat = im_lfa1-erdat.
        im_tab-im_loevm = im_lfa1-loevm.
        im_tab-im_sperr = im_lfa1-sperr.
        im_tab-im_sperm = im_lfa1-sperm.
        im_tab-im_stcd1 = im_lfa1-stcd1.
        im_tab-im_stceg = im_lfa1-stceg.
        im_tab-im_stcd3 = im_lfa1-stcd3.


        append im_tab.

      ENDSELECT.
    ENDSELECT.
cl_salv_table=>factory( IMPORTING r_salv_table = gc_alv_table
                           CHANGING t_table = im_tab[] ).
** Получим каталог полей таблицы
*  gc_columns = gc_alv_table->get_columns( ).
** Получим поле по имени
*  gc_colwork ?= gc_columns->get_column( 'im_name1' ).
*  gc_colwork->set_medium_text( 'Имя на рус.' ).
**   Задать центрирование для вывода поля, тип словаря SALV_DO_ALIGNMENT
*  gc_colwork->set_alignment( '3' ).


* Получим список функциональных клавиш и активируем их все

 gc_functions = gc_alv_table->get_functions( ).
  gc_functions->set_all( 'X' ).

  gc_alv_table->display( ).

Селект я вставил один только, на примере этого селекта, выбор радиобаттона всех кредиторов, всё работает нормально, и ваш класс отрабатывает, но вот именно с переименованием не получается.

Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Октябрь 30, 2012, 01:13:45 pm
Всё ни как не могу привыкнуть к некоторым АБАПовским штучкам, регистр букв надо было изменить

gc_colwork ?= gc_columns->get_column( 'IM_NAME1' )

и всё заработало.

Спасибо вам Uukrul за участие и за помощь.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Октябрь 30, 2012, 01:19:14 pm
Ну так работает. Да правильно регистр букв важен.. кстати используйте теги вверху страницы при оформлении текстов, например оформление программы в специальном блоке.
Код: You are not allowed to view links. Register or Login
*&---------------------------------------------------------------------*
*& Report  YTSH_TEST_ALV
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ytsh_test_alv.
TABLES: lfa1, " Данные поставщиков
              lfb1. " Данные по БЕ
DATA: im_lfa1 LIKE lfa1 OCCURS 100 WITH HEADER LINE,
          im_lfb1 LIKE lfb1 OCCURS 100 WITH HEADER LINE.

DATA: BEGIN OF im_tab OCCURS 100,
 im_bukrs LIKE lfb1-bukrs,
  im_lifnr LIKE lfa1-lifnr,   " номер кредитора
  im_name1 LIKE lfa1-name1,   " Наименование организации на рус. яз.
  im_name2 LIKE lfa1-name2,   " Наименование организации на англ.яз.
  im_erdat LIKE lfb1-erdat,   " Дата создания кредитора (На уровне БЕ)
  im_ernam LIKE lfb1-ernam,   " Кем был создан кредитор (на уровне БЕ)
  im_loevm LIKE lfa1-loevm,   " метка удаления (Все БЕ)
  im_sperr LIKE lfa1-sperr,   " Блокировка (Все БЕ)
  im_sperm LIKE lfa1-sperm,   " Блокировка2 (Все закупочные организации).
  im_sperr2 LIKE lfb1-sperr,  " Блокировка на уровне БЕ.
  im_loevm2 LIKE lfb1-loevm,  " Метка удаления на уровне БЕ
  im_zahls LIKE lfb1-zahls,   " Блокировка платежа на уровне БЕ
  im_stcd1 LIKE lfa1-stcd1,   " РНН организации
  im_stcd3 LIKE lfa1-stcd3,   " БИН организации
  im_stceg LIKE lfa1-stceg,
END OF im_tab.

SELECT-OPTIONS im_bukrs FOR lfb1-bukrs.
SELECT-OPTIONS im_name1 FOR lfa1-name1 DEFAULT 'AA' TO 'ZZ'.
SELECT-OPTIONS im_erdat FOR lfa1-erdat.
PARAMETERS: im_lifnr LIKE lfa1-lifnr,
            im_stcd1 LIKE lfa1-stcd1,
            im_stcd3 LIKE lfa1-stcd3.

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_functions TYPE REF TO cl_salv_functions.

SELECT  * FROM lfb1 INTO  im_lfb1 WHERE bukrs IN im_bukrs .         " Условие выбора всех кредиторов
  im_tab-im_bukrs = im_lfb1-bukrs .
  im_tab-im_erdat = im_lfb1-erdat.
  im_tab-im_ernam = im_lfb1-ernam.
  im_tab-im_sperr2 = im_lfb1-sperr.
  im_tab-im_loevm2 = im_lfb1-loevm.
  im_tab-im_zahls = im_lfb1-zahls.
  SELECT * FROM lfa1  INTO im_lfa1
          WHERE lifnr = im_lfb1-lifnr.
    im_tab-im_lifnr = im_lfa1-lifnr.
    im_tab-im_name1 = im_lfa1-name1.
    im_tab-im_name2 = im_lfa1-name2.
    im_tab-im_erdat = im_lfa1-erdat.
    im_tab-im_loevm = im_lfa1-loevm.
    im_tab-im_sperr = im_lfa1-sperr.
    im_tab-im_sperm = im_lfa1-sperm.
    im_tab-im_stcd1 = im_lfa1-stcd1.
    im_tab-im_stceg = im_lfa1-stceg.
    im_tab-im_stcd3 = im_lfa1-stcd3.

    APPEND im_tab.

  ENDSELECT.
ENDSELECT.

cl_salv_table=>factory( IMPORTING r_salv_table = gc_alv_table
                           CHANGING t_table = im_tab[] ).

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


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

gc_alv_table->display( ).
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Октябрь 30, 2012, 02:19:30 pm
Как ни странно, но у меня почему то не все поля получается переименовать, всё отрабатывает, в дамп ничего не падает, но у пару полей имена не изменились, это получается РНН - IM_STCD1 и БИН - IM_STCD3. Странно, там нет ни каких ограничений у это класса на количеству  использования метода этого или ещё что?!
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Октябрь 31, 2012, 06:26:03 am
Всем здравствуйте! Я извиняюсь за интеллект и за назойливость, есть ли возможность у этого класса допустим вывести на экран табличку в конкретно заданной шириной столбца, т.е. чтобы столбец был распахнут по длине текста названия этого слобца, чтобы вручную его не растягивать чтобы прочесть название столбца? Я понимаю что это мелочь и руки не отвалятся если я столбец растяну чтобы название посмотреть, но всё же....?!
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Октябрь 31, 2012, 08:05:59 am
You are not allowed to view links. Register or Login
Как ни странно, но у меня почему то не все поля получается переименовать, всё отрабатывает, в дамп ничего не падает, но у пару полей имена не изменились, это получается РНН - IM_STCD1 и БИН - IM_STCD3. Странно, там нет ни каких ограничений у это класса на количеству  использования метода этого или ещё что?!
Разобрался, всё дело было в параметрах длины поля, поставил оба параметра
short  и long, и нормально, переименовались. А вот как быть с шириной столбца при выводе на экран? Может кто подскажет?
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Октябрь 31, 2012, 08:43:48 am
You are not allowed to view links. Register or Login
А вот как быть с шириной столбца при выводе на экран? Может кто подскажет?
Скорее всего, что никак. У ALV-сетки есть параметр, который подстраивает ширину ячейки под выводимую в ней информацию, а вот параметра, подстраивающего вывод, под выводимый заголовок колонки нет, так что скорее всего никак.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Октябрь 31, 2012, 10:04:13 am
Ну вот ширина сетки поля самой таблицы, да, она автоматически подгоняет под содержимое поле, но вот например Название столбца МеткаБлокировкиБЕ а содержимое поле стоит просто метка X, и таких у меня столбцов 6, ни как нельзя заставить сетку думать что содержимое поля, которое содержит Х, что там больше символов чем на самом деле и таким бы образом он выводил ширину столбца пошире, может у кого нибудь ещё будут мнения на этот счёт?!
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Октябрь 31, 2012, 10:58:00 am
Есть метод у этого класса set_OUTPUT_LENGTH, вызываем его и пишем gc_colwork->set_OUTPUT_LENGTH( ' длина числом' ), с числом можно поэкспериментировать. А так в принципе ширину столбца изменил.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Октябрь 31, 2012, 12:04:21 pm
You are not allowed to view links. Register or Login
Есть метод у этого класса set_OUTPUT_LENGTH, вызываем его и пишем gc_colwork->set_OUTPUT_LENGTH( ' длина числом' ), с числом можно поэкспериментировать. А так в принципе ширину столбца изменил.
Это называются костыли, но если вас они устраивают, то не вопрос.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Октябрь 31, 2012, 12:19:14 pm
Да я понимаю что костыли, но что поделаешь, пользователи просят сделать как можно читабельней выводимую табличку.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Ноябрь 07, 2012, 04:46:00 am
Доброго времени суток, господа-товарищи! Мне опять нужен ваш совет, возникла необходимость сделать даблклил, в выводимой табличке и чтобы при даблклике отркывалась ещё одна табличка, т.е. при даблклике происходило событие заполяющее данными вторую табличку, например я хочу посмотреть некоторые данные того или иного кредитора, я щёлкаю на поле даблкликом и у меня выходит ещё небольшая табличка с данными об этом кредиторе. Возможно ли это организовать средствами, приводимого вами в пример класса, или подгрузить отдельно как то?! Ошень надо сделать, буду весьма признателен за помощь.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Ноябрь 07, 2012, 09:21:48 am
You are not allowed to view links. Register or Login
Доброго времени суток, господа-товарищи! Мне опять нужен ваш совет, возникла необходимость сделать даблклил, в выводимой табличке и чтобы при даблклике отркывалась ещё одна табличка, т.е. при даблклике происходило событие заполяющее данными вторую табличку
Ну конечно, делаете реакцию на клик мышью в ячейке, попадаете в метод, в котором пишете код выбора необходимой информации после чего выводите ее в отдельном диалоговом окне. Как выводить это уже другой вопрос...
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Ноябрь 07, 2012, 10:19:18 am
Мне бы какой нить класс подсказать ааа, или в cl_salv_table какой нить метод, чтоб не сильно программку переделывать?
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Ноябрь 07, 2012, 10:47:58 am
You are not allowed to view links. Register or Login
Мне бы какой нить класс подсказать ааа, или в cl_salv_table какой нить метод, чтоб не сильно программку переделывать?
Ну зачем же ее переделывать, но вам надо прочитать BC410 кажется, который называется диалоговое программирование, который содержит информацию как рисовать свои окошки в SAP. Класс вам тут не очень поможет. Хотя есть к примеру можно по быстрому воспользоватся такими ФМ:

http://sapforum.biz/index.php/topic,223.msg940.html#msg940
http://sapforum.biz/index.php/topic,223.msg941.html#msg941
http://sapforum.biz/index.php/topic,223.msg8514.html#msg8514

Форматирование вывода будет не очень красивым, зато будет быстро и не надо свои экраны рисовать.

Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Ноябрь 15, 2012, 11:13:15 am
Добрый день уважаемые ABAPer-ы. Вот не получается что то у меня даблклик, видимо всё таки делаю что то не так: Объявляю классы:
Код: You are not allowed to view links. Register or Login
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_functions TYPE REF TO cl_salv_functions,
      gc_display TYPE REF TO cl_salv_display_settings,
      gr_table type ref to cl_salv_table.


class lcl_handle_events definition deferred.
data: gr_events type ref to lcl_handle_events.

class lcl_handle_events definition.
  public section.
    methods:
        on_double_click for event double_click of cl_salv_events_table
        importing row column.

endclass.                    "lcl_handle_events DEFINITION

*---------------------------------------------------------------------*
*       CLASS lcl_handle_events IMPLEMENTATION
class lcl_handle_events implementation.

  method on_double_click.
    perform double_click using row column.
  endmethod.                    "on_double_click

endclass.     





выше у меня идут объявления данных, их типов, записей и таблиц, я их не стал выкладывать, поскольку программка работает, т.е. выводит табличку в соответствии с теми классами которые я использовал на примерах приводимых здесь, но вот именно даблклик не пашет, видимо у меня догонялки не хватает додумать что я не так делаю. Затем у меня идёт start of selection, потом выводится табличка на экран и дальше идёт  perform double_click

Код: You are not allowed to view links. Register or Login
FORM double_click  using  i_row    type i
                            i_column type lvc_fname.


  data: lr_selections     type ref to cl_salv_selections,
        ls_cell           type salv_s_cell.

  CASE i_column.
    WHEN 'IM_LIFNR'  " Подробно, документы
      OR 'IM_BUKRS'.
    lr_selections = gr_table->get_selections( ).
    ls_cell = lr_selections->get_current_cell( ).
    read table im_tab  index ls_cell-row.

  CLEAR wa.
  wa-program = 'SAPMF02K'.
  wa-dynpro = '0106'.
  wa-dynbegin = 'X'.
  APPEND wa TO bdcdata.

  CLEAR wa.
  wa-fnam = 'BDC_OKCODE'.
  wa-fval = '/00'.
  APPEND wa TO bdcdata.

  CLEAR wa.
  wa-fnam = 'RF02K-LIFNR'.
  wa-fval = im_tab-im_lifnr.  "Vendor
  APPEND wa TO bdcdata.

  CLEAR wa.
  wa-fnam = 'RF02K-BUKRS'.
  wa-fval = im_tab-im_bukrs.  "Company code
  APPEND wa TO bdcdata.

*General data
  CLEAR wa.
  wa-fnam = 'RF02K-D0110'.  "Address
  wa-fval = 'X'.
  APPEND wa TO bdcdata.

  CLEAR wa.
  wa-fnam = 'RF02K-D0120'. "Control
  wa-fval = 'X'.
  APPEND wa TO bdcdata.

  CLEAR wa.
  wa-fnam = 'RF02K-D0130'. "Payment transactions
  wa-fval = 'X'.
  APPEND wa TO bdcdata.

  CLEAR wa.
  wa-fnam = 'WRF02K-D0380'. "contact person
  wa-fval = 'X'.
  APPEND wa TO bdcdata.

*Company code data
  CLEAR wa.
  wa-fnam = 'RF02K-D0210'. "account info
  wa-fval = 'X'.
  APPEND wa TO bdcdata.

  CLEAR wa.
  wa-fnam = 'RF02K-D0215'. "Payment transactions
  wa-fval = 'X'.
  APPEND wa TO bdcdata.

  CLEAR wa.
  wa-fnam = 'RF02K-D0220'. "correspondence
  wa-fval = 'X'.
  APPEND wa TO bdcdata.

  CLEAR wa.
  wa-fnam = 'RF02K-D0610'. "With holding tax
  wa-fval = 'X'.
  APPEND wa TO bdcdata.

  CALL TRANSACTION 'FK03' USING bdcdata MODE 'E'.
  ENDCASE.
ENDFORM.


Есть у кого какие мысли что именно я не так делаю?? Буду весьма признателен за помощь, а то сам наверное не разберусь.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: insaf121 от Ноябрь 27, 2012, 02:56:14 pm
Обьяви
Код: You are not allowed to view links. Register or Login
DATA:   gc_events TYPE REF TO cl_salv_events_table.
И после  CREATE OBJECT gr_events.
Код: You are not allowed to view links. Register or Login
gc_events = gc_alv_table->get_event( ).
 CREATE OBJECT gr_events.
SET HANDLER gr_events->on_double_click FOR gc_events.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: jacknk88 от Декабрь 04, 2012, 08:18:21 am
а как можно выделить строки определенным цветом?
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Декабрь 04, 2012, 10:31:58 am
You are not allowed to view links. Register or Login
а как можно выделить строки определенным цветом?
Читать где-то отсюда: http://sapforum.biz/index.php/topic,670.msg9079.html#msg9079
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: jacknk88 от Декабрь 04, 2012, 02:54:19 pm
так как я создавал ALV так как Uukrul прописал...т.е. без ФМ REUSE_ALV_GRID_DISPLAY, то пришлось пойти другим путем....для этого наткнулся на пример SALV_DEMO_TABLE_COLUMNS и  форум  (http://scn.sap.com/message/4458001)
В результате:

1) в своей табличке для ALV добавил поле
Код: You are not allowed to view links. Register or Login
data: begin of gt_alv OCCURS 50,
...
t_color           TYPE lvc_t_scol, " установка цвета строки
end of  gt_alv.

2) объявил структуру и таблицу для установки цвета
Код: You are not allowed to view links. Register or Login
data:   go_color  TYPE        lvc_s_scol,
        go_col    TYPE        lvc_t_scol.

3) перед выводом на экран таблички gt_alv написал следующее
Код: You are not allowed to view links. Register or Login
LOOP AT gt_alv. " пробежимся по строчкам таблицы
    CLEAR go_col.
    CLEAR  go_color.

    if <условие>
          go_color-color-col = col_positive. " цвет
          go_color-color-int = 0.
          go_color-color-inv = 0.

          APPEND go_color TO go_col.

          gt_alv-t_color = go_col. " закинем настройки цвета текущей строки в поле таблички

      TRY.

        go_columns->set_color_column( 'T_COLOR' ). " указывается имя поля из пункта (1)

      CATCH cx_salv_data_error.                         "#EC NO_HANDLER

      ENDTRY.

      MODIFY gt_alv.

    ENDIF.

  ENDLOOP.

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


PS:

1) gt_alv - таблица с данными для ALV

2)
Код: You are not allowed to view links. Register or Login
DATA:   go_alv            TYPE REF TO cl_salv_table,
           go_columns        TYPE REF TO cl_salv_columns_table.

3) вместо col_positive вроде можно просто прописать число от 1 до 9.

вот как-то так....таким же образом и отдельную ячейку можно покрасить))
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Декабрь 06, 2012, 05:09:53 am
You are not allowed to view links. Register or Login
Обьяви
Код: You are not allowed to view links. Register or Login
DATA:   gc_events TYPE REF TO cl_salv_events_table.
И после  CREATE OBJECT gr_events.
Код: You are not allowed to view links. Register or Login
gc_events = gc_alv_table->get_event( ).
 CREATE OBJECT gr_events.
SET HANDLER gr_events->on_double_click FOR gc_events.

Здравствуйте уважаемые ABAPеры, в общем я сделал как вы и сказали, но чота у меня всё равно даблклик так и не срабатывает. Видимо я  всё равно что то не так делаю, как вы и сказали я объявил
Код: You are not allowed to view links. Register or Login
DATA:   gc_events TYPE REF TO cl_salv_events_table.
вставил я это объявления в кучу объявлений всех моих классов.
затем идёт класс
Код: 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_double_click for event double_click of cl_salv_events_table
        importing row column.

endclass.                    "lcl_handle_events DEFINITION

*---------------------------------------------------------------------*
*       CLASS lcl_handle_events IMPLEMENTATION
class lcl_handle_events implementation.

  method on_double_click.
    perform double_click using row column.
  endmethod.                    "on_double_click

endclass.
затем идёт START-OF-SELECTION, затем идёт вывод таблички на экран с помощью класса gc_alv_table->display( ).
И после это я создаю объект и вставляю метод
Код: You are not allowed to view links. Register or Login
CREATE OBJECT gr_events.
SET HANDLER gr_events->on_double_click FOR gc_events.
Затем у меня идёт форма даблклика и вызова транзакций по даблклику. Может подскажите что именно я не так делаю?
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Декабрь 06, 2012, 06:24:53 am
В общем я попробывал вставить
Код: You are not allowed to view links. Register or Login
gc_events = gc_alv_table->get_event( ).
CREATE OBJECT gr_events.
SET HANDLER gr_events->on_double_click FOR gc_events.

До конца выполнения вывода таблички на экран, перед
Код: You are not allowed to view links. Register or Login
gc_alv_table->display( ).
Даблклик стал отрабатывать и падать в дамп,  а мозгов как не хватало для решения это проблемки, так и щас не хватает. Может кто подскажет?! Буду весьма признателен.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: insaf121 от Декабрь 06, 2012, 07:50:08 am
Вот пример для аналогии.

Код: You are not allowed to view links. Register or Login
REPORT 121.


DATA:  BEGIN OF test_tabl OCCURS 1,
  SIGNAL type c,
  vtoroe(15) TYPE c,
  tretie(15) TYPE c
  .
DATA:  END   OF test_tabl.

FIELD-SYMBOLS: <test_tabl> like LINE OF test_tabl.

DATA: text TYPE string ,
      nomer TYPE n.

DATA: gc_layout     TYPE REF TO cl_salv_layout, "для варианта
      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_display    TYPE REF TO cl_salv_display_settings,
      gc_events     TYPE REF TO cl_salv_events_table,
      gc_functions  TYPE REF TO cl_salv_functions
      .

*----------------------------------------------------------------------*
*       CLASS lcl_handle_events DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_handle_events DEFINITION.
  PUBLIC SECTION.
*    CLASS-DATA:
*        lo_popup TYPE REF TO cl_salv_table.
    METHODS:

        on_double_click FOR EVENT double_click OF cl_salv_events_table
      IMPORTING row column,

    on_function_click
    FOR EVENT if_salv_events_functions~added_function
    OF cl_salv_events_table IMPORTING e_salv_function,


      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_double_click. "Для двойного щелчка

    text = 'Вы выбрали'.
    nomer = row.
    CONCATENATE text  'строчку №' nomer 'и столбец' column INTO text SEPARATED BY space.
    MESSAGE text TYPE 'I' .

  ENDMETHOD.                    "on_double_click

  METHOD on_function_click. "Это для кнопок в заголовке

    CASE e_salv_function.
      WHEN 'EDIT'.

      WHEN 'ALL'.

    ENDCASE.
  ENDMETHOD.                    "on_function_click

  METHOD on_link_click. "Для вызова по ссылке
    CASE column.
      WHEN 'SIGNAL'.
        text = 'Отработка чек-бокса.'.
        MESSAGE text TYPE 'I' .


        read TABLE test_tabl ASSIGNING <test_tabl> INDEX  row.

        CASE <test_tabl>-SIGNAL.
          WHEN 'X'.
            <test_tabl>-SIGNAL = ' '.
          WHEN ' '.
            <test_tabl>-SIGNAL = 'X'.
          WHEN OTHERS.
        ENDCASE.

        gc_alv_table->refresh( ).

      WHEN 'TRETIE'.
        text = 'Ну и вызов чего-нибудь.'.
        MESSAGE text TYPE 'I' .
        call TRANSACTION 'ABAPDOCU'.
      WHEN OTHERS.
    ENDCASE.

  ENDMETHOD.                    "on_single_click


ENDCLASS.                    "lcl_handle_events IMPLEMENTATION

DATA: gr_events TYPE REF TO lcl_handle_events.


START-OF-SELECTION.

  DO 5 TIMES.
    test_tabl-SIGNAL = 'X'.
    test_tabl-vtoroe = sy-index * 2.
    test_tabl-tretie = 'Здесь будет ваша ссылка.'.
    append test_tabl.
  ENDDO.
  cl_salv_table=>factory( IMPORTING r_salv_table = gc_alv_table CHANGING t_table = test_tabl[] ).

  gc_columns = gc_alv_table->get_columns( ).

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


  gc_colwork ?= gc_columns->get_column( 'TRETIE' ).
  gc_colwork->set_cell_type( if_salv_c_cell_type=>hotspot ).
  gc_colwork->set_long_text( 'Ссылка на что-то' ).

  gc_events = gc_alv_table->get_event( ).

  CREATE OBJECT gr_events.

  SET HANDLER gr_events->on_link_click FOR gc_events.
  SET HANDLER gr_events->on_double_click FOR gc_events.


  gc_layout = gc_alv_table->get_layout( ).
  gc_layout->set_save_restriction( if_salv_c_layout=>restrict_none ).
  gc_layout->set_default('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_alv_table->display( ).

А по поводу вашей ошибки он говорит что параметр еще не присвоен.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: themax от Декабрь 06, 2012, 08:04:58 am
Уряяяя, получилось, оказывается я использовал две ссылки на один и тот же класс, поэтому он у меня и падал в дамп, убрал вторую ссылку и заработало, спасибо insaf121 за помощь.
 
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Декабрь 06, 2012, 10:57:34 am
You are not allowed to view links. Register or Login
спасибо insaf121 за помощь.
Под иконкой пользователя выбираешь сердечко и добавляешь человеку свое спасибо  8)
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Rpl от Сентябрь 19, 2013, 10:25:55 am
Всем доброго времени суток!

Uukrul , большое спасибо за тему, часто пользуюсь :)

У меня следующая ситуация:
Использую описанный класс для вывода данных, и в "top of page" вывожу критерии выбора селекционного экране. Если в поле многократного выбора было внесено некое большое количество параметров, то этот "top of page" занимает весь экран и нужно его вручную уменьшить. Можно ограничивать количество выводимых строк в "top of page" или вручную изменять высоту. Конечно, это не так уж критично.
Но все же, есть ли возможность программно управлять высотой блока "top of page"?
Спасибо!
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Сентябрь 19, 2013, 11:55:38 am
You are not allowed to view links. Register or Login
Но все же, есть ли возможность программно управлять высотой блока "top of page"?
Как вы туда вообще попадаете? У меня почему-то в свое время
Код: You are not allowed to view links. Register or Login
    on_top_of_page
      FOR EVENT if_salv_events_list~top_of_page OF cl_salv_events_table
      IMPORTING r_top_of_page page table_index.

-------------------

  gc_events = gc_alv_table->get_event( ).
  CREATE OBJECT gr_events.

  SET HANDLER gr_events->on_top_of_page FOR gc_events.

ни при каких условиях не хотело попадать в это событие  :-\
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Rpl от Сентябрь 19, 2013, 12:11:36 pm
You are not allowed to view links. Register or Login
Как вы туда вообще попадаете?

Сори, ошибочка:-[ :-[ ... вывожу в "top of list"

Код: You are not allowed to view links. Register or Login
DATA: lr_header     TYPE REF TO cl_salv_form_layout_grid,
          lr_flow         TYPE REF TO cl_salv_form_layout_flow.

CREATE OBJECT lr_header.

      lr_flow = lr_header->create_flow( row = sy-index   column  = 1 ).
      r_flow->create_text( text = 'text' ).

      gc_salv_table->set_top_of_list( lr_header ).
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Сентябрь 19, 2013, 01:02:02 pm
You are not allowed to view links. Register or Login
Но все же, есть ли возможность программно управлять высотой блока "top of page"?
Самое интересное что для ФМ: REUSE_ALV_GRID_DISPLAY есть параметр: I_HTML_HEIGHT_TOP TYPE, который собственно говоря управляет высотой заголовка. Внутри там они получают доступ к сплитеру который отделяет таблицу от html-заголовка. Куда стоит наверное копать, так это получить у CL_SALV_TABLE ссылку на контейнер, в этом контейнере должны быть 3 элемента, собственно сама таблица, разделитель (объект типа сплитер) и область для вывода html заголовка. Теоретически наверное можно найти сам контейнер и получить доступ к объекту разделителя. Можно наверное посмотреть как это делается в REUSE_ALV_GRID_DISPLAY, там по факту тоже создается объектная таблица.

PS: Быстро это дело, сам не нашел, но если вы найдете, то буду рад прочитать как это сделать  8)
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Rpl от Сентябрь 20, 2013, 05:29:35 pm
You are not allowed to view links. Register or Login
Можно наверное посмотреть как это делается в REUSE_ALV_GRID_DISPLAY, там по факту тоже создается объектная таблица.

Ковыряясь в REUSE_ALV_GRID_DISPLAY и классах наткнулся на:
Код: You are not allowed to view links. Register or Login
    DATA: lo_grid  TYPE REF TO cl_gui_alv_grid,
          f(14)    VALUE 'SET_ROW_HEIGHT'.

* Get global ALV information from buffer
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lo_grid.
* Set size of ALV header, body & footer control
                                         "<0648171
    CALL METHOD lo_grid->parent->parent->(f)
      EXPORTING
        id     = 1
        height = 50.

    CALL METHOD lo_grid->refresh_table_display.

Высота топ листа меняется, но только по событию :-\.
Если перед
Код: You are not allowed to view links. Register or Login
gc_salv_table->display( )., то дамп

PS: Уже подумываю, что придется переписывать на cl_gui_alv_grid :'(
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Сентябрь 20, 2013, 06:05:58 pm
You are not allowed to view links. Register or Login
PS: Уже подумываю, что придется переписывать на cl_gui_alv_grid :'(
Ну как вариант, сделать наследника, в нем переопределить метод display и там вызвать уже изменение ширины, но после отработки родительского метода. Теоретически будет быстрее, чем переписывать все на другой класс.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Сентябрь 20, 2013, 06:15:18 pm
You are not allowed to view links. Register or Login
родительского метода. Теоретически будет быстрее, чем переписывать все на другой класс.
Хотя у меня тут возник по ходу один интересный вариант, проверю на выходных и если получится выложу так сказать таблетку  8)
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Сентябрь 21, 2013, 12:06:15 am
You are not allowed to view links. Register or Login
Хотя у меня тут возник по ходу один интересный вариант, проверю на выходных и если получится выложу так сказать таблетку  8)
Не прошло, изоляция внутри классов, поломала всю малину через расширения стандартного класса. Так что наследование осталось как вариант. Хотя конечно можно еще поискать.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Сентябрь 21, 2013, 01:25:42 am
Да уж, в общем это из разряда - я хренею с этого SAP-а и ABAP-а, полез копать тут этот класс, копал и выкопал, что в итоге, он использует для своей работы при полном экране вызов ФМ: REUSE_ALV_GRID_DISPLAY, но при этом параметр I_HTML_HEIGHT_TOP, пацаны закоментировали, так что как бы мы тут класс не крутили, заголовком порулить не получиться.

Если пойти еще дальше, то в модуле LSLVC_FULLSCREENF01, со строки 1469 есть такая подпрограмма:
Код: You are not allowed to view links. Register or Login
*&--------------------------------------------------------------------*
*&      Form  set_salv_form_content_tol
*&--------------------------------------------------------------------*
*       text
*---------------------------------------------------------------------*
form set_salv_form_content_tol.

===<вырезал лишнее>====

  gt_grid-r_form_tol->set_content( lr_content ).
  l_height = gt_grid-r_form_tol->get_height( ).
  gt_grid-r_form_tol->display( ).

  check gt_grid-splitter is not initial.

  if i_grid_settings-coll_top_p is initial and
    gt_grid-i_callback_html_top_of_page is initial and
    gt_grid-i_callback_html_end_of_list is initial.
    gt_grid-splitter->set_visible( abap_true ).
    call method gt_grid-splitter->set_row_mode
      exporting
        mode = cl_gui_splitter_container=>mode_absolute.
    if i_html_height_top is initial.                        "Y7AK007065
      call method gt_grid-splitter->set_row_height
        exporting
          height = l_height
          id     = 1.
    endif.
  endif.

endform.                    "set_salv_form_content_tol
В общем этот код получает величину заполненной области и соответственно задает величину сплитера и далее, после кода check gt_grid-splitter is not initial. код дальше игнорируется. Так вот можно написать неявный энхансмент в конце этого блока и фактически написать что-то типа:
Код: You are not allowed to view links. Register or Login
    call method gt_grid-splitter->set_row_mode
      exporting
        mode = cl_gui_splitter_container=>mode_absolute.
    if i_html_height_top is initial.                        "Y7AK007065
      call method gt_grid-splitter->set_row_height
        exporting
          height = <нужная нам величина>
          id     = 1.
    endif.

При этом сделать можно так, завести параметр и перед вызовом gc_salv_table->display( ) поставить в этом параметр например наше значение, пусть будет 50. А в код получить значение этого параметра, если оно не равно 0, тогда вызвать приведенный выше код по установке высоты заголовка. Само собой после этого параметр через в памяти обнулить. Таким образом, при задании параметра будет выставляться нужная нам величина заголовка. А кто про параметр не знает, для того будет все отрабатывать как обычно, т.е. в энхансменте код должен выглядеть типа так:
Код: You are not allowed to view links. Register or Login
GET PARAMETR  'ZZ_HEADER' VALUE zz_new_height.
IF zz_new_height <> space.
    SET PARAMETR 'ZZ_HEADER' VALUE space.
    call method gt_grid-splitter->set_row_mode
      exporting
        mode = cl_gui_splitter_container=>mode_absolute.
    if i_html_height_top is initial.                        "Y7AK007065
      call method gt_grid-splitter->set_row_height
        exporting
          height = zz_new_height
          id     = 1.
    endif.
endif.

Должно сработать процентов на 99 без всяких проблем. Вообще-то если бы можно было в классе попасть в событие i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE', которое тоже закомментировано при вызове, то там бы вообще проблем небыло, так как в этом событии можно просто было бы написать приведенный выше вами код и все тоже работало бы:
Код: You are not allowed to view links. Register or Login
  DATA: lo_grid  TYPE REF TO cl_gui_alv_grid,
      f(14)    VALUE 'SET_ROW_HEIGHT'.

* Get global ALV information from buffer
  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      e_grid = lo_grid.
* Set size of ALV header, body & footer control
  BREAK-POINT.                                              "<0648171
  CALL METHOD lo_grid->parent->parent->(f)
    EXPORTING
      id     = 1
      height = 5.
В общем не докрутили они этот класс немного. Извечный вопрос, зачем комментировать вызов, ну добавьте в класс эти переменные, надо кому, будут использовать, не надо... будут стоять в значениях по умолчанию. В общем извечный вопрос, где была голова  8)

PS: Если решите использовать энхансмент, отпишитесь о результате. А впрочем пишите в любом случае как решили делать.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Сентябрь 21, 2013, 01:26:50 pm
You are not allowed to view links. Register or Login
PS: Если решите использовать энхансмент, отпишитесь о результате. А впрочем пишите в любом случае как решили делать.
Нет, там все глухо. Код реализующий ФМ: REUSE_ALV_GRID_DISPLAY относится к: "Object FUGR SLVC_FULLSCREEN is part of the central basis and therefore cannot be enhanced", короче переходите на использование или прямого вызова REUSE_ALV_GRID_DISPLAY, что чуть больше руками написать, но все зато будет работать или же на использование класса cl_gui_alv_grid Лично я бы просто использовал REUSE_ALV_GRID_DISPLAY и не лохматил бабушку  8) а этот класс использовать можно если надо где-то что-то быстро вывести без особых изысков, типа диалоговое окошечко, в котором что-то быстро показать и закрыть.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Rpl от Сентябрь 23, 2013, 09:12:20 am
Uukrul, БОЛЬШОЕ СПАСИБО за потраченное время и подробное разъяснение!!!!

Буду переписывать на cl_gui_alv_grid, не хочу создавать филдкаталог :)
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Сентябрь 23, 2013, 10:04:43 am
You are not allowed to view links. Register or Login
Буду переписывать на cl_gui_alv_grid, не хочу создавать филдкаталог :)
А я как-то все руками по привычке, хотя руками это тоже вопрос еще, так как просто копирую из примеров своих программ, так что у меня этот процесс минут 15 может занимает  8)
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: insaf121 от Октябрь 30, 2013, 01:12:26 pm
Здравствуйте. Недавно столкнулся с двумя проблемами для класса salv.

1. Если выводить в отчет порядка 120 тысяч записей, то выводит он довольно шустро, но если к отчету который уже на экране попробовать применить фильтрацию по каким-нибудь полям( особенно когда список значений) он начинает работать очень медленно :(
2. В этом же отчете когда бухи пробуют сделать общую сумму он выдает что значение переполнено( поле типа bseg-wrbtr ).

Вопрос:
1. Нет ли способа как-нибудь ускорить это дело? Например буферизация в память или что-то вроде этого.
2. Есть ли способ подавить это сообщение и выводить промежутки.
Например у нас сумма 137 миллиардов, а вывести 99 миллиардов и 38 миллиардов.  Без группировки по полям.
Заранее спасибо.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Октябрь 30, 2013, 01:35:50 pm
You are not allowed to view links. Register or Login
1. Нет ли способа как-нибудь ускорить это дело? Например буферизация в память или что-то вроде этого.
Ну там работает обычный ФМ REUSE_ALV_GRID поэтому у меня вообще после 60-70 тысяч оно часто ничего не выводит :-) а у вас 120 000 и даже как говорите шустро работает.

You are not allowed to view links. Register or Login
2. Есть ли способ подавить это сообщение и выводить промежутки.
Например у нас сумма 137 миллиардов, а вывести 99 миллиардов и 38 миллиардов.  Без группировки по полям.
Ну это поле суммы, а оно привязано к валюте. А поэтому читаем: http://sapforum.biz/index.php/topic,1514.0.html это как оно все организовано. Думаю что без группировки вряд ли выйдет, так как там все автоматически работает и вмешаться вряд ли выйдет.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: insaf121 от Октябрь 30, 2013, 02:20:35 pm
Спасибо за ответ.
По предложенному Вами варианту думаю лучше не стоит   :) пусть лучше в excel выводят и там суммируют если им так нужно  ;D
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: insaf121 от Март 19, 2014, 06:33:38 am
Кстати есть все таки способ использовать функциональность по добавлению новой кнопки.

Код: You are not allowed to view links. Register or Login
write 'любой текст'.  "Нужен нам вроде для событий экрана, иначе defaukt_screen будет работать не корректно.

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->add_function(                                               "сама функциональность
EXPORTING
NAME = 'ADDFUNC'
icon = '@01@'
text = 'ДопКнопка'
tooltip = 'Всплывающая подсказка'
POSITION = if_salv_c_function_position=>right_of_salv_functions ).

Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: dominirovanie от Август 26, 2014, 07:53:07 am
Ну, во-первых, спасибо за супер ветку)
А во-вторых, возник вот какой вопрос:
На экране отображаются мои данные из внутренней таблицы, я выделяю строки, прохожусь по выделенным строкам, нажимаю кнопку из гуи-статуса "удалить" , отрабатывает написанная обработка, и всё нормально работает, строки удаляются из внутренней таблицы, далее
Код: You are not allowed to view links. Register or Login
gc_alv_table->refresh( ).
экран обновляется, данные верные.
НО в случае когда после отображения данных я нажимаю на стандартную кнопку гуи-статуса "Фильтр", фильтрую записи по какому-то полю, фильтр срабатывает, оставляя, например, 4 записи. из получившегося списка я выделяю строки (например, две), нажимаю как и прежде "удалить", всё нормально удаляется из внутренней таблицы, НО после обновления экрана передо мной список из 4х строк, среди которых две строки, которые не должны попадать(не подходят по условию фильтра); то есть мои две строки, которые оттуда удалились, заменились на следующие за ними во внутренней таблице.
Собственно, вопрос в том, как это исправить, чтобы фильтрация срабатывала как надо. (кстати, думается мне, что и сортировка будет глюк давать)
Надеюсь на ответы  :)
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Август 26, 2014, 04:10:22 pm
You are not allowed to view links. Register or Login
Собственно, вопрос в том, как это исправить, чтобы фильтрация срабатывала как надо. (кстати, думается мне, что и сортировка будет глюк давать)
Ну попробуйте вызвать обновление передав методу refresh параметр REFRESH_MODE = IF_SALV_C_REFRESH=>FULL. Возможно поможет. Или более сложный вариант:
1. Вызываете метод GET_FILTERS, который вернет вам переменную VALUE типа  CL_SALV_FILTERS. Это класс управления фильтрами. Вот уже у этого объекты VALUE будет метод REPAIR, который теоретически восстановит фильтрацию. Точнее там сначала надо бы вызвать IS_FILTER_DEFINED, типа проверить задана ли фильтрация, а уже после дергать REPAIR.

Ну надеюсь если что-то поможет, напишите.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: dominirovanie от Август 27, 2014, 01:47:54 pm
You are not allowed to view links. Register or Login
Ну попробуйте вызвать обновление передав методу refresh параметр REFRESH_MODE = IF_SALV_C_REFRESH=>FULL. Возможно поможет. Или более сложный вариант:
1. Вызываете метод GET_FILTERS, который вернет вам переменную VALUE типа  CL_SALV_FILTERS. Это класс управления фильтрами. Вот уже у этого объекты VALUE будет метод REPAIR, который теоретически восстановит фильтрацию. Точнее там сначала надо бы вызвать IS_FILTER_DEFINED, типа проверить задана ли фильтрация, а уже после дергать REPAIR.

Ну надеюсь если что-то поможет, напишите.
Спасибо огромное  :) первый вариант помог
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Лисенок от Октябрь 15, 2014, 10:31:29 am
Подскажите, пожалуйста, можно ли как-нибудь повесить свою обработки на кнопки "светофора" (назад)?
пробовала в своем gue-статусе назвать их по другому и обработать, но отрабатывает стандарт ((.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Октябрь 15, 2014, 04:07:19 pm
You are not allowed to view links. Register or Login
Подскажите, пожалуйста, можно ли как-нибудь повесить свою обработки на кнопки "светофора" (назад)?
пробовала в своем gue-статусе назвать их по другому и обработать, но отрабатывает стандарт ((.
Ну почему нельзя.. можно если имеются в виду кнопки из картинки ниже, то вот в этом примере http://sapforum.biz/index.php/topic,1401.msg11197.html#msg11197, сделал свой статус только назвал кнопки в статусе по своему, рисунок PF01.png и все заработало,при нажатии на кнопку выхода попадаю в обработчик из примера.
Код: You are not allowed to view links. Register or Login
  METHOD on_user_command.
    DATA: l_index LIKE sy-tabix,
          lt_rows TYPE salv_t_row.

    BREAK-POINT.
    CASE e_salv_function.
      WHEN 'BTN_1'.
*       Нажата первая кнопка

        ENDLOOP.

      WHEN 'BTN_2'.
*       Нажата вторая кнопка
    ENDCASE.
  ENDMETHOD.                    "on_user_command
Ну и соответственно выхода из окна программы не происходит, т.е. перехват нажатия произошел, при этом на панели задач, второй кнопки выхода нет. Так что работает.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Лисенок от Октябрь 16, 2014, 08:00:20 am
Спасибо, сработало ))
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: maker2k от Декабрь 18, 2015, 01:04:46 pm
Подскажите, как переопределить стандартный экспорт в Excel?
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Декабрь 19, 2015, 09:59:14 am
You are not allowed to view links. Register or Login
Подскажите, как переопределить стандартный экспорт в Excel?
Ну как, сделайте свою кнопку экспорта и напишите код выгрузки в Excel
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Kastain от Февраль 05, 2016, 11:30:51 am
Подскажите, как в top_of_list настроить фиксированную ширину выводимых колонок для всех строк.
Сей час получается что ширина каждой колонки равна ширине самой длинной из всех строк.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Февраль 05, 2016, 02:00:28 pm
You are not allowed to view links. Register or Login
Подскажите, как в top_of_list настроить фиксированную ширину выводимых колонок для всех строк.
Сей час получается что ширина каждой колонки равна ширине самой длинной из всех строк.
Как-то так наверное.
Код: 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_OUTPUT_LENGTH( <размер колонки в знаках>  ).
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Kastain от Февраль 09, 2016, 06:51:21 am
Не то.
Меня именно TOP_OF_LIST интересует.
Вложил файл, что сей час получается. А мне надо чтобы в строках не сливались колонки.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Февраль 09, 2016, 01:52:01 pm
You are not allowed to view links. Register or Login
Не то.
Меня именно TOP_OF_LIST интересует.
Вложил файл, что сей час получается. А мне надо чтобы в строках не сливались колонки.
Ну если вы хотите сами формировать заголовок, то это вам читать и искать правила использования класса cl_dd_document совместно с ALV-grid, там можно все что надо отрисовать.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Февраль 10, 2016, 06:06:31 pm
Тут случайно надо было получить выделенные строки из этой таблицы, вроде как сначала все просто

Код: You are not allowed to view links. Register or Login
DATA: gc_selection TYPE REF TO cl_salv_selections.
DATA: lt_rows      TYPE salv_t_row.

* Получаем объект обработки выделения и задаем выделение множества строк
gc_selection = gc_alv_table->get_selections( ).
gc_selection->set_selection_mode( cl_salv_selections=>multiple ).

* Далее по коду, для получения выделенных строк, нужно сделать следующее
* 1. Обязательно вызвать общий метод обновления данных
gc_alv_table->get_metadata( ).

* 2. Только после этого вызвать метод получения строк, иначе результат будет нулевой.
lt_rows[] = gc_selection->get_selected_rows( ).
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Kastain от Февраль 11, 2016, 09:24:34 am
Да без get_metadata не работает.
Я вот так написал получение строк.
 
Код: You are not allowed to view links. Register or Login
gc_selections->get_selected_rows( RECEIVING value  = lt_rows ).
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Февраль 11, 2016, 05:55:48 pm
You are not allowed to view links. Register or Login
Да без get_metadata не работает.
Я вот так написал получение строк.
 
Код: You are not allowed to view links. Register or Login
gc_selections->get_selected_rows( RECEIVING value  = lt_rows ).
Ну твоя строка с моей: lt_rows[] = gc_selection->get_selected_rows( ) идентичны, тут как говорится кому как удобно, некоторые например еще так пишут: CALL METHOD gc_selections->get_selected_rows( RECEIVING value  = lt_rows ). и тоже будет работать. Кстати можно и так написать  lt_rows = gc_selection->get_selected_rows( ), т.е. не ставить квадратные скобки после lt_rows. Я их ставлю, чтобы наглядно было видно, что возвращается таблица результатов, а не структура. В общем тут как кому удобно так и оформляет текст. В новых ядрах можно вообще так написать:

LOOP AT gc_selection->get_selected_rows( ) INTO data(ls_rows).
  <Обработка выбранных строк>.
ENDLOOP.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: JohnHurricane от Март 11, 2016, 12:44:13 pm
Коллеги, добрый день.
Помогите, пожалуйста, разобраться в этом классе с методами SET_DECIMALS_COLUMN и SET_DECIMALS. Требуется сформатировать вывод под определенное количество десятичных знаков в одном из столбцов таблицы.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Март 11, 2016, 07:06:33 pm
You are not allowed to view links. Register or Login
Помогите, пожалуйста, разобраться в этом классе с методами SET_DECIMALS_COLUMN и SET_DECIMALS. Требуется сформатировать вывод под определенное количество десятичных знаков в одном из столбцов таблицы.
Ну оно теоретически будет работать только для полей которые не ссылаются на единицы измерения. Т.е. если у вас там поле количество и оно ссылочное на единицу измерения, то эти методы работать кажется не будут.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: JohnHurricane от Март 14, 2016, 07:18:01 am
You are not allowed to view links. Register or Login
Ну оно теоретически будет работать только для полей которые не ссылаются на единицы измерения. Т.е. если у вас там поле количество и оно ссылочное на единицу измерения, то эти методы работать кажется не будут.

Тип поля ATFLV - не ссылочное и без ЕИ, просто с плавающей запятой. Почему-то все равно складывается впечатление, что методы не хотят работать. Вы не пробовали с ними работать?
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Март 14, 2016, 12:02:29 pm
You are not allowed to view links. Register or Login
Тип поля ATFLV - не ссылочное и без ЕИ, просто с плавающей запятой. Почему-то все равно складывается впечатление, что методы не хотят работать. Вы не пробовали с ними работать?
Ну если честно то проще конечно задать такую вещь через правильное определение поля в словаре данных, а этот тип у вас с плавающей точкой, так что если я правильно понимаю то, что вы хотите сделать, то попробуйте сделать так:
Код: You are not allowed to view links. Register or Login
DATA: BEGIN OF gt_mkpf OCCURS 10,
      sel(1) TYPE c,
      amount TYPE atflv.
        INCLUDE STRUCTURE mkpf.
DATA: my_field(5) TYPE c,

* Получим каталог полей таблицы
  gc_columns = gc_alv_table->get_columns( ).

* Получим поле по имени
  gc_colwork->set_decimals( '5.2' ).
  gc_colwork->set_edit_mask( '_____' ).

* Вывести ALV-таблицу на экран
  gc_alv_table->display( ).
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Сентябрь 26, 2023, 07:02:23 pm
You are not allowed to view links. Register or Login
По быстрому поковырялся с возможностями добавления своих кнопок, похоже, что такой возможности нет, так как объект в качестве имени функции принимает предопределенный набор констант, хотя возможно я не нашел необходимого метода.
Был не прав, есть такая возможность причем она совмещена с возомжностью вывода и стандартных кнопок
Код: You are not allowed to view links. Register or Login
gc_alv_table->set_screen_status(
    pfstatus      = '0100'
    report        =  sy-repid
    set_functions = gc_alv_table->c_functions_all ).
в общем указываем свой PF-статус и говорим что надо добавить еще и стандартных кнопок к нему.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: ysichov от Сентябрь 27, 2023, 12:11:09 pm
Еще есть способ (https://ysychov.wordpress.com/2018/03/04/cl_salv_table-button-add/) добавить кнопки без GUI статусов - подсмотрено у Пола Харди.
Название: Re: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран
Отправлено: Uukrul от Октябрь 12, 2023, 12:04:47 pm
You are not allowed to view links. Register or Login
Еще есть способ (https://ysychov.wordpress.com/2018/03/04/cl_salv_table-button-add/) добавить кнопки без GUI статусов - подсмотрено у Пола Харди.
Интересный метод однако вот тот опеаратор WRITE " ", который магия намекает, что в одни прекрасный момент это может перестать рабооать. Хотя да метод мнтересный, но полностью кстати согласен с выводами автора по ссылке, что компонент такой себе. Иногда подводных камней больше чем удовльствия от сокращения времени разработки.