6 способов найти место вызова сообщений

Задачу определения места в программе, из которого было вызвано сообщение, можно решить несколькими способами. Ниже будут рассмотрены основные из них.

В качестве простого примера рассмотрим вызов сообщения в SE38, при неправильно указанном имени программы:

se38

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

tech_info

Перейдя в указанный класс сообщений (тр. SE91) можно воспользоваться командой на поиск мест, где используется указанное сообщение:

se91

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

se91result

В случае, когда список маленький, можем поставить точки прерывания в каждом из вызовов, повторим некорректный ввод программы мы, скорее всего, попадём в нужное нам место.

Данный способ не совсем удобен и не дает 100% результата, т.к. сообщение может быть вызвано не из класса сообщений, а список использования его программами может быть очень большим.

Способ второй. Наиболее результативными способами будут способы, которые используют отладчик. С помощью точек наблюдений в отладчике, мы можем отследить состояние системных переменных: sy-msgid и sy-msgno. Переходим в отладку (/h):

debuf

Нажимаем F8, переходим на вкладку Watchpoints, выставляем значения, полученные из технической информации:

wp

Запускаем программу (F8), вываливаемся на нужном месте:

wpres

Способ третий. Таким же способом, как и ранее, попадаем в отладку, далее переходим к выставлению точек прерывания и указываем ABAP команду MESSAGE:

msg

Либо добавляем её через меню:

msg_menu

В данном случае можно будет указать еще и тип вызываемого сообщения:

msgmenu

Способ четвертый. Найти вхождение вызова оператора MESSAGE, используя программы сканирования исходного текста. Первое что нужно сделать определится через статус системы где мы находимся и в какой программе нужно искать (По меню Система -> Статус):

status

Далее открываем программу сканирования исходного текста (через SE38) RPR_ABAP_SOURCE_SCAN (либо использовать транзакцию CODE_SCANNER) и заполняем искомые данные:

scan

Результат:

scanres

Способ пятый. С помощью транзакции SAT можно проанализировать вызовы всех ABAP операторов в программе. Первым делом нужно создать вариант, в котором не будут объединяться измерения:

sat

Далее запускаем транзакцию SE38 через SAT с нашим вариантом:

satvar

После трассировки смотрим иерархию вызовов и ищем оператор MESSAGE:

satsearch

Результат:

satrestult

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

Способ шестой. Использовать транзакцию ST05. Порядок действий следующий:

  • Открыть две сессии в одной запустить ST05, во второй SE38 с неверным названием программы
  • Активируем трассировку
  • Запускаем программу в SE38
  • Деактивируем трассировку

Зная, что таблица с наименованиями программы называется PROGDIR, мы можем перейти в то место кода программы, где вызывается считывание данной таблицы. Предполагаем, что вызов сообщения о несуществующей программе будет где-то «рядом»:

st05

Как видим на рисунке, наше предположение было верным:

st05result

С оригиналом статьи можно ознакомиться тут.

1 комментарий

  1. Спасибо, интересные последние 3 способа.
    Все таки в САПе по-дурацки спроектированы эти сообщения: произошла ошибка (программа не найдена) а они выдают успешное сообщение msgty=’S’ — только чтобы не вывалиться из программы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *