Alv grid sap что это

Обновлено: 19.04.2024

This document describes how to color a cell make the particular cell as non-editable display the cell as button in ALV using OOPS method.

Coloring a cell

Step 1: Include a field called cellcolor in output table as below. Create a work area for the cellcolor.
Code:

TYPES : BEGIN OF ty .
INCLUDE STRUCTURE mara .
* For cell coloring
TYPES : cellcolor TYPE lvc_t_scol ,
END OF ty .
Data : w_cellcolor TYPE lvc_s_scol , "For cell color

Step 2: In layout, mention the field name for ctab_fname
Code:

* Setting layout
w_layout - ctab_fname = 'CELLCOLOR' . "For cell coloring

Step 3: Mention the field name for coloring and then set the color, intensified and inverse options.
Code:

* Colouring a cell
clear w_cellcolor .
w_cellcolor - fname = 'ERSDA' .
w_cellcolor - color - col = '5' .
w_cellcolor - color - int = '1' .
w_cellcolor - color - inv = '1' .
APPEND w_cellcolor TO wa - cellcolor .
MODIFY itab FROM wa INDEX 7 TRANSPORTING cellcolor .

Here you can set the col to different numbers(1 to 9) and then give intensified/ inverse values either 0 or 1 to know the variations.

Step 4: Pass the required parameters for set_table_for_first_display as below.
Code:

* Displaying the output
CALL METHOD o_grid -> set_table_for_first_display
EXPORTING
is_variant = w_variant
i_save = 'A'
is_layout = w_layout
CHANGING
it_outtab = itab
it_fieldcatalog = i_fieldcat
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4 .
IF sy - subrc <> 0 .
MESSAGE ID sy - msgid TYPE sy - msgty NUMBER sy - msgno
WITH sy - msgv1 sy - msgv2 sy - msgv3 sy - msgv4 .
ENDIF .

Displaying the cell as button
Step 1: Include a field called cellstyles in output table as below. Create a work area for the styles.
Code:

TYPES : BEGIN OF ty .
INCLUDE STRUCTURE mara .
* For cell editing and displaying cell as push button
TYPES : cellstyles TYPE lvc_t_styl ,
END OF ty .
Data w_style TYPE lvc_s_styl .

Step 2: Set the layout stylefname as CELLSTYLES.
Code:

* Setting layout
w_layout - stylefname = 'CELLSTYLES' . "cell-push button and edit * Displaying cell as Push button
CLEAR w_style .
w_style - fieldname = 'ERNAM' .
w_style - style = cl_gui_alv_grid -> mc_style_button .
APPEND w_style TO wa - cellstyles .
MODIFY itab FROM wa INDEX 1 TRANSPORTING cellstyles .

Step 4: Pass the layout for set_table_for_first_display.
Code:

* Displaying the output
CALL METHOD o_grid -> set_table_for_first_display
EXPORTING
is_variant = w_variant
i_save = 'A'
is_layout = w_layout
CHANGING
it_outtab = itab
it_fieldcatalog = i_fieldcat
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4 .
IF sy - subrc <> 0 .
MESSAGE ID sy - msgid TYPE sy - msgty NUMBER sy - msgno
WITH sy - msgv1 sy - msgv2 sy - msgv3 sy - msgv4 .
ENDIF .

Making the cell as Editable and non-editable
Follow Step 1 and Step 2 for displaying cell as button.

Step 3: Make the entire column as editable and then disable the edit option for a cell for that column. Here in this example, for ERNAM we are making the third row as non-editable.

* Making an entire column as Editable.
FIELD-SYMBOLS : < fs_fieldcat > ; TYPE lvc_s_fcat .
LOOP AT i_fieldcat ASSIGNING < fs_fieldcat > ; .
CASE < fs_fieldcat > - fieldname .
WHEN 'ERNAM' .
* Making a column as Editable
< fs_fieldcat > - edit = 'X' .
ENDCASE .
ENDLOOP .
* Making a particular cell as non-editable and other editable
CLEAR w_style .
w_style - fieldname = 'ERNAM' .
w_style - style = cl_gui_alv_grid -> mc_style_disabled .
REFRESH wa - cellstyles .
APPEND w_style TO wa - cellstyles .
MODIFY itab FROM wa INDEX 3 TRANSPORTING cellstyles .

Follow Step4 for displaying cell as button.

Complete Code
Screen 9000,GUI Status ZSTATUS and GUI Title ZTITLE should be created and in Flow logic of the screen, PBO and PAI should be uncommented.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124

* Data Declaration
TYPES : BEGIN OF ty .
INCLUDE STRUCTURE mara .
* For cell editing and displaying cell as push button
TYPES : cellstyles TYPE lvc_t_styl ,
* For cell coloring
cellcolor TYPE lvc_t_scol ,
END OF ty .

DATA : itab TYPE STANDARD TABLE OF ty , "Output Internal table
i_fieldcat TYPE STANDARD TABLE OF lvc_s_fcat , "Field catalog
wa TYPE ty ,
w_variant TYPE disvariant ,
w_layout TYPE lvc_s_layo , "Layout structure
w_cellcolor TYPE lvc_s_scol , "For cell color
w_style TYPE lvc_s_styl , "cell editing and
"displaying cell as push button
o_docking TYPE REF TO cl_gui_docking_container , "Docking Container
o_grid TYPE REF TO cl_gui_alv_grid . "Grid

FIELD-SYMBOLS : < fs_fieldcat > TYPE lvc_s_fcat .

SELECT * FROM mara INTO CORRESPONDING FIELDS OF TABLE itab UP TO 10 ROWS
.

IF o_docking IS INITIAL .
SET PF-STATUS 'ZSTATUS' . "GUI Status
SET TITLEBAR 'ZTITLE' . "Title
* Creating Docking Container and grid
PERFORM create_object .
* Filling the fieldcatalog table
PERFORM create_fieldcat .
* Setting layout
PERFORM set_layout .
* Colouring a cell
PERFORM color_cell .
* Displaying cell as Push button
PERFORM cell_button .
* Making a cell as non-editable in a column
PERFORM cell_edit .
* Displaying the output
PERFORM display_output .
ENDIF .

DATA lv_ucomm TYPE sy - ucomm .
lv_ucomm = sy - ucomm .
CASE lv_ucomm .
WHEN 'CANCEl' OR 'EXIT' .
PERFORM free_objects .
LEAVE PROGRAM .
WHEN 'BACK' .
PERFORM free_objects .
SET SCREEN '0' .
LEAVE SCREEN .
ENDCASE .
ENDMODULE . " USER_COMMAND_9000 INPUT

CALL METHOD o_docking -> free
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
OTHERS = 3 .

IF sy - subrc <> 0 .
MESSAGE ID sy - msgid TYPE sy - msgty NUMBER sy - msgno
WITH sy - msgv1 sy - msgv2 sy - msgv3 sy - msgv4 .
ENDIF .
ENDFORM . " free_objects

Глава 1. Создание ALV GRID. Часть 1


Создание данных объектов описано в параграфах 1 – 7. В 8 параграфе на примере кнопки «Обновить» представлено взаимодействие класса представления данных и класса модели через класс контроллер.

Фильтрация

Далее, если необходимо, можно настроить фильтр для включения записей в отчет в зависимости от значений полей. Для этого необходимо перейти на закладку Фильтр. Здесь следует выбрать поля, по которым нужна фильтрация данных. и указать ограничения для значений этих полей.


После того, как нужные поля выбраны, необходимо перейти ко второму шагу «Определение значений для критериев фильтра».


В появившемся окне следует назначить условия фильтрации записей (ограничения для включения записей в отчет).


Введение

ALV – SAP List Viewer.

ALV Grid – элемент пользовательского интерфейса, используемый в различных приложениях для отображения табличных данных.

ALV Grid (далее ALV_Grid-отчет) позволяет пользователю настраивать вид отчета, для этой цели предоставляются следующие функции:

ALV_Grid-отчет также позволяет экспортировать данные в текст или в таблицу EXCEL, выводить отчет на печать и отображать в виде презентационной графики.

Пример внешнего вида ALV_Grid-отчета:


Сортировка

После выбора столбцов, которые будут отображаться в ALV_Grid-отчете, можно настроить Сортировку.

На данной закладке следует выбрать поля, по которым нужна сортировка, и расположить их в необходимой последовательности, а также определить направление сортировки (красный маркер).

При необходимости здесь же отмечается необходимость расчета промежуточных сумм (синий маркер).


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

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

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

На примере ниже красным маркером отмечены промежуточные итоги по группе записей с одинаковым значением по полю «ВидТорговДокумента» и синим маркером – отмечены группы записей, имеющих одинаковые значения по полю «Название материала». Итоговая сумма по всему отчету отмечена черным маркером.


Навигация в ALV_Grid-отчете

Если не все столбцы и записи помещаются на экран, перемещение по столбцам и записям осуществляется с помощью скроллинга (горизонтальная и вертикальная прокрутка).

Вы можете зафиксировать начальные столбцы (по аналогии с Excel), чтобы при перемещении по колонкам отчета они оставались «замороженными». Для этого выделите столбец, до которого (включительно) нужно зафиксировать столбцы слева, и, нажав правую кнопку мыши, выберите в появившемся списке меню пункт «Фиксир. до столбца».


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

На экране отчета можно сворачивать/разворачивать группировки (к итоговым строкам): подведите курсор к элементу группировки и щелкните левой кнопкой мыши. Примечание: Итоговые строки отчета на экране выводятся желтым цветом (светло-желтый цвет для промежуточных итогов и желтый для итога по отчету в целом).


Для сворачивания/разворачивания группировок по всему отчету в целом перейдите в меню к пункту: Параметры настройки – Определить развертку итогов


В появившемся окне следует выбрать уровень развертки итогов


Для просмотра подробных данных по отдельной записи (записям) отчета, отметьте строку (строки) и выберете на панели инструментов кнопку «Подробно». Примечание: нельзя использовать просмотр подробных данных для итоговых строк.


В зависимости от приложения, ALV_Grid-отчет может содержать дополнительные функции для данного отчета и, наоборот, скрывать некоторые функции, доступные в других стандартных приложениях SAP.


Находясь в режиме просмотра ALV_Grid-отчета, вы можете задать сортировку строк по возрастанию/убыванию значений в одной или нескольких колонках: выделите колонки и на панели инструментов нажмите кнопку «Сортировка по возрастающей» или «Сортировка по нисходящей».


В режиме просмотра ALV_Grid-отчета, вы можете задать фильтр для включения записей в отчет в зависимости от значений в одной или нескольких колонках: выделите колонки и на панели инструментов нажмите кнопку «Установить фильтр». Затем в появившемся окне задайте значения для фильтра.


Выделив столбцы, по которым нужно получить итоги, на панели инструментов нажмите кнопку «Итого». Затем, если нужны промежуточные итоги, на панели инструментов нажмите кнопку «Промежуточные суммы». В появившемся окне определите колонки по которым будут группироваться записи с одинаковым значением и формироваться промежуточные суммы.


Для выполнения ABC-анализа по выбранной Вами колонке выполните следующее: на панели инструментов нажмите кнопку «Экспортировать», в появившемся меню выберите «Анализ АВС». Примечание: подробнее об использовании в ALV функции «Анализ АВС» читайте в руководстве «SAP List Viewer (ALV): Classic» (English).


Для наглядности представления данных можно использовать встроенное средство презентационной графики, которое отображает данные при помощи различных видов гистограмм, линий и т.д. Выделите колонки, в разрезе которых будет построен отчет, и нажмите кнопку «Графика» (Ctrl+Shift+F11).


После этого в окне с графиком по нажатию правой кнопки мыши можно открыть меню для дополнительных настроек графика.


Экспорт данных из ALV_Grid-отчета

Для экспорта в текст на панели инструментов нажмите кнопку «Экспортировать» и далее «Обработка текста».

Для экспорта в электронную таблицу EXCEL на панели инструментов нажмите кнопку «Экспортировать» и далее «Электронная таблица»


Выбор столбцов

В левой половине на данной закладке содержатся уже выбранные поля, а в правой те, которые еще можно выбрать. Для перемещения полей между списками следует выделить поле в списке и использовать кнопки «влево» и «вправо» (отмечено синим маркером).


Порядок отображения в отчете выбранных полей настраивается при помощи кнопок «вверх», «вниз», «в самый верх», «в самый низ» (отмечено красным маркером).

Здесь же настраивается вывод итоговых значений для количественных полей – для соответствующего столбца устанавливается индикатор ∑ (отмечено синим маркером).


Печать ALV_Grid-отчета

Для печати отчета на панели инструментов нажмите кнопку «Печать».


На экране предварительного просмотра можно сделать дополнительные настройки по отображению отчета. Чтобы перейти к экрану просмотра перед печатью, на панели инструментов выберите кнопку «Ракурсы», после чего выберите «Вывод списка».


В результате отчет на экране отобразится в ином виде – «для печати»:


Изменение формата ALV_Grid-отчета


Выберите в меню Параметры настройки – Формат – Изменить

Нажмите на панели инструментов кнопку «Изменить формат» (Ctrl+F8)


После этого появится окно «Изменение формата».


Представление

На закладке «Представление» можно установить параметры оформления отчета на экране.


§ 1. Создание объектов словаря

Необходимо создать следующие объекты:

Передача данных с селекционного экрана в класс контроллер

Отображение полей в ALV отчете

Структура выходной таблицы. Включает в себя структуру ZST_MVC_001_ALV и дополнительные поля необходимые в процессе выборки

Тип таблицы на основе структуры ZST_MVC_001_OUTTAB

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

Поиск структуры RANGE осуществляется в таблице DD03L. Мы знаем, что в структуре есть поле LOW интересующего нас типа (в данном примере домен S_CARR_ID).


Рис. 1


Рис. 2

У вас уже есть учетная запись?

Сохранение и выбор варианта ALV_Grid-отчета

После того, как требуемый вид отчета настроен, его можно сохранить. Для этого следует на любом предыдущем экране нажать на «дискету». Если же вариант отчета сохраняется не из окна «Изменение формата», то следует на панели инструментов нажать кнопку «Сохранить формат» (Ctrl+F10).


Или в меню Параметры настройки–Формат–Сохранить.


Появится окно сохранение формата. Здесь в поле «Сохранить формат» следует ввести краткое название, а в поле «Название» ввести полное название варианта отчета.


После того, как формат сохранен, то ALV_Grid-отчет можно будет в дальнейшем вызывать в данном настроенном варианте отображения данных. Для этого используется кнопка «Выбрать формат»(Ctrl+F9)

Обсуждения 10 Написать комментарий

Комментарий от Олег Точенюк 20 октября 2014, 00:15

Цель данной главы создать ALV Grid - Серьезно? После прочтения цель данной главы создание объектов словаря данных, а вот лично ALVGrid-у вроде как все равно что выводить, пользовательскую таблицу или уже существующую, или в вообще локально объявленную. А то молодежь же офигеет и кинется на каждый чих таблицы плодить в словаре данных. Вопрос зачем?

Комментарий от Александр Дублин 20 октября 2014, 09:35

Цель данной главы создать ALV Grid - Серьезно? После прочтения цель данной главы создание объектов словаря данных, а вот лично ALVGrid-у вроде как все равно что выводить, пользовательскую таблицу или уже существующую, или в вообще локально объявленную. А то молодежь же офигеет и кинется на каждый чих таблицы плодить в словаре данных. Вопрос зачем?

Это только часть главы. Будет еще продолжение. Много продолжений .

Комментарий от Олег Точенюк 20 октября 2014, 16:11

Это только часть главы. Будет еще продолжение. Много продолжений .

Да дело то не в этом что это часть, просто вот эта часть к созданию ALV-таблицы, точнее выводу данных не имеет никакого отношения. Это скажем так ближе к описанию BC430 - Словарь данных и работа с ним. Можно же было вообще начать с . ну скажем так описания SAP Logon-а

Комментарий от Багдат Кенжалиев 22 октября 2014, 14:56

По-моему, самое простое это воспользоваться ФМ "REUSE_ALV_GRID_DISPLAY" или на худой конец использовать класс "cl_salv_table". Согласен с Олегом Точенюком, зачем плодить объекты словаря.

Комментарий от неизвестного пользователя 22 октября 2014, 20:30

По-моему, самое простое это воспользоваться ФМ "REUSE_ALV_GRID_DISPLAY" или на худой конец использовать класс "cl_salv_table". Согласен с Олегом Точенюком, зачем плодить объекты словаря.

Глава 1. Создание ALV GRID. § 1. Создание объектов словаря
Думаю логично почему в данном параграфе рассказывается о создании объектов словаря.

Да, можно использовать ФМ "REUSE_ALV_GRID_DISPLAY".
А можно все засунуть в 10000 строк кода без инклудов с локальными переменными.

Данная инструкция на простейших примерах объясняет как создавать сложные ALV отчеты с 2,3,4 alv на одном экране, которые взаимодействуют
друг с другом. В главах 2 и 3 примеры с двумя ALV.

Просьба дождаться выхода хотя бы первой главы и делать выводы.

Комментарий от Олег Точенюк 22 октября 2014, 22:49

Глава 1. Создание ALV GRID. § 1. Создание объектов словаря
Думаю логично почему в данном параграфе рассказывается о создании объектов словаря.

Да, можно использовать ФМ "REUSE_ALV_GRID_DISPLAY".
А можно все засунуть в 10000 строк кода без инклудов с локальными переменными.

Данная инструкция на простейших примерах объясняет как создавать сложные ALV отчеты с 2,3,4 alv на одном экране, которые взаимодействуют
друг с другом. В главах 2 и 3 примеры с двумя ALV.

Просьба дождаться выхода хотя бы первой главы и делать выводы.

Да можно все конечно объединить в колонке, что-то типа от обезьяны до профессионального SAP консультанта, но вот именно к работе с ALV это будет мало соотносимо. Если вы переживаете, что сама по себе работа с ALV таблицами не тема колонки, то зря, одно из описаний, что я видел, тянуло страниц на 170 десятого шрифта, да и то, там много интересных тем было упущено. Поэтому я бы не распылялся на расскажу про все что знаю, а брал бы тему ALV и старался бы ее раскрыть, а так вы про словарь данных не рассказали собственно ничего, например там дальше когда объявляете свой тип таблицы через словарь, интересная закладочка индексы есть, вот вы про нее ничего не сказали. а ведь кто-то может индекс нарисовать для быстродействия, а потом получить проблемы при отражении такой таблицы через ALV-компоненты. Так что я просто к тому что не надо распыляться. Словарь данных сам по себе штука очень мощная, начиная с определения доменов данных и дальше по восходящей.

Комментарий от Багдат Кенжалиев 23 октября 2014, 06:53

Глава 1. Создание ALV GRID. § 1. Создание объектов словаря
Думаю логично почему в данном параграфе рассказывается о создании объектов словаря.

Да, можно использовать ФМ "REUSE_ALV_GRID_DISPLAY".
А можно все засунуть в 10000 строк кода без инклудов с локальными переменными.

Данная инструкция на простейших примерах объясняет как создавать сложные ALV отчеты с 2,3,4 alv на одном экране, которые взаимодействуют
друг с другом. В главах 2 и 3 примеры с двумя ALV.

Просьба дождаться выхода хотя бы первой главы и делать выводы.

Шамиль, может после окончания всех статей по данной теме Вы скинете все в один PDF файл. Чтобы можно было читать офлайн.

С уважением,
Багдат.

Комментарий от неизвестного пользователя 23 октября 2014, 07:52

Шамиль, может после окончания всех статей по данной теме Вы скинете все в один PDF файл. Чтобы можно было читать офлайн.

С уважением,
Багдат.

Пишите отвечу на вопросы по поводу материалов

Комментарий от неизвестного пользователя 23 октября 2014, 08:00

Да можно все конечно объединить в колонке, что-то типа от обезьяны до профессионального SAP консультанта, но вот именно к работе с ALV это будет мало соотносимо. Если вы переживаете, что сама по себе работа с ALV таблицами не тема колонки, то зря, одно из описаний, что я видел, тянуло страниц на 170 десятого шрифта, да и то, там много интересных тем было упущено. Поэтому я бы не распылялся на расскажу про все что знаю, а брал бы тему ALV и старался бы ее раскрыть, а так вы про словарь данных не рассказали собственно ничего, например там дальше когда объявляете свой тип таблицы через словарь, интересная закладочка индексы есть, вот вы про нее ничего не сказали. а ведь кто-то может индекс нарисовать для быстродействия, а потом получить проблемы при отражении такой таблицы через ALV-компоненты. Так что я просто к тому что не надо распыляться. Словарь данных сам по себе штука очень мощная, начиная с определения доменов данных и дальше по восходящей.

Описание колонки: В этой колонке будет опубликована инструкция по созданию ALV отчётов с использованием шаблонов программирования Model-View-Controller.

Не про "словарь данных","интересная закладочка индексы", "кто-то может индекс нарисовать для быстродействия".

SAP — ABAP. Изменение строки подсуммирования в ALV grid

Работаю ABAP разработчиком в одной из отечественных компаний, внедряющих SAP.

На днях от консультанта пришла спецификация с задачей сделать специальную строку подсуммирования (ALV GRID), в который будут всевозможные суммы, значения, наименования и т.д., которых по стандарту в ней быть не должно. Также нужно реализовать возможность пользователю изменять данные в этой строке вручную.

Для тех, кто в танке: строки подсуммирования — желтенькие, в них выводятся подсуммы, в данном случае по дебитору.

image

  1. Сделать свою строку подсуммирования, которая будет лежать во внутренней табличке. Настроить для нее вывод с цветом, суммами и т.д.
  2. Попробовать подставить необходимые значения в стандартную строку подсуммирования.

Второй вариант — а так вообще можно?! Получив от начальства одобрение на исследование вопроса, полез гуглить, и на первой же ссылке добрый индус объясняет, что это вполне законно и реально. В классе CL_GUI_ALV_GRID есть метод GET_SUBTOTALS, возвращающий ссылки на таблицы с суммами всех уровней, которые можно спокойно изменять в своей программе. Выглядит он так:

image

Ура, товарищи! Задача понятна, и даже наметился план действий. Левые значения нужно вставлять только в строки подсуммировавния для дебиторов. Т.е. передаем в метод SET_TABLE_FOR_FIRST_DISPLAY параметр IT_SORT, в котором указываем первый уровень сортировки — сортировку по дебитору. Вытаскиваем таблицу сумм 1-ого уровня (это будут суммы для дебиторов) и подставляем туда нужные значения:

Схематически выглядит так:


«Неужели это сработает?!», подумал я, и трясущимися руками запустил отчет. Сработало. Но не совсем верно. Значения вывелись только в сабтоталы, оказавшиеся «под» экраном. Т.е. те, к которым нужно скроллить вниз. Решение нашлось довольно быстро на просторах интернета: вызвать мягкое обновление ALV после изменения подсумм:


Если не указывать параметр i_soft_refresh, то обновление пересчитает все сабтоталы и затрет наши данные.

Все?! Можно отдавать на тест?! Ну, это было не так уж и сл… так, стойте… а если пользователь изменит сортировку? Или отфильтрует данные? Или вообще сделает что угодно с нашей таблицей!? Она же обновится и все наши значения исчезнут! Черт…

Но, как оказалось, в классе CL_GUI_ALV_GRID есть волшебное и очень полезное событие: AFTER_REFRESH, которое запускается каждый раз, когда ALV обновляется. На этот раз план действия таков:

1. Ловим событие AFTER_REFRESH;
2. Получаем критерии сортировки текущего состояния ALV (которое сейчас выведется на экран): go_alv_grid->get_sort_criteria;
3. Проверяем: на первом уровне сортировки должен быть дебитор (<lfs_sort>-spos = 1 AND <lfs_sort>-fieldname = 'KUNNR') и должна быть включена подсуммировка (<lfs_sort>-subtot = 'X');
3.а. Если все ок, запускаем подпрограмму, которая подставляет нужные данные в строки подсуммирования: PERFORM set_subtotals.;
3.б. Иначе изменяем критерии сортировки таким образом, что бы на первом уровне стоял дебитор и для него была включена подсуммировка;
3.б.I. Если дебитора вообще нет в критерия сортировки, то удляем сортировку 9-ого уровня (если она есть), увеличиваем все остальные уровни на +1, и вставляем первым уровнем сортировку по дебитору;
3.б.II. Если сортировка по дебитору есть в таблице, но не на первом уровне, то увеличиваем все уровни сортировок меньшие уровня дебитора на +1, и меняем уровень сортировки дебитора на 1;

4. Устанавливаем верные критерии сортировки: go_alv_grid->set_sort_criteria( lt_sort );
5. Далее запускаем обновление ALV с пересчетом сумм (здесь надо быть аккуратнее, что бы не запустить бесконечную рекурсию, т.к. событие AFTER_REFRESH отработает еще раз);
6. Событие отработает 2-ой раз, но критерии сортировки будут верными, и запустится заполнение строк сабтотала (кстати тут проблема — необходимо сделать проверку, на случай если установлены верные суммы, что бы программа не зависла из-за бесконечной рекурсии, т.к. после изменения сумм нам нужно запустить мягкое обновление ALV).

Профит! Получаем похвалу от начальства и консультанта! Как бы пользователь не мучил ALV, на первом уровне сортировки всегда будет дебитор, для него всегда будет строка подсуммировки с нужными значениями.

Осталась только одна проблема — изменять данные вручную пользователь до сих пор не может. А хочет. Но, пообщавшись с консультантом, решили отлавливать даблклик по такой строке и выкидывать окошко с полями ввода, которые заполнит пользователь, нажмет Enter и они попадут в необходимые поля в таблице. Возникает вопрос, как строку подсуммировки отличить от обычной? Ответ: да легко конечно! Что вообще за глупые вопросы? В событии DOUBLE_CLICK есть отличный параметр: is_row-rowtype. Он пустой в обычных строках, и заполнен в служебных. Заполнен он обычно строкой такого типа:


Экспериментальным путем выяснилось, что S — строка подсуммировки (есть еще значение T — итоговая строка сумм), 0101 — уровень сортировки (по крайней мере последние 2 цифры). Второе поле структуры is_row (index) содержит номер строки таблицы сумм необходимого уровня. Вся информация есть! Действуем:

1. Проверяем, что пользователь кликнул по сабтоталу;
2. Получаем таблицу сумм первого уровня: go_alv_grid->get_subtotals;
3. Читаем необходимую строку sub_total_tab[ is_row-index ];
4. Показываем пользователю окно с полями ввода (вставляем в них текущие значения строки);
5. Получаем пользовательские данные;
6. Вставляем пользовательские данные в нашу строку;
7. Мягко обновляем ALV.

Ну вот вроде и все! Все довольны, все работает! Ну по крайней мере у меня, пока консультант в отпуске и еще не проверял.

Читайте также: