ABAP: Красивый
Эта публикация предназначена ABAP-разработчикам в SAP ERP и всем им сочувствующим.
Немногие знают, что в fullscreen ALV можно подключать HTML-заголовки. Еще больше не знают, что можно сделать красивый стандартный выпадающий список, он же select-box, только для такой по сути стандартной фичи, потребуется много вашего Z-кода.
Выглядит примерно так:
Добро пожаловать под кат.
Поехали! Определим глобальные переменные:
— Выходная таблица нашего отчета, пусть она будет на основе всем известной таблицы MARA;
— Переменная, в которой мы будем хранить текущее значение выбранной в селект-боксе;
— константу с подпрограммой для HTML-header;
— класс-handler, который будет срабатывать при выборе данных, и объект handler.
Напишем главную программу отчета и подпрограммы по инициализации, получении данных и выводе отчета. Здесь особо отмечу, что нужно создать объект handler и подключить HTML-заголовок: i_callback_html_top_of_page = gc_form_top.
Для HTML-хедера создаем подпрограмму с именем, указанным в глобальном константе. Вызовем из нее подпрограмму, которая создаст нашу красоту:
Посмотрим подпрограмму по созданию селект-бокса. Здесь отмечу, что если в отчете была команда, снять фильтры, зачищаем нашу глобальную переменную (gv_matnr) со значением. Потом создаем линию, в которую добавляем заголовок фильтра, вызываем подпрограмму, которая заполнит нам значения в нем, и сам фильтр на форму, закрываем линию:
В программе по заполнению фильтра добавим сначала то значение, которое сейчас выбрано, чтобы оно было первым в списке. Потом добавим значение Все, если у нас в таблице больше одного значения. И потом все записи из таблицы:
Внедрим наш handler. Здесь в sender->value значение, выбранное пользователем. Запишем его сразу в нашу глобальную переменную gv_matnr. В подпрограмме set_filter по обработке стандартной фильтрации:
1) Получим глобальный grid в локальный объект;
2) Получим уже установленные параметры фильтрации, и снимем уже установленный ранее фильтр, по полю, которое мы фильтруем, через селект-бокс;
3) Добавим новые параметры фильтрации;
4) Сохраним фильтр;
5) Обновим отчет.
Запускаем! Любуемся на итог страданий:
UPDATE: можно довести до:
Вроде простая штука, а в SAPе нужно постараться еще. Всем спасибо.
Глава 1. Создание ALV GRID. Часть 1
ABAP OBJECTS ALV
Рис. 1
Для этого нам необходимо создать следующие объекты:
Создание данных объектов описано в параграфах 1 – 7. В 8 параграфе на примере кнопки «Обновить» представлено взаимодействие класса представления данных и класса модели через класс контроллер.
§ 1. Создание объектов словаря
Необходимо создать следующие объекты:
Передача данных с селекционного экрана в класс контроллер
Отображение полей в ALV отчете
Структура выходной таблицы. Включает в себя структуру ZST_MVC_001_ALV и дополнительные поля необходимые в процессе выборки
Тип таблицы на основе структуры ZST_MVC_001_OUTTAB
Прежде чем переходить к созданию данных объектов, остановимся на небольшой инструкции поиска стандартных типов таблиц RANGE. Нужны нам будут данные типы таблиц для передачи SELECT-OPTIONS с селекционного экрана в класс контроллер.
Поиск структуры RANGE осуществляется в таблице DD03L. Мы знаем, что в структуре есть поле LOW интересующего нас типа (в данном примере домен S_CARR_ID).
Рис. 1
Рис. 2
Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland
У вас уже есть учетная запись?
Комментарий от Олег Точенюк 20 октября 2014, 00:15
Комментарий от Александр Дублин 20 октября 2014, 09:35
Комментарий от Олег Точенюк 20 октября 2014, 16:11
Комментарий от Багдат Кенжалиев 22 октября 2014, 14:56
Комментарий от неизвестного пользователя 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.
Просьба дождаться выхода хотя бы первой главы и делать выводы.
Комментарий от Багдат Кенжалиев 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.
Не про «словарь данных»,»интересная закладочка индексы», «кто-то может индекс нарисовать для быстродействия».
Дальше продолжать спор нет ни времени, ни желания.
У нас свободная демократическая страна можно просто не читать.
Комментарий от Олег Точенюк 23 октября 2014, 13:00
SAP — ABAP. Изменение строки подсуммирования в ALV grid
Работаю ABAP разработчиком в одной из отечественных компаний, внедряющих SAP.
На днях от консультанта пришла спецификация с задачей сделать специальную строку подсуммирования (ALV GRID), в который будут всевозможные суммы, значения, наименования и т.д., которых по стандарту в ней быть не должно. Также нужно реализовать возможность пользователю изменять данные в этой строке вручную.
Для тех, кто в танке: строки подсуммирования — желтенькие, в них выводятся подсуммы, в данном случае по дебитору.
Второй вариант — а так вообще можно?! Получив от начальства одобрение на исследование вопроса, полез гуглить, и на первой же ссылке добрый индус объясняет, что это вполне законно и реально. В классе CL_GUI_ALV_GRID есть метод GET_SUBTOTALS, возвращающий ссылки на таблицы с суммами всех уровней, которые можно спокойно изменять в своей программе. Выглядит он так:
Ура, товарищи! Задача понятна, и даже наметился план действий. Левые значения нужно вставлять только в строки подсуммировавния для дебиторов. Т.е. передаем в метод SET_TABLE_FOR_FIRST_DISPLAY параметр IT_SORT, в котором указываем первый уровень сортировки — сортировку по дебитору. Вытаскиваем таблицу сумм 1-ого уровня (это будут суммы для дебиторов) и подставляем туда нужные значения:
Схематически выглядит так:
«Неужели это сработает?!», подумал я, и трясущимися руками запустил отчет. Сработало. Но не совсем верно. Значения вывелись только в сабтоталы, оказавшиеся «под» экраном. Т.е. те, к которым нужно скроллить вниз. Решение нашлось довольно быстро на просторах интернета: вызвать мягкое обновление ALV после изменения подсумм:
Если не указывать параметр i_soft_refresh, то обновление пересчитает все сабтоталы и затрет наши данные.
Все?! Можно отдавать на тест?! Ну, это было не так уж и сл… так, стойте… а если пользователь изменит сортировку? Или отфильтрует данные? Или вообще сделает что угодно с нашей таблицей!? Она же обновится и все наши значения исчезнут! Черт…
Но, как оказалось, в классе CL_GUI_ALV_GRID есть волшебное и очень полезное событие: AFTER_REFRESH, которое запускается каждый раз, когда ALV обновляется. На этот раз план действия таков:
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.
Ну вот вроде и все! Все довольны, все работает! Ну по крайней мере у меня, пока консультант в отпуске и еще не проверял.
Ограничения на изменения общесистемных вариантов отчета
Николова Мария
Предотвратите изменения форматов вывода отчетов SAP List Viewer со стороны пользователей с помощью ограничения на доступ к объекту полномочий S_ALV_LAYO.
Ключевое понятие
S_ALV_LAYO – объект авторизации, использование которого позволяет контролировать доступ пользователей к общесистемному изменению форматов отчетов SAP List Viewer.
S_ALV_LAYO – позволяет авторизовать пользовательскую роль, которая предоставляет необходимые права для доступа к данным компании и их редактирования.
SAP List Viewer (ALV) (просмотр списков SAP) упрощает работу со списками и отчетами, предоставляя пользователям стандартизированные интерфейсы и форматы списков. ALV grid control (табличное представление ALV), являясь частью функционала ALV, представляет отчеты в табличной форме. Когда Вы запускаете некоторый отчет в SAP SCM, ALV grid control автоматически активируется. Например, запустите транзакцию IW38 (Изменение заказов ТОРО: список заказов) и Вы обнаружите отчет, в котором ALV grid control автоматически активирован (Рис. 1). Рис. 1 показывает заказы ТОРО в табличной форме с функциями ALV grid control, запускаемыми через панель инструментов. В представленной таблице, ALV дает следующие возможности: изменение размера столбцов, перемещение столбцов с помощью мыши, одновременная сортировка нескольких колонок..
Оформите подписку sappro и получите полный доступ к материалам SAPPRO
Alv отчет sap что это
ALV grid с «Шапкой»
| Ассистент |
![]() |
Зарегистрирован:
Пт, ноя 05 2004, 04:13
Сообщения: 36
Пол: Мужской
| Подскажите, пожалуйста, как при выводе отчета в ALV расположить над ним «Шапку» с каким-либо текстом (например с критериями виборки) ЗЫ: Использую CALL FUNCTION ‘REUSE_ALV_LIST_DISPLAY’ |
| Гуру-эксперт |
![]() |
Зарегистрирован:
Вт, авг 24 2004, 07:19
Сообщения: 3952
Откуда: ECC 6.0, South Kazakhstan
| Подскажите, пожалуйста, как при выводе отчета в ALV расположить над ним «Шапку» с каким-либо текстом (например с критериями виборки) ЗЫ: Использую CALL FUNCTION ‘REUSE_ALV_LIST_DISPLAY’ Подскажите, пожалуйста, как при выводе отчета в ALV расположить над ним «Шапку» с каким-либо текстом (например с критериями виборки) ЗЫ: Использую CALL FUNCTION ‘REUSE_ALV_LIST_DISPLAY’ проще было бы, если вы разместили его в форуме для этого нам необходимо использовать события: data: it_events type slis_t_event with header line. * укажем форму для вывода шапки it_events-name = ‘TOP_OF_PAGE’. * при вызове CALL FUNCTION ‘REUSE_ALV_LIST_DISPLAY’ не забудем * ну а в самой форме TOP_OF_PAGE_FORM выводим все что нам нужно form top_of_page_form. |
| Старший специалист |
![]() |
Зарегистрирован:
Пн, окт 24 2005, 15:55
Сообщения: 296
Пол: Мужской
| Гуру-эксперт |
![]() |
Зарегистрирован:
Вт, авг 24 2004, 07:19
Сообщения: 3952
Откуда: ECC 6.0, South Kazakhstan
| Специалист |
![]() |
Зарегистрирован:
Чт, апр 13 2006, 08:44
Сообщения: 133
Откуда: 56
Пол: Мужской
| Как сделать без |
| Младший специалист |
![]() |
Зарегистрирован:
Ср, ноя 10 2004, 17:44
Сообщения: 97
Откуда: Москва
Пол: Мужской
| Посмотрите примеры, особенно вызов функции REUSE_ALV_COMMENTARY_WRITE. А если конкретно, то вот так можно сделать простейший заголовок: CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’ FORM event_build USING rt_events TYPE slis_t_event. FORM make_top_of_page. CALL FUNCTION ‘REUSE_ALV_COMMENTARY_WRITE’ |
| Специалист |
![]() |
Зарегистрирован:
Чт, апр 13 2006, 08:44
Сообщения: 133
Откуда: 56
Пол: Мужской
| Да вот только мне надо чтобы объектами было. в BCALV_TREE_DEMO похоже на правду: * create emty tree-control | | ||||
Зарегистрирован: |
| ||||
Зарегистрирован: | | ||||
Зарегистрирован: | | ||||
Зарегистрирован: | | ||||
Зарегистрирован: |
Логотип © 2006 Андрей Горшков |










