Четыре техники-практики поиска расширений кода
Данная статья посвящена одной из задач, возникающей у консультантов любого направления – поиск точек расширения в стандартной функциональности. В статье разбираются все стандартные технологии расширения стандартного кода, а также рассмотрены особенности поиска каждой из технологий.
Оглавление
2. Кратко о расширениях и модификациях
3. Техники поиска расширений кода
3.1. Принципы оценки техник поиска. Оценочный лист
3.3. Техника 2. ST12 «Анализ производительности транзакции»
3.4. Техника 3. Software Layer-Aware Debugging (SLAD)
3.4.1. Работа с инструментом SLAD. Создание профиля отладки
3.4.2. Работа с отладчиком. Использование профиля отладки
3.5. Техника 4. ABAP Debugger Scripting (ADS)
3.5.1. Краткий перечень инструментария
3.5.2. Debugger-скрипт. Ловим простые события
3.5.3. Debugger-скрипт. Ловим непростые события
3.5.4. Debugger-скрипт. Сборка событий в единый скрипт и упрощение логики
3.5.5. Результаты работы Debug-скрипта. Транзакция SAS
Аннотация
Данная статья посвящена одной из задач, возникающей у консультантов любого направления – поиск точек расширения в стандартной функциональности. В статье разбираются все стандартные технологии расширения стандартного кода, а также рассмотрены особенности поиска каждой из технологий.
Автор предлагает четыре способа поиска точек расширения. Каждое из решений оценивается по 9 параметрам, итоговые данные собраны в единую сравнительную таблицу. Кроме того, предложено авторское решение поиска, которое может быть использовано любым читателем.
Статья будет полезна разработчикам и консультантам SAP. Для наиболее полного понимания информации желательно знакомство с технологиями расширения кода, а также с инструментами отладки (хотя и необязательно).
1.Завязка
Пожалуй, каждый из консультантов и разработчиков сталкивался с необходимостью расширить или изменить функциональность стандартного кода. Найти необходимое и приемлемое место расширения – задача нетипичная и нелегкая, скорость поиска в немалой степени зависит от опытности консультанта: одних только технологий расширения у SAP насчитывается 7 видов.
Или другая задача для консультанта: имеем некий бизнес-процесс, который ведёт себя неправильно. По мере рассмотрения проблемы подозрения падают на расширения стандартного кода. И снова для поиска места возникновения проблем в ход идут разные ухищрения, начинается работа с отладчиком…
Ещё немного «сгустим краски»: бизнес-процесс нестандартный, но построен на использовании стандартных BADI\BAPI; вызовы BAPI из одних областей пересекаются с вызовами BAPI других областей; документация, увы, не помощник. В помощь консультанту призывается сам Horst Keller - опытный разработчик, приносятся жертвоприношения всем богам, сыплются проклятия на головы причастных…
Автоматизация данного процесса значительно облегчит работу консультанту и разработчику, сэкономит время, нервы, деньги. В статье рассматривается 4 возможных техники поиска, с использованием разных инструментов и разными возможностями, с разной степенью автоматизации.
Портал SAPLAND ранее публиковал статьи на инструменты, описываемые в данном тексте. Хотелось бы избежать повторений, и потому в статье будут отсылки на ранние статьи, в которых некоторые вопросы будут раскрыты более подробно.
2.Кратко о расширениях и модификациях
Компания SAP подробно раскрывает основные технологии расширения объектов системы и ABAP-кода в двух курсах: BC425 и BC427 (Disclaimer note: говоря в аннотации «все стандартные технологии расширения стандартного кода» автор имел в виду именно технологии, перечисленные в данных двух курсах). Кратко перечислим возможные способы расширения\изменения кода и способы их поиска, которые предлагает SAP.
- Технология Customer-exit. Как вызывается Customer-exit: с помощью команды CALL CUSTOMER-FUNCTION. В рамках этой технологии также используется команда CALL CUSTOMER-SUBSCREEN, однако мне не приходилось увидеть использование оной и эта команда не рассматривается в дальнейшем.
- Технология User-exit. Как вызывается User-Exit: с помощью вызова подпрограмм с именем типа USER_EXIT_*. Соответственно, и искать мы будет PERFORM USER_EXIT_*.
- Технология Field-Exit, технология обработки полей ввода. Работает данная технология через вызов ФМ вида FIELD_EXIT_*; логично, что и искать его надо по имени.
- Технология BTE (Business Transaction Events ). Данная технология имеет два типа функций: Publish&Subscribe и Process. Соответственно, и способов поиска также два: вызов CALL FUNCTION OPEN_FI_PERFORM_* , вызов CALL FUNCTION OUTBOUND_CALL_* .
- Teхнология Badi. Эта технология делится на два вида, условно назовём их «старые» (old) BADI и «новые» (new) BADI. Вызываются по-разному (а, значит, и искать их надо по-разному):
- «Старые» BAdi вызываются опосредованно, через поиск нужного BAdi-расширения с помощью вызова метода CL_EXITHANDLER=>GET_INSTANCE или CL_EXITHANDLER=>GET_INSTANCE_FOR_SUBSCREENS.
- Новые BAdi ищутся и вызываются с помощью команд GET BADI и CALL BADI соответственно.
- Технология Enhancements. Несмотря на то, что данная технология включает в себя несколько способов расширений (это и Enhancement-Point, и Enhancement—Spot, И Enhancement-Section, и неявные точки расширения) найти такое расширение можно по ключевому слову «ENHANCEMENT».
- Технология расширения методов класса. Любой метод класса (кроме конструкторов) может быть расширен:
- С помощью PreExit-расширения. Расширение вызывается перед выполнением метода.
- С помощью PostExit-расширения. Расширение вызывается после выполнения метода.
- С помощью Overwrite-Exit-расширения. Расширение вызывается вместо метода.
Строго говоря, расширение создаётся как Enhancement, соответственно, и искать его можно по ключевому слову Enhancement.
2.1.Дополнительные знания
Для упрощения задачи воспользуемся нижеперечисленными дополнительными знаниями о системе; эти знания существенно облегчат нам задачу:
- Внутри каждого CALL CUSTOMER-FUNCTION происходит вызов ФМ вида EXIT_*.
- Для технологии BTE помимо вызова ФМ OPEN_FI_PERFORM_* можно использовать поиск по ФМ BF_FUNCTIONS_FIND (он вызывается внутри ФМ OPEN_FI_PERFORM_*). Аналогично и для второго ФМ OUTBOUND_CALL_* - можно использовать поиск по ФМ PC_FUNCTION_FIND . Это правило соблюдается почти(!) всегда. В редких случаях эти «парные» ФМ вызываются по отдельности, друг за другом. Впрочем, цена ошибки невелика, исключение легко проверяется.
- Любой Old BADI являются классом с именем CL_EX_*. Соответственно, вычислить запуск OLD BADI можно по маске имени класса.
- В методе CL_EXITHANDLER=>GET_INSTANCE имя BADI передаётся через входной параметр EXIT_NAME. Однако в некоторых случаях параметр EXIT_NAME не заполняется. В такой ситуации вызываемый BADI требуется искать опосредованно, через тип входного параметра INSTANCE; далее в статье будет разобран подобный случай.
- Технология расширения методов класса обладает следующими закономерностями. При создании для класса Enhancement-расширения для такого класса создаётся локальный класс-«друг». Каждый расширяемый метод получает «друзей»-методов, имена которых имеют следующую закономерность:
- имя PreExit-метода начинается с IPR_*;
- имя PostExit-метода начинается с IPO_*;
- имя Overwrite-Exit-метода начинается с IWO_*;
- имя *Exit-метода оканчивается на «~имя_расширяемого_метода».
3.Техники поиска расширений кода
3.1.Принципы оценки техник поиска. Оценочный лист
Для качественной оценки каждой из техник предлагается следующий перечень критериев:
- Поиск Customer-Exit. Учитывается поиск CALL CUSTOMER-EXIT, но не учитывается CALL CUSTOMER-SUBSCREEN.
- Поиск User-Exit.
- Поиск Field-Exit.
- Поиск BTE.
- Поиск OLD BADI.
- Поиск NEW BADI. Поиск OLD BADI\NEW BADI отличается, и потому BADI оценивается по двум разным критериям.
- Поиск Enhancement. Немного забегая вперёд: ни одна из техник не показывает неявные точки расширения, которые не были реализованы; впрочем, это и не требуется. Реализованные неявные точки – успешно находятся.
- Поиск Pre-, Post-, Overwrite-методов для расширения классов.
- Возможность вывода найденных точек расширения единым списком. Часть техник способны на это, другие же могут показать только текущую найденную точку.
Для удобства критерии собраны в таблицу (Таблица 1) в следующем виде:
Таблица 1. Табличный вид критериев поиска
3.2.Техника 1. Отладчик
Самый первый, самый популярный способ – конечно, отладчик.
Возможности. С помощью точек прерывания можно поймать вызов многих простых событий, например:
- Поймать вызов команды CALL CUSTOMER-FUNCTION;
- Поймать вызов команд CALL BADI, GET_BADI;
- Поймать вызов команды ENHANCEMENT;
- Поймать вызов методов CL_EXITHANDLER=>GET_INSTANCE и => GET_INSTANCE_FOR_SUBSCREENS;
- Поймать вызов ФМ, если известно его точное имя.
Рис. 1 наглядно иллюстрирует создание точек прерывания.
Рис. 1 Создание точки прерывания с помощью отладчика
Думаю, что нет смысла давать подробное описание того, как работать с точками прерывания и точками наблюдения в отладчике. Если есть необходимость – в конце статьи в разделе «Ссылки» есть несколько замечательных статей, которые подробно раскрывают тему.
Ограничения. Всё остальное, не перечисленное к «возможностях» – к сожалению, поймать нельзя. Отладчик не может работать с именами команд\ методов\ функций\ подпрограмм по маске.
Краткий итог.
Результаты представлены в Таблица 2.
Таблица 2. Результаты для инструмента "Отладчик"
Отладчик – инструмент хорошо знакомый разработчикам; к сожалению, охватывает не весь перечень возможностей.
3.3.Техника 2. ST12 «Анализ производительности транзакции»
Вторая техника, о которой пойдёт речь – транзакция ST12. Функциональность данного инструмента разработчика – тема для отдельной статьи, которых, кстати, немало – некоторые из них упомянуты в конце статьи.
Запускаем транзакцию\программу, выполняем нужные действия, возвращаемся на первый экран и дожидаемся окончания сбора статистики.
Далее запускаем просмотр полученного трейса в режиме «Per Call» и ставим ALV-фильтр по столбцу «Call». Возможные для поиска точки расширения (не все) перечислены на Рис. 2
Рис. 2 Транзакция ST12. Задание фильтра "точек расширения"
Через мгновение получаем перечень возможных точек расширения (Рис. 3)
Рис. 3 Транзакция ST12, результаты поиска.
Ограничения. Нельзя поймать вызов NEW BADI, Enhancement.
Краткие итоги.
Заполним таблицу 3:
Таблица 3. Результаты для инструмента "ST12"
Плюсы инструмента:
- решение «из коробки»;
- простота использования, не требует настройки;
- возможность просмотра результатов как в «плоском» виде, так и в иерархическом списке вызовов.
Минусы инструмента:
- неполное покрытие списка точек расширения.
3.4.Техника 3. Software Layer-Aware Debugging (SLAD)
Для решения задачи использовать другой инструмент «из коробки» - Software Layer-Aware Debugging (SLAD).
SLAD предназначен для разграничения уровней срабатывания отладчика. К примеру, с помощью SLAD можно работать в отладке со своим Z-кодом и пропускать стандартный код (например, ALV-код, WebDynpro-код и т.п.).
Рассмотрим настройку SLAD.
3.4.1. Работа с инструментом SLAD. Создание профиля отладки
Запускаем транзакцию SLAD. Создаём профиль (Рис. 4).
Рис. 4. SLAD. Создание профиля.
Переходим на вкладку «Наборы объектов». Создаем набор (Рис. 5).
Рис. 5. SLAD. Создание набора объектов.
Создаём два объема выборок. Имя выборок придумываем, заполняем аналогично Рис. 6.
Рис. 6. SLAD. Создание объёмов выборок.
Заполняем первый объем выборки, перечисляем функциональные модули. Подробности – на Рис. 7.
Рис. 7. SLAD. Заполнение объёмов выборок для ФМ.
Заполняем второй объём выборок, выборка по классам (Рис. 8).
Рис. 8. SLAD. Заполнение объёмов выборок для классов.
Далее задаём условие соединения объемов выборок (Рис. 9).
Рис. 9. SLAD. Условие соединения выборок.
Не забываем сохраниться и возвращаемся на закладку «Профили». Включаем сохранённый набор объектов в профиль, ставим чекбоксы так, как указано на Рис. 10, сохраняем профиль. Всё.
Рис. 10. SLAD. Включение набора объектов в профиль.
3.4.2.Работа с отладчиком. Использование профиля отладки
Заходим в отладчик и загружаем SLAD-профиль. На Рис. 11 наглядно показано как выполняется загрузка профиля.
Рис. 11. SLAD. Загрузка SLAD-профиля.
Следующий шаг – необходимо активировать использование SLAD. Жмём соответствующую кнопку.
На этом вся настройка закончена, SLAD активирован. Теперь по каждому нажатию на соответствующую кнопку отладчик будет останавливаться в тех местах, которые отвечают условиям активированного профиля.
3.4.3.Краткие итоги
Заполним таблицу 4:
Таблица 4. Результаты для инструмента "SLAD"
SLAD можно в некоторых случаях использовать для поиска точек расширения.
Его плюсы:
- профиль можно и нужно создать один раз и пользоваться в дальнейшем;
- Сравнительно быстрая настройка.
Минусы инструмента:
- неполное покрытие списка точек расширения;
- нельзя получить список всех мест, где произошло событие-прерывание. Работа возможна
Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland
ЗарегистрироватьсяУ вас уже есть учетная запись?
Войти
Обсуждения 6
Комментарий от
Евгений Данилович
| 07 июня 2018, 05:52
Можно найти расширения и по пакету разработки.
USER exits, например, по пакету VMOD. Перейти в Object Navigator (SE80). Выбрать раздел пакет, ввести VMOD и получим список вех includes для модуля SD. Также зная пакет разработки транзакции, класса и т.д. получим список BADI в разделе 'Расширения' пункт 'Бизнес-Add Ins (опред.)' это Old BADI и пункт 'Точки Расширений' - New Badi.
Комментарий от
Александр Грибов
| 07 июня 2018, 12:58
Евгений Данилович 07 июня 2018, 05:52
Спасибо за статью!
Можно найти расширения и по пакету разработки.
USER exits, например, по пакету VMOD. Перейти в Object Navigator (SE80). Выбрать раздел пакет, ввести VMOD и получим список вех includes для модуля SD. Также зная пакет разработки транзакции, класса и т.д. получим список BADI в разделе 'Расширения' пункт 'Бизнес-Add Ins (опред.)' это Old BADI и пункт 'Точки Расширений' - New Badi.
Да, вы совершенно правы, список ВСЕХ точек расширения можно найти в том или ином виде с помощью стандартных инструментов. Вопрос в том, что найти список _используемых_ точек (или точек, которые можно использовать) в конкретном случае не так очевидно.
Впрочем, век живи - век учись: уже после написания данной статьи я узнал ещё об одном простом способе выявить используемые точки. Об этом я напишу в следующей статье.
Вы испробовали тот debugger-скрипт, что приложен к статье?
Комментарий от
Евгений Данилович
| 08 июня 2018, 08:44
Александр Грибов 07 июня 2018, 12:58
Спасибо за проявленный интерес!
Да, вы совершенно правы, список ВСЕХ точек расширения можно найти в том или ином виде с помощью стандартных инструментов. Вопрос в том, что найти список _используемых_ точек (или точек, которые можно использовать) в конкретном случае не так очевидно.
Впрочем, век живи - век учись: уже после написания данной статьи я узнал ещё об одном простом способе выявить используемые точки. Об этом я напишу в следующей статье.
Вы испробовали тот debugger-скрипт, что приложен к статье?
Комментарий от
Александр Грибов
| 08 июня 2018, 08:56
Евгений Данилович 08 июня 2018, 08:44
Тестирую приложения через SAP EPortal. Висит. Не дождался завершения. Ещё на BREAK-POINT падает в дамп. Это видимо особенность режима в котором вызывается скрипт
Ведь по сути анализируется каждая выполняемая команда.
Работает медленно, но работает :)
Если падает в дамп - перед запуском удалите все точки прерывания отладчика. Есть какие-то внутренние глюки в отладке..
Комментарий от
Сергей Бережной
| 13 июня 2018, 11:24
Запустили стандартную транзакцию или отчет, выполнили действия и посмотрели в Z пакетах все расширения, ...
Комментарий от
Александр Грибов
| 13 июня 2018, 15:24
Сергей Бережной 13 июня 2018, 11:24
Александр, еще удобно пользоваться тр.SAT.
Запустили стандартную транзакцию или отчет, выполнили действия и посмотрели в Z пакетах все расширения, ...