Задачу определения места в программе, из которого было вызвано сообщение, можно решить несколькими способами. Ниже будут рассмотрены основные из них.
В качестве простого примера рассмотрим вызов сообщения в SE38, при неправильно указанном имени программы:
Способ первый. Щелкнув дважды по сообщению и открыв подробный текст в разделе технической информации, мы увидим класс сообщения и его номер:
Перейдя в указанный класс сообщений (тр. SE91) можно воспользоваться командой на поиск мест, где используется указанное сообщение:
В результате список окажется довольно большим и нам надо будет прощелкать все программы в поисках нужного вызова:
В случае, когда список маленький, можем поставить точки прерывания в каждом из вызовов, повторим некорректный ввод программы мы, скорее всего, попадём в нужное нам место.
Данный способ не совсем удобен и не дает 100% результата, т.к. сообщение может быть вызвано не из класса сообщений, а список использования его программами может быть очень большим.
Способ второй. Наиболее результативными способами будут способы, которые используют отладчик. С помощью точек наблюдений в отладчике, мы можем отследить состояние системных переменных: sy-msgid и sy-msgno. Переходим в отладку (/h):
Нажимаем F8, переходим на вкладку Watchpoints, выставляем значения, полученные из технической информации:
Запускаем программу (F8), вываливаемся на нужном месте:
Способ третий. Таким же способом, как и ранее, попадаем в отладку, далее переходим к выставлению точек прерывания и указываем ABAP команду MESSAGE:
Либо добавляем её через меню:
В данном случае можно будет указать еще и тип вызываемого сообщения:
Способ четвертый. Найти вхождение вызова оператора MESSAGE, используя программы сканирования исходного текста. Первое что нужно сделать определится через статус системы где мы находимся и в какой программе нужно искать (По меню Система -> Статус):
Далее открываем программу сканирования исходного текста (через SE38) RPR_ABAP_SOURCE_SCAN (либо использовать транзакцию CODE_SCANNER) и заполняем искомые данные:
Результат:
Способ пятый. С помощью транзакции SAT можно проанализировать вызовы всех ABAP операторов в программе. Первым делом нужно создать вариант, в котором не будут объединяться измерения:
Далее запускаем транзакцию SE38 через SAT с нашим вариантом:
После трассировки смотрим иерархию вызовов и ищем оператор MESSAGE:
Результат:
Щелкнув два раза по позиции, мы перейдем в нужное нам место. Данный способ не является оптимальным, т.к. в больших программах файл трассировки будет очень большим и его анализ затянется.
Способ шестой. Использовать транзакцию ST05. Порядок действий следующий:
- Открыть две сессии в одной запустить ST05, во второй SE38 с неверным названием программы
- Активируем трассировку
- Запускаем программу в SE38
- Деактивируем трассировку
Зная, что таблица с наименованиями программы называется PROGDIR, мы можем перейти в то место кода программы, где вызывается считывание данной таблицы. Предполагаем, что вызов сообщения о несуществующей программе будет где-то «рядом»:
Как видим на рисунке, наше предположение было верным:
С оригиналом статьи можно ознакомиться тут.
Спасибо, интересные последние 3 способа.
Все таки в САПе по-дурацки спроектированы эти сообщения: произошла ошибка (программа не найдена) а они выдают успешное сообщение msgty=’S’ — только чтобы не вывалиться из программы.