Сабж. Давно хотел опубликовать, да откладывал - хотел хепл сначала написать, да кой-чего доработать. Чувствую, руки никогда не дойдут.
Условия использования: копирайтик мой не затирайте . Доработки приветствуются, но копирайт не трогайте (можете свой рядом дописать, если очень хочется).
Юзаю инклуд уже несколько лет, некоторые методы отлажены очень хорошо, некоторые требуют доработки.
Недостатки:
1.) Заточен
только под
CL_SAVL_TABLE .
2.) Хорошо подходит для программ, где только один ALV, и плохо подходит для программ, где несколько ALV, т.к. некоторые перформы требуют обязательного наличия переменных c заданным именем (например, gtb_selected) и определенного типа (той же структуры, что и отображаемая таблица), объявленных в главной программе. Если ALV только один, это удобно, иначе может быть не очень удобно. Были мысли вынести реализацию перформов, требующих эти переменные, в макрос, чтобы подключать их по необходимости. Либо сделать две версии инклуда - для одного ALV, и для нескольких. Или просто эти переменные заменить на параметры. Но руки не дошли. А системы под рукой, где есть
CL_SALV_TABLE, сейчас нет.
Шаблон для копи-паста:
Code:
TYPES: BEGIN OF ty_alv .
INCLUDE TYPE [ваша ALV-структура].
TYPES: rownr TYPE i,
END OF ty_alv .
DATA:
gtv_alv TYPE STANDARD TABLE OF [ваша ALV-структура],
gwa_alv TYPE [ваша ALV-структура],
gr_alv TYPE REF TO cl_salv_table ,
gr_alv_container TYPE REF TO cl_gui_custom_container,
gtb_selected TYPE TABLE OF ty_alv WITH HEADER LINE
FORM
set_current_alv - устанавливает текущий ALV, который собираетесь теребить .
FORM
alv_visible_rows - работает некорректно. Если доработаете, дайте знать.
Использование макроса
loop_at_selected :
Code:
loop_at_selected grv_alv gtv_Alv gwa_alv gwa_selected .
* 1 - ALV Grid, 2 - ALV-таблица, 3 - WA для %2, 4 - буффер для выбранной записи
[какой-то ваш код]
endloop.
FORM
setup_single_alv - делает типовую настройку ALV (для простых случаев).
FORM
confirm_delete - запрос на удаление. sy-subrc: 0 - да, 2 - нет, 10 - отмена.
Code:
FORM alv_delrows TABLES ptv_alv
pt_delbuf
USING pr_alv TYPE REF TO cl_salv_table .
Удаляет выделенные строки из ALV, перемещая их из ptv_alv в pt_delbuf .
confirm_delete вызывает самостоятельно. Обратите внимание на строку
Code:
SORT lt_rows DESCENDING .
Это позволяет удалять записи с конца (от последней выделенной записи к первой), что исключает проблему сбоя индексов при удалении строк (при удалении строки, строки идущие после нее, сдвигаются вверх, их индекс в таблице изменяется и перестает соответствовать тому, что был при выделении, т.е. до удаления). Если строки удалять с конца, индексы не нарушаются.
Использование
lcl_handle_events:
1.) Вызвать конструктор;
2.) При необходимости добавить типовые кнопки с помощью
set_functions (перечислить ф-коды через точку с запятой - по исходникам поймете, какие). Если нужна подпись на кнопке, необходимо указать ее, после FCODE, отделив от FCODE символом "|" (например, 'EXPORT| Выгрузить'). Если еще какие функции, кроме типовых, нужны, юзать
add_function. Включать-выключать кнопки с помощью
enable_functions/
disable_functions (также, через точку с запятой, перечислять коды функций).
Пример:
Code:
CALL METHOD gr_events->set_functions( 'REFRESH;EXPORT| Выгрузить' ) .
3.) Реализовать перформ с именем
USER_COMMAND[суффикс] (суффикс - см. параметр p_suffix конструктора). Например,
USER_COMMAND_100, если суффикс задавали '_100'. Внутри перформа, CASE делать по SY-UCOMM .
Дабл-клики и линк-клики ловятся по SY-UCOMM
Code:
CONSTANTS: c_dblclick TYPE sy-ucomm VALUE 'DBL_CLICK',
c_lnkclick TYPE sy-ucomm VALUE 'LNK_CLICK' .
Кликнутые строка и столбец:
Code:
DATA: g_rowclick TYPE salv_de_row ,
g_colclick TYPE salv_de_column .
Все остальное мне кажется в достаточной степени интуитивно понятным.
=========================
Code:
Старая версия удалена, см. последующие сообщения с более свежей версией