Как отлаживать ABAP в трансформациях

Трансформации в SAP BW представляют собой сгенерированные системой программы. Вы, как разработчик, используете стрелочки, если необходимо передать данные без изменений, и пишите небольшие програмы (рутины) для преобразования данных при передаче их от инфопровайдера-источника к инфопровайдру-цели. При активации трансформации система создает программу (уникальную для данной системы) , в которой указана вся логика преобразований. В этой программе система автоматически пропишет все необходимые проверки, учтет разбиение данных по пакетам, сама сформирует типы данных и переменные, которые ей необходимы для работы, отдельно пропишет всю мета-информацию, чтобы вы могли далее импортировать трансформацию в другие системы и т.д. За основу система берет программу RSTRAN_MASTER_TMPL, и подставляет туда нужные значения, например указывает тип исходной таблицы (source_package) и тип целеавой таблицы (result_package). При вызове DTP (Data Transfer Process) произойдет вызов этой программы. SAP дает возможность разработчику внедрить свою логику при обработке информации, например, подготовить данные на входе, изменить данные в момент передачи, удалить лишнее у результата преобразований. Т.к. все это происходит в программе, вам, как разработчику, необходимо понимать, насколько корректно она работает, как она отреагирует на возможные ошибки, все ли случаи были вами учтены. Для отладки программ используется отладчик.

Практика.

Создадим простую трансформацию с небольшим ABAP кодом, и исправим данные для расчета таким образом, что при выполнении DTP у нас будет возникать ошибка.

В качестве примера возьмем следующую трансформацию:

В DSO PDSOL00 хранятся данные из таблицы SFLIGHT (информация о рейсах). В DSO PDSL001 хранятся данные о расписании рейсов. Каждая строка представляет конкретный рейс, поэтому при передаче данных из DSO PDSOL00 в куб DDCLF000 будем считывать дополнительную информацию из расписания этого рейса и обогащать этими данными куб.

Внешний вид трансформации:

Создайте Start Routine, нажав на кнопку:

Система позволяет вписать свой код в определенных местах (смотрите комментарий «insert your code here). Опишите тип таблицы g_ty_t_pdsol001 и обьявите таблицу на основании этого типа. В нее мы будем считывать данные о расписании (SPFLI). Этот раздел относится в секции PRIVATE класса, который будет вызываться в программе, информация, описанная в этой секции доступна всем методам класса (т.е. обратиться к таблице g_t_pdsol001 можно будет и в Start Routine, и в End Routine, и в любом из правил).

Блокированные части кода отмечены сеткой, это означает, что SAP запрещает расширение (изменение) созданной им программы в этом месте:

Опуститесь ниже и найдите метод Start-Routine. Напишите в нем простой селект для заполнения таблицы. Данный код далеко неоптимален и, кроме того, вызовет ошибку при определенном объеме данных.

Сохраните рутину и нажмите на кнопку 

Найдите в коде метод end_routine и место, где SAP разрешает дополнить программу. Впишите туда следующий код:

Данный код проходит по каждой записи, полученной целью (куб DDCLF000 Data Mart Flights — таблица SFLIGHT), берет поля CARRID (Airline Code) и CONNID (Connection Number), для них из обьявленной ранее временной таблицы (данные из таблицы SPFLI) получает все аналитики обогащает ими запись.

Сохраните End Routine и нажмите на активацию трансформацииПри активации SAP создал программу (из шаблона), вы можете посмотреть ее код, выбрав в меню:

Вы видите название программы

Ее даже можно посмотреть в транзакции SE38 (ABAP Editor), она имеет следующие составляющие:

Для создания ошибки — удалим часть данных в DSO PDSOL001, таким образом, при нашей трансформации наш код не сможет найти нужную запись и вызовет ошибку. Для выборочного удаления данных найдите DSO (1), нажмите правую кнопку мыши из контекстного меню выберите «Администрирование» (2). Выберите вкладку «Содержимое» (3) и нажмите «Выборочно» (4).

Нажмите на Deletion Selection, чтобы указать условия, по которым надо найди данные для удаления

Укажите Airline Code и Connection Number, который будем удалять, и нажмите на выполнение.

Вернитесь в программу трансформации, найдите ваши код в методах start_routine и end_routine, нажмите на пространство левее номера строк и система поставт точки прерывания в указанных вами местах. Выглядит это так:

Далее при выполнении DTP в режиме отладки система остановится на выбранном вами месте. Вернитесь в RSA1, найдите DTP от ДСО к кубу (1), выберите вкладку (2), укажите режим для отладки (3) и нажмите выполнить (4). Поставьте галку expert_mode.

Установите все три галки на второй вкладке — после обработки трансформации вы сможете посмотреть какие данные хранились во временных таблицах и увидеть какие они были, и какие они стали.

Запустите выполнение.

Непосредтвенно отладка.

Вы вызвали DTP — при этом система запустила сгенерированную программу, на вход программы она передала техническую информацию (кто запустил, когда, откуда и куда, какой номер запроса, какие данные передаются в текущем пакете и т.д.). Когда программа достигла точки прерывания, установленной вами — она остановилась и ждет далее авших действий. Появилось такое окно, рассмотрим интерфейс:


(1) — Сессия отладчика — вы можете отлаживать несколько программ одновременно
(2) — Шаги  — как программа должна повести себя дальше, требуется ли пропустить текущий метод или функцию или нужно вы хотите войти в каждую вложенную функцию
(3) — В какой программе мы сейчас находимся и некоторые системные переменные
(4) — 4 экрана, отображают ту же самую информацию, компонуяя по разному. Выберите себе любимый и настройке под себя, если требуется
(5) — От Structures до Data Explorer — вы можете просматривать все объекты и переменные в программе, доступные на данном щаге программы.
(6) — Код программы
(7) — Желтая стрелка — текущий курсор, место, на котором остановилась программа. Этот шаг программа еще не выполнила и ждет ваших указаний. Красным — установленная вами точка прерывания. Можно установить еще точки прерывания непосредственно во время выполнения отладки. Они сохранятся до закрытия сессии отладчика. Если хотите сохранить их — нажмите Ctrl + S.
(8) — Стек вызовов — кто какую программу вызвал до тех пор, пока вы не оказались на текущем месте
(9) — «Быстрое» окно переменных. Тоже самое, что в пункте (5), но все в одном месте.

Теперь подробнее:


 — перейти к следующей строке

— перешагнуть через текущую функцию (не входить внутрь)

— дойти до конца текущей функции не останавливаясь и выйти из нее

— продолжить выполнение всего кода без остановки

— изменить шаг (переключиться с построчного шага на блоки)

— установить на месте курсора точку прерывания

— установить точку наблюдения (программа остановится, когда достигнет указанного вами условия, а не конкретной строки в коде)

— изменить внешний вид экрана

 

(1) — название текущей программы, расширение, текущий метод или функция. Место, где мы находимся

(2) — текущая строка

(3) — две системные переменные, наиболее часто используемые. sy-subrc — показывает результат последнего действия (обычно 0 — нет ошибок, 1..9 — номер причины ошибки). sy-tabix — номер обрабатываемой строки (если код проходит по каждой строке таблицы — здесь будет указан номер текуще строки)

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

Таблица и ее содержимое отобразилось справа в экране переменных. Variable — имя переменной, Val. — Value — Значения. Сейчас там 0 строк, 16 столбцов.

Нажмите на , чтобы выполнить команду select.

Команда выполнилась, в переменную таблицу записалось 13 строк. Нажмите дважды на название переменной таблицы — и вы провалитесь на вкладку Tables. На ней хранятся все просмотренные вами таблицы и их текущее содержимое. Нажмите  чтобы позволить программе выполняться дальше до следующей точки прерывания либо до конца программы. Пройдитесь по программе и посмотрите, что хранится в переменных и как изменяются значения при каждом шаге.

 

Comments on Как отлаживать ABAP в трансформациях

  • Pavel

    А что делать, если нужно отладить трансформацию, которая работает как дельта, по определнному объекту недвижимости, если не знаешь в каком пакете он был загружен?

    • http://epotseluev.com evgeniy potseluev

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