Вы находитесь на странице: 1из 356

Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents

Москва, 26 октября 2017

Contents
ABAP: начало и происхождение ................................................................................................................. 5
ABAP начало и происхождение: введение................................................................................................ 5
ABAP basic syntax ......................................................................................................................................... 6
ABAP-Environment ......................................................................................................................................12
Процесс разработки приложения ........................................................................................................12
SAP Object Navigator ..............................................................................................................................13
Пространства имен (Namespace)..........................................................................................................18
Создаем начальные объекты: пакет и first read_abap report ............................................................18
Конструкции языка ................................................................................................................................38
Типы данных, структура sy (тип syst), присвоение переменных ...................................................38
Внутренние таблицы: INSERT / APPEND / MODIFY / DELETE / READ / LOOP...................................42
Процедуры: form и function ..............................................................................................................44
Конструкции для сравнения (IF / CASE) и циклы (LOOP / DO / WHILE) ..........................................50
Работа с таблицами базы данных ....................................................................................................52
Работа с экранами (ввод/вывод информации) ..............................................................................52
Конструкции ABAP OOP .....................................................................................................................54
ABAP Debugging ..........................................................................................................................................59
Запуск отладчика .......................................................................................................................................59
Прямой способ.......................................................................................................................................59
Через команду в поле для транзакции ................................................................................................60
Ключевые кнопки ..................................................................................................................................61
Точки останова...........................................................................................................................................63
Статические точки остановка ...............................................................................................................63
Динамически точки остановка .............................................................................................................67
Безусловные точки останова ............................................................................................................67
Условные точки останова..................................................................................................................69
Сохранение точек останова ......................................................................................................................80
Интерфейс отладчика................................................................................................................................82
Прикладные приемы и пояснения к отладчику .....................................................................................92
Отладка фоновых заданий ...................................................................................................................92
Отладка обновления / отладка системных программ .......................................................................94
Отладка системных программ .............................................................................................................95
Когда нельзя ставить точки останова ..................................................................................................97
Отладка окон (POPUP), когда нет поля для ввода транзакции .........................................................98

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Переключение между старым и новым отладчиком.........................................................................98


Отладка tRFC модулей ........................................................................................................................101
Причины, по которым точки останова могут не отработать ...........................................................104
Прием «SET PF-STATUS XXXX» (проверка кнопок в отладчике) .......................................................105
MODIFY SCREEN ....................................................................................................................................106
Обращение к таблице (!!! а не структуре) SCREEN ...........................................................................108
Отладка областей выполнения кода (Software Layer Aware Debugging) ........................................114
Отладка макросов ...............................................................................................................................128
Отладка трансформаций (call transformation) ..................................................................................133
ABAP programs: types and structure ........................................................................................................136
Структура логики обработки (processing logic)......................................................................................136
Вводная часть (Introductory) ...............................................................................................................136
Декларативная часть (Declaration) .....................................................................................................136
Блоки обработки (Processing Blocks) ..................................................................................................136
Блоки обработки в ABAP-программе .....................................................................................................137
Диалоговые модули ............................................................................................................................137
События (блоки события) (Event Blocks) ............................................................................................137
Конструктор программы .....................................................................................................................138
Событийные блоки на селекционных экранах .................................................................................138
Событийные блоки списка (list)..........................................................................................................138
Блоки событий для исполняемых программ (Reports - отчетов) ....................................................139
Процедуры ...........................................................................................................................................140
Функциональные модули ...................................................................................................................141
Методы .................................................................................................................................................142
Типы ABAP-программ и выполнение ABAP-программ .........................................................................143
Report (исполняемый отчет) ...............................................................................................................144
Пулы модулей (Module Pools) ............................................................................................................144
Пул классов (Class Pools) .....................................................................................................................145
Пул интерфейсов (Interface Pools) ......................................................................................................145
Пул подпрограмм ................................................................................................................................145
Группа функций ...................................................................................................................................145
Пулы типов (Type Pools) ......................................................................................................................145
Include-программы ..............................................................................................................................145
ABAP tools for analysis ..............................................................................................................................147
Просмотр статистики (STAD и ST03N).....................................................................................................147
Обращение к БД и определение таблиц (ST05) ....................................................................................155

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Транзакции SE30 / SAT: Runtime Analysis ...............................................................................................173


Транзакции ST12: Single transaction analysis..........................................................................................192
Транзакции ST22: Runtime errors............................................................................................................198
Транзакции S_MEMORY_INSPECTOR: анализ памяти ...........................................................................203
Расширенная проверка кода (SLIN)........................................................................................................205
Код инспектор (SCI – SAP Code Inspector) ..............................................................................................213
Сканнер кода ...........................................................................................................................................224
WHERE USED List – функция «где используется» ..................................................................................226
Поиск нот и расширений.........................................................................................................................229
Поиск нужных BAPI для постановки ТЗ и рекомендации по их работе и проверки ..........................231
Поиск полей через группу таблиц через ракурс DD03VT .....................................................................236
Поиск enhancement через таблицу ENHINCINX и ENHLOG ...................................................................239
Ускоренный поиск кода в приложениях ...............................................................................................240
Печатные формы .....................................................................................................................................240
Непосредственный вызов output .......................................................................................................240
Вызов формуляра – SAPSCRIPT ...........................................................................................................241
Вызов формуляра – SMARTFORMS .....................................................................................................250
PDF-формуляры ...................................................................................................................................257
Трассировка и тестирование PDF-формуляров.................................................................................261
Выгрузка в Excel .......................................................................................................................................263
ALV-отчет: типовая программа ...............................................................................................................264
Формирование IDOc: ключевые моменты ............................................................................................270
Batch Input: пакетный ввод .....................................................................................................................275
Клиентский код (Y|Z-код) .......................................................................................................................281
Анализ полномочий пользователя ........................................................................................................293
События и WF-события ...........................................................................................................................296
Сравнение версий программ .................................................................................................................299
MS office and SAP ERP: настройка OData и SmartyMail .........................................................................309
SAP shortcut и команда sapshcut ........................................................................................................309
Вызов RFC из Excel по чтению таблиц ................................................................................................316
Вызов WebService / Odata Service из Excel ........................................................................................327
На первом шаге убедимся, что в системе присутствуют нужные компоненты. ........................327
Следующим шагом – установка eclipse и дополнительных ABAP-надстроек. ...........................329
Также проверить активирован ли SAP NetWeaver Gateway ........................................................332
Активируем нужные сервисы через транзакцию SICF .................................................................335
Протестируем настройки с помощью транзакции SEGW.............................................................337

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Создадим webService/OData Service на чтение данных из таблицы...........................................342


Inbound mail – письма для обмена с SAP ERP ...................................................................................345
Uni file и универсальная транзакция и SmartyMail ...........................................................................349
Uni file ...............................................................................................................................................351

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

ABAP начало и происхождение: введение


ABAP –Advanced Business Application Programming. Язык программирования для бизнес-
приложений. ABAP был создан в 1973 г. Компанией SAP AG. Прототипом языка стал COBOL, над
которым работала Grace Hopper (человек, популяризовавший термин «debugging» и «IT-даВинчи»,
«прабабушка ABAP»).

Рассмотрение истории происхождения и развития ABAP поможет пониманию того, почему были
сделаны те или иные конструкции в языке, а также поможет понять коренное назначение этого
языка программирования.

ABAP – это язык 4го поколения, то есть с высоким уровнем абстракции.

Изначально ABAP предназначался для выгрузки списков (list) из база данных. При этом запись в
базу данных делалась с помощью средств, созданных на других языках (assembler).

язык COBOL, из которого ABAP унаследовал некоторые элементы, создавался как язык, на котором
можно было читать и писать "не на техническом языке", а на "человеческом языке". Этот подход
ABAP сохранил и теперь из технических имен функций видно (хотя бы иногда и даже в
большинстве случаев), какой объект системы планируется создаваться /просматриваться
/обновляться /удаляться.

На текущем этапе ABAP представляет собой объектно-ориентированный язык, позволяющий


работать с базой, обеспечивать операции ввода/вывода, работать с файловой системой сервера и
клиента, решать вопросы интеграции (работа с web-service).

В ABAP существует множество конструкций (более 500). Конструкции направлены на то, чтобы
создавать и изменять код быстро; и при этом не испортить программу.

Наиболее применимые мы рассмотрим, а по остальным – будет предоставлена ссылка с


описанием.

ABAP развивается компанией SAP AG.

Современная среда разработки для SAP NetWeaver (где ABAP занимает значительную часть) – это
мощный инструмент для разработки бизнес-приложений.

1GL Машинный язык (полностью зависим от оборудования)


2GL Ассемблеры (были привязаны к конкретному оборудованию, но уже был более
понятен для чтения)
3GL Высокоуровневые языки: предоставляют возможность абстрагирования от
оборудования. Уже не специфичны для конкретной машины/компьютера.
4GL Еще больший уровень абстракции от оборудования. Конструкции пишутся на
языке приближенном к человеческому. В случае ABAP-к английскому.
ABAP/4 <- и символ 4 значит именно это.
5GL Поколение языков, котором задачи решается на основе ограничений,
предоставленных программе, а не алгоритмах от программиста

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Clause: в настоящей главе мы рассмотрим базовые конструкции языка программирования ABAP,


которые помогут нам в дальнейшем разобраться с ABAP-кодом. По мере прохождения по мастер-
классу наш запас ABAP-конструкций будет увеличиваться. Однако все конструкции мы
рассмотреть не сможем, но сможем дать пояснения по работе со справочной информацией по
языку ABAP на help.sap.com и транзакции ABAPDOCU и других вспомогательных транзакций
внутри SAP ERP.

Для лучшего ознакомления с кодом лучше потренироваться в написании небольших (а можно


больших и сложных  ) программ. Для этого есть несколько возможностей:

1) можно использовать отдельные пакеты и запросы (которые не будут перенесены в


тестовую и продуктивную среду) для написания своих тренировочных ABAP-программ. Но
в этом случае понадобиться ключ разработчика и соответствующие права (можно
запросить у базиса/администраторов системы)
2) использовать Query (относительно новый редактор) и LSMW (старый «редактор 90х»). В
этих транзакциях также можно писать дополнительный код (и любой код,
обрабатывающий данные (экраны пытаться не стоит))
3) Использовать SAP NetWeaver Developer Edition, которую можно скачать и установить с
сайта https://www.sap.com/developer/trials-downloads.html (версия ABAP 750 в настоящий
момент (апрель 2017) доступна здесь https://tools.hana.ondemand.com/#abap ) там же –
описание компонентов.
Требования (мой опыт):
- 2 и более гигабайта оперативной памяти (хотя официально 1Гб достаточно);

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

- жесткий диск 500 Гб и более


- процессор уровня Intel Core i3 и более

При работе с SAP ERP подключение происходит под конкретным пользователем, языком (EN, RU,
DE, UK), мандантом (и иногда нужно вводить пароль).
Пользователь – это ID записи, по которой можно идентифицировать сотрудника/работника. 12
символов. Язык используется для пояснений к интерфейсу (специальные конструкции ABAP это
позволяют). Мандант – это логическая часть базы данных; в одной системе всегда несколько
мандатов (включая технические); иногда используют несколько мандантов для бизнес-данных. В
системе различают манданто-зависимые и независимые таблицы; с помощью манданта можно
разделить данные между частями базы данных.

При входе в систему мы видим «дерево» из транзакций. Для целей нашего курса нам
понадобиться особенно ветка – Tools / Инструменты (именно только эта ветка имеется в
NetWeaver Developer Edition).

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Для отображения технического имени транзакции перейдем по меню Extras -> Settings

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Чтобы посмотреть версию системы (а эта информация может быть полезна), переходим

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Надо сказать, что из меню была удалена транзакции SE83 (Reuse Library) для некоторых примеров
интерфейса, а также транзакция BIBS (Examples of User Interface Design).

А также полезную информацию мы можем достать из меню ABAP-объекта (например, при


просмотре программы из транзакции se38)

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Детально мы поясним эти вспомогательно-справочные инструменты чуть позже.

В этих инструментах можно найти программы по работе с базой данных, с внутренними таблица, с
элементами интерфейса, работы с файлам на Application и Presentation серверами, вызовами
Web-сервисов и вообще касательно всего, для чего разумно использовать ABAP.

Как мы видим, на SAP можно/нужно смотреть как на операционную систему нежели как на просто
серверное приложение.

ABAP-Environment
Процесс разработки приложения
Процесс разработки приложения в большинстве случаев состоит из этапов:

1) Изучение проблемы / постановка ТЗ;


2) Написание нужного кода и использование нужных объектов (к имеющимся объектам либо
создание новых либо использование старых объектов, но в новом подходе);
необходимо иметь ввиду, что пропорция между объектами и кодом может быть
различной в зависимости от типа разработки (объекты ABAP-словаря: индексы, таблицы,
структуры, средства поиска, блокировки, типы объектов; группы функций и т.д.)
3) Проверка и активация объектов разработки
4) Проведение изолированного тестирования (запуск ФМ на определенных данных, запуск
программы на предопределенных подготовленных данных, ручная выборка и
редактирование таблицы через специальный интерфейс и т.д.) (поиск и устранение
багов)
5) Перенос в систему тестирования (или качества) и проведение интеграционного
тестирования (поиск и устранение багов)
6) Перенос в продуктивную эксплуатацию (поддержка разработки, исправление багов, если
таковые есть)

Исходный код ABAP компилируется в промежуточный ABAP код, который компилируется


(подменяется в основной программе) в основную программу при исполнении в ABAP Runtime
Environment. Это так называемая децентрализованная сборка приложения, которая достигается
при помощи транспортной системы.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Исходный код (ABAP


Объекты)
ZCL_UTIL1->meth1
ZCL_UTIL2 (new class)

Исходный код ABAP Execution in Runtime ABAP


(ABAP Объекты) Компилятор Intermediate Language (IL) Ссылка Environment
ZREP1 / Compiler Промежуточный код ABAP
ZREP2

Исходный код (ABAP Объекты)


Function group (top)
Function Z_FUNCTION_UPD

SAP Object Navigator


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

Более того, мы можем перейти в MIME репозитарий и Информационную систему (Repository


Information System). В MIME-репозитарии мы можем хранить файлы (изображения, шаблоны),
которые потом будут использованы в разработках. А с помощью информационной системы мы
можем найти нужный нам объект.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Поиск программы DEMO* показан на рисунке ниже

С помощью подобного шага мы отобразим довольно внушительное количество примеров и


образцов, которые мы можем использовать в нашей практике или оценивать их.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Например, вот так может выглядеть использование конструкции UPDATE в программе


DEMO_UPDATE. Мы видим, что напрямую в UPDATE используются расчеты и динамические
условия.

С помощью транзакции SE93 мы можем выполнить поиск транзакции.

В дереве транзакции SE93 располагается здесь

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Для структуризации разработок и чтобы понять, какие объекты к чему относятся в ABAP-
Разработке (SAP-разработка) используется понятие пакета (Package). С помощью пакета
можно/нужно объединять объекты в системе, относящиеся к решению сходной задачи.
Например, для ALV создан пакет SALV. Также можно делать вышестоящие и подчиненные пакеты.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Или через транзакцию SE80

Рекомендую структурировать разработки используя пакеты. На моем опыте, в компании в каждом


модуле (даже в самом «динамичном») не более 2000 разработок. С помощью структурирования
можно добиться понятности и вычисления связанных объектов. Например, новую программу (ALV
отчет) по массовому обновлению FI-документов (текстов в FI-документах) можно положить в
субпакет FIXXX, который будет подчинен пакету FIDEV (Developments in FI), а вот разработку

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

передачи поля XBLNR из SD-документа фактуры в FI-документ можно положить в SDXXX, пакет
подчинить интеграционным разработкам сбыта ZSDFI.

Пространства имен (Namespace)


Даже в системе SAP NetWeaver на уровне предприятия обычно работают несколько
разработчиков и дорабатывают/создают программы разных модулей. Более того, в мире
существуют компании, которые зарезервировали (купили) для себя пространства имен и
развивают свои решения; кроме того, компания SAP также зарезервировала пространства имен
для своих решений (как общих, так и Industry Solutions – отраслевых решений). Обычно в при
старте проекта создают документ «Концепция разработок», в котором указаны какое
пространство имен использовать и для каких случаев. В случае «не писания», а чтения ABAP-кода
пространства имен будет также полезно знать для поиска объекта по определенной разработки
(пространство имен поможет сузить поиск и найти нужный объект быстрее).

По-хорошему (в том смысле, что не везде используются пространства имен как способ
структуризации) список пространства имен можно найти в транзакции SE03 (Transport Organizer
Tools): Administration -> Display/Change Namespaces.

Для наших целей изучения и понимания, как работает тот или иной оператор/констуркция будем
использовать пространство имени Z8M_1.

Создаем начальные объекты: пакет и first read_abap report


Создадим пакет как главный пакет Z8M (Read ABAP: training package)

1
Пространство имен выбрано таким способом, чтобы явно отделиться от любых других пространств.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Создадим также подчиненный пакет – Z8M1 для нашей программы тренинга

Структура пакетов будет выглядеть так

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Теперь создадим первую программу в рамках курса

После нажатия на кнопку создать

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

При попытке присвоить объекты пакету Z8M – система выдаст запрещающее сообщение, так как
главному пакеты объекты присвоить нельзя.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Мы присвоим программу пакету Z8M1 (Read ABAP: mk)

Текст основной программы


REPORT Z8M001_FIRST_REPORT MESSAGE-ID z8m.

INCLUDE Z8M001_FP_data if FOUND.

write: / 'Test'.
MESSAGE s002 with p_v1 p_v2 INTO gv_message.
"MESSAGE s002 with p_v1 conv char10( p_v2 ) INTO gv_message.
write: / gv_message.

MESSAGE s002 with p_v1 conv char10( p_v2 ) INTO gv_message.


CONDENSE gv_message.
write: / 'Condense message '(T01) , gv_message.

MESSAGE s002 with p_v1 conv char10( p_v2 ) INTO gv_message.


CONDENSE gv_message NO-GAPS.
write: / text-t02 , gv_message.
MESSAGE s002 with p_v1 conv char10( p_v2 ) .

Исходный код include Z8M001_FP_DATA


*&---------------------------------------------------------------------*
*& Include Z8M001_FP_DATA

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

*&---------------------------------------------------------------------*

data gv_message TYPE C LENGTH 100.

PARAMETERS: p_v1 TYPE C LENGTH 15


, p_v2 TYPE i
.

Поясним работу по каждому нужному блоку


REPORT Z8M001_FIRST_REPORT MESSAGE-ID z8m.
REPORT – Это обозначение программы.
После него – имя программы.
Есть еще подобная конструкций PROGRAM, но она менее функциональна.

MESSAGE ID – обозначение класса сообщений, которые будут использоваться.


Когда будет выражение в коде MESSAGE s002 , то система возьмет второе сообщение из
класса z8m.

Класс сообщений создаётся/изменяется в транзакции в SE91.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Переменными &1 &2 обозначаются параметры сообщений. Всего их может быть не более 4.

INCLUDE Z8M001_FP_data if FOUND.


Этот включает исходный код INCLUDE программы в нашу основную программу.
Include программа это не исполняемая программа.
При компилировании ее код «распространяется» в вышестоящую программу.

SAP рекомендует использовать include для одной программы, а не для нескольких.


Подробности в справке.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Z8M001_FP_DATA
data gv_message TYPE C LENGTH 100.
Определение переменной в памяти. Символьная переменная длинной 100 знаков, глобальная.
Z8M001_FP_DATA
PARAMETERS: p_v1 TYPE C LENGTH 15
, p_v2 TYPE i
.
Определение параметров ввода на экране.
Line6: MESSAGE s002 with p_v1 p_v2 INTO gv_message.
Конструкция выводит сообщение не на экран (в панель – статусную панель – shared status bar), а
в переменную.
Line8: write: / gv_message.
Вывод сообщения в list на экран. Быстрый и экономичный (по ресурсам) способ вывести
информацию на основной экран.
CONDENSE gv_message.
Убираем лишние пробелы из текстовой переменной.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

CONDENSE gv_message NO-GAPS.


Убираем все пробелы из текстовой переменной.

MESSAGE s002 with p_v1 conv char10( p_v2 ) .


Вывод сообщения в статусную панель.

write: / 'Condense message '(T01) , gv_message.


Текстовые переменные

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Текстовые переменные нужны для перевода интерфейса на другой язык. Если пользователь
зайдет на английском, то он увидит текстовые переменные так, как мы указали (так как мы
указывали на английском).
Но если пользователь зайдет на другом языке, то система будет брать текстовые переменные
из соответствующего языка

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Selection text – пояснения к параметрам

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Кнопка ведения документации – почти автоматически создается.


И весьма полезная кнопка 

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Видим, что доступно довольно много стилей и предзаготовленных частей для запуска
справочной информации к программе.
Сохраняем и активируем документ и запускаем снова программу.
На первом экране мы увидим кнопку Info

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Как видно сделать программу на ABAP со справочной информацией – это действительно


несложно. Теперь пройдемся по интерфейсу работы с программой и с отладчиком.

F8 (Запустить) - Запускаем отчет на выполнение

Ctrl+F3 (Активация)
Активация / генерация текущего отчета.
Создание текущей версии в качестве активной.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

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

Отладчик: точка останова. С помощью точек мы можем остановить программу в течение


выполнения и детально проанализировать ее на конкретном шаге

При запуске программа остановится в указанной точке

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В отладчике мы можем посмотреть переменные (а при наличии соответствующих полномочий


и изменять).

И 4 важные кнопки (выделены в верхней части экрана); пояснение слева направо

«Горячие клавиши» на клавиатуре расположены в той же последовательности: F5->F6->F7->F8

Single step button (F5): при нажатии на кнопку программа делает движение на один шаг вперед
(одну строчку кода); если встречается на пути кодовый объект (метод, подпрограмма, функция),
то программа входит в него.

Execute (F6): выполняет строчку кода как единый шаг (даже если в нем есть кодовый объект).

Return(F7): выполняет весь имеющийся кодовый объект и останавливается в вышестоящем


кодовом объекте по стэку вызовов.

Return(F8): выполняет всю программу до конца

И еще несколько полезных употребимых функций

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Continue to Cursor (Shift + F8): если мы поставим курсор в любом строчке программы (ниже
текущей), то система выполнит весь код до курсора и остановится в строчке кода, где стоит
курсор.

Goto statement (Shift + F12):


Эта команда позволяет переходить практически в любую строчку кода (ограничения есть, но о
них позже), как «вверх» по программе, так и «вниз».

Restart – возвращает в начало программы (без выхода из приложения полностью).

Exit (close application) – выход и закрытие приложения.

Exit (Application continues running) – выход из отладчика и продолжение выполнения


приложения (по сравнению с F8 – экономит окно SAP Logon).
Layout – позволяет сохранить набор переменных и вкладку для отображения.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Теперь создадим транзакцию

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Присвоим транзакцию пакету и положим в запрос – после этого можно запускать транзакцию.

В разделе «Структура ABAP-программы» мы рассмотрим более детально типы программ и


транзакций.

Транзакцию мы можем также присвоить в меню через транзакцию SE43.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Качестве источников знаний по работе операторов у нас могут быть:

1) Транзакция ABAPDOCU (справка по документации к ABAP);


2) Справка на help.sap.com

https://help.sap.com/doc/saphelp_nw74/7.4.16/en-
US/43/55509bf8a75f6be10000000a1553f6/frameset.htm

3) Sap notes:

https://support.sap.com/en/index.html

4) Книги SAP-PRESS, статьи sdn.sap.com / sapland.ru . Мастер-классы 

https://www.sap.com/community/topic/abap.html

Конструкции языка
В ABAP существует множество конструкций для целей быстрого написания стабильного кода. Мы
рассмотрим те, которые нам пригодятся для дальнейшего анализа.

Типы данных, структура sy (тип syst), присвоение переменных


Для пояснения сделаем программу Z8M001_BASIC_TYPE.

В подпрограмме show_sys_info показана работа с системными переменными структуры sy (тип


syst). Работы с простым выводом и оператором WRITE. Дадим несколько комментариев к
программе.
get TIME. " обновление полей даты и времени
Выполняет обновление поле sy-uzeit и прочих.

PARAMETERS: r1 RADIOBUTTON GROUP rg1 DEFAULT 'X'


, r2 RADIOBUTTON GROUP rg1
, r3 RADIOBUTTON GROUP rg1
.
Задается группа radiobutton (Альтернативный ввод).

AT LINE-SELECTION.
PERFORM get_user_com.
Реакция на двойной клик пользователя (в старом выводе).

GET TIME STAMP FIELD g_timestamp.


Получаем текущую метку времени (длинную метку так как тип данных указали timestampl)

write:
Вывод через двоеточие , чтобы не повторять write несколько раз и объединить в логический
блок несколько строк кода.
, / 'Системная дата: '(T11) , 30 sy-datum INVERSE
/ <- равносильно оператору SKIP, открывает новую строку
(T11) <- обозначает текстовую переменную в программе
, (запятая) обозначает просто последовательный вызов после двоеточия.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Так называемый «chained statement».


Sy-datum – системная переменная
Inverse – format_options для оператора write; работает при доп.операторе COLOR; либо
устанавливает цвет текста (foreground color) либо цвет фона для текста (background color).

perFORM sys_info_dyn.
В этой подпрограмме показан вывод информации через динамику.

data c_g_syst TYPE tabname VALUE 'SYST'.


Определяем константу, неизменяемые данные в течение программы.
Константы могут ссылаться на встроенные типы данных и типы данных словаря.

FIELD-SYMBOLS <fs_f> TYPE any.


Определение данных, используемых для доступа к другой переменное или объекты через
ссылку. Отличие от переменной в том, что это ссылка на область памяти; то есть меняя field-
symbol мы меняем и значение того объекта, на которой мы сослались.

, / 'Пользователь: '(T19) , 30 CL_ABAP_SYST=>get_user_name( ) INVERSE on COL


OR 5
ABAP guidline не рекомендует использовать sy- для некоторых переменных, а рекомендует
класс CL_ABAP_SYST

, / 'Program Name: '(T26) , 30 sy-repid


Поля sy-repid нет в структуре SY, но оно может использоваться.
Поле убрали при очередной модернизации системы, но использовать его можно.
OSS#367676 Release upgrade from 4.6 to 6.10 for customer progs.
Заметим, что имя переменной не более 30 символов (а вообще, чем лаконичнее – тем лучше  ).
Мы познакомились с простейшим вводом и выводом данных (PARAMETERS / WRITE), обозначение
данных в памяти: DATA, CONSTANTS, PARAMETERS, FIELD-SYMBOLS, а также со структурой syst.
Также мы применили List Headers (заголовок программы), SelectionTexts(текст для выборки),
TextSymbols (текстовые переменные). Детальнее о структуре sy-syst написано в упомянутых
источниках (а именно в справке)

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В ABAP имеются базовые типы данных. Рассмотрим их.

Важная информация описана в ABAP-справке ABAP – Reference-> Predefined Types, Data Objects,
Functions, and Constructors -> Predefined Data Types -> Predefined ABAP Types.

http://help-legacy.sap.com/abapdocu_750/en/abenbuiltin_types_numeric.htm

Тип данных
C Character Символьные переменные
Длина от 1 до 65535 символов. При определении данных указывается длина.
Можно сказать, что это небольшой текст.
data g_char30 type c length 30.
N Numeric Text
Длина от 1 до 65535 символов. При определении данных указывается длина.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Используется, когда необходимо работать с числами в качестве текста (то есть числа
используются не для вычисления, а для обозначения/нумерования чего-либо). Например,
номер счета, банковский счет, код балансовой единицы.
p_ano(10) TYPE n
I Integer Целое число
Целое число. Быстро обрабатывается, так как поддерживается процессором напрямую.
Диапазон от +/- 2,147,483,647
f Floating number Число с плавающей точкой
Для точности вычислений. Также поддерживаются CPU. Не только для промежуточных
расчетов, но и для дальнейшего хранения и последующих расчетов.

P Packed Number Дробное число (число с десятичной точкой)


Число с десятичной точкой; используется для бизнес данных (длина, вес, стоимость).
Медленно обрабатывается процессором из-за промежуточного преобразования.
Можно указать до 16 знаков после запятой. Общая длина – 31 символ (а также знак числа).
p_tax TYPE p DECIMALS 2

D Date Дата
YYYYMMDD <- внутренний формат – 8 символов.
С датой можно производиться вычисления.
20170430 + 1 = 20170501 в типе данных d.
То есть если мы прибавим к 30 апреля 2017 1 день, то получим 1мая 2017.

T Time Время
ЧЧММСС – внутренний формат 6 символов.
С типом данных время также можно производить вычисления.

x Byte
(Hexadecimal)
Предназначен для небольших файлов.

String Строка Символьная строка


Используется для больших строковых данных (до 2 Гб) (размер определяется параметром в
настройках).

Xstring Byte Sequence Битовая последовательность


Используется для больших бинарных данных.
Предназначается для файлов с неизвестным содержанием и не предопределённой длиной.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В ABAP можно выделить статичные переменные и ссылочные переменные. Статичные


переменные создаются с помощью слова TYPE и значение может быть установлено с помощью
слова VALUE. Ссылочные переменные объявляются конструкцией CREATE DATA (можно назвать
еще динамические данные); также используется конструкция GET REFERENCE OF, а объявляются
TYPE REF TO. Для статичных переменных память резервируется сразу, а для ссылочных только
тогда, когда начинается их использование. До релиза 6.10 к ссылочным переменным можно было
обратиться только через field-symbol, а после 6.10 можно через оператор ->*, например lv_ref->*.

Рассмотрим пример программы (radiobutton R03).

Для объявления переменной мы используем


l_rda_monthly_interest_factor TYPE REF TO f

а затем создаем
CREATE DATA l_rda_monthly_interest_factor.
ASSIGN l_rda_monthly_interest_factor->* TO
<l_monthly_interest_factor>.

В отладчике видно в разделе MEMORY ANALYSIS, что память распределяется только в момент
создания объекта

Внутренние таблицы: INSERT / APPEND / MODIFY / DELETE / READ / LOOP


Важным объектом всего ABAP являются внутренние таблицы, а для нас важно знать, как они могут
обрабатываться. Внутренние таблицы хранят данные во внутренней памяти в виде специального
массива (коим они и являются).

Рассмотрим пример работы с внутренними таблицами.

Внутренние таблицы бывают трех видов:

1) Стандартные (объявляются standard table)

Массив данных, которым можно управлять через номер записи. Могут быть вставлены не
уникальные записи. Все команды: insert, modify, read, delete, append, loop применимы (кроме

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

collect, так как не рекомендуется).

2) Сортированные (sorted)

В дополнение: используется табличный ключ состоящий из одного или нескольких столбцов. Все
команды: insert, modify, read, delete, collect, loop применимы (append применять не нужно).

3) Хэшированные (HASHED table)

В хэш-таблицах для доступа к записи применяется особый hash-алгоритм. Время доступа к


таблицы практически не зависит от размера таблицы.

В таблице перечислим конструкции, которые нам могут пригодиться.

INSERT Вставка записей в нужную позиции


внутренней таблицы
APPEND Вставка записей в конец внутренней
таблицы
COLLECT Вставка записей с расчетом числовых Для сортированных –
полей. Вставка записей происходит по используется ключ;
ключевым полям: если запись по Для хэш-таблиц – хэш по
ключевым полям уже имеется в таблице, алгоритму.
то происходит обновление записи Для стандартных – не
(суммирование числовых значений), если рекомендуется использовать.
же записи нет – то добавляется.
READ TABLE Чтение записи из таблицы по ключу или
по значению.
LOOP at itab Цикл по указанным записям в таблице.
MODIFY Изменение записей в таблице. С помощью TRANSPORTING
можно изменить не всю часть
таблицы, а несколько полей.
DELETE Удаление С помощью DUPLICATES
можно удалить именно
дубликаты.
SORT Сортировка STABLE – стабильная
сортировка.
FIND in TABLE Поиск (быстрее чем LOOP)
REPLACE in TABLE Поиск с заменой.
PROVIDE Объединение внутренних таблиц (interval
join)
MOVE- Перенос из одной структуры значений Экономит строчки кода. Но не
CORRESPONDING полей в поля с одинаковыми именами производительность (немного
медленнее простого
присвоения через = ).

Для наших целей информации будет достаточно. Для подробностей – идем в справку

ABAP – Reference-> Processing Internal Data -> Internal Tables -> Processing Statements for Internal
Tables.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Или по ссылке

http://help-legacy.sap.com/abapdocu_750/en/abenabap.htm

Processing statements:

http://help-legacy.sap.com/abapdocu_750/en/abentable_processing_statements.htm

Процедуры: form и function


Понятная программа (что делает ее хорошей):
1) структурирована, разделена на логические блоки, каждый из которых выполняет свою задачу;
2) не допускает дублирования кода, а делает вызов существующего кода (для понижения
избыточности).

Для этих целей могут использоваться подпрограммы (они устарели, но в уже существующих
модулях используются: FI/SD/MM/PS/QM, поэтому нам нужно их иметь ввиду), группы функций и
ABAP OOP (поговорим отдельно).

Для пояснения используем программу Z8M001_BASIC_TYPE.

Подпрограммы - FORMS
Код заключается между выражений
FORM name11.
Endform.
Подпрограммы устарели и не предполагается их использование для новых программ. Но для
исследования и поддержки старых программ – их нужно иметь ввиду.
Мы можем использовать параметры для вызова подпрограмм:
Tables <- подаем таблицы

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Using <- параметр


Changing <- изменяемый параметр

Также показан пример с переменной STATICS. (статичная переменная).


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

FUNCTIONS – функциональные модули


Используются для вызова из любых программ. Могут также содержать параметры
экспорта/импорта и Exceptions.

Функциональные модули создаются в рамках группы функций.

Группа функций содержит TOP-include

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

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

При указании интерфейса (то есть тех параметров, которые могут передаваться) нужно иметь
ввиду что передавать мы можем по значению и по ссылке. По ссылке вызов делается по
умолчанию и он быстрее, чем по значению (и использует меньше памяти); работа происходит со
значением переменной. При передаче значения работа происходит с копией переменной.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Вызов ФМ может выглядеть так

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Тестировать ФМ можно отдельно в транзакции SE37, более того можно сохранять параметры
прямо из программы.

Тогда в se37

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Подробнее о вызовах и функциях.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Конструкции для сравнения (IF / CASE) и циклы (LOOP / DO / WHILE)


С помощью IF можно сравнить числовые и строковые переменные. В таблице перечислим
операторы с помощью которых можно проводить сравнение.

ABAP справка по этим операторам находится здесь

ABAP – Reference-> Program Flow Logic -> Expressions and Functions for Conditions -> log_exp -
Logical Expressions -> rel_exp - Comparison Expressions -> rel_exp - Relational Operators

http://help-legacy.sap.com/abapdocu_750/en/abenlogexp_op.htm

В программе Z8M001_BASIC_TYPE пример находится под R06.

EQ, = Проверка равенства


NE, <> Проверка неравенства
LT, < Less Than (строго меньше)
GT, > Greater Than (строго меньше)
LE, <= Less Equal, (меньше либо равно)
GE, >= Great Equal, (больше либо равно)

CO Contains Only
Истина, если в левом выражении содержатся ТОЛЬКО значения из правого.
CN Истина, если в левом выражении содержатся НЕ ТОЛЬКО значения из
правого.
CA Истина, если в левом выражении есть любой из правого выражения.
NA Истина, если в левом выражении нет никакого из правого выражения.
CS Истина, если второе выражение полностью содержится в первом.
NS Истина, если CS ложно.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

CP Истина, если в первом выражении содержится модель из второго.


‘BAUMAN_UNIVERSITY’ CP ‘BA*UN+VER*’
* - заменяет любое количество символов
+ - заменяет один символ
NP Истина, если CP ложно.

COND
SWITCH

IS ASSIGNED Присвоенный field symbol


IS BOUND Ссылочная переменная имеет присвоение
IS INITIAL Начальное значение.
Начальное значение для даты ‘00000000’, а не пусто.
SUPPLIED Входной параметр заполен.

IF … ELSE … ENDIF. Условный оператор. Может быть использован со всеми типами данных.
CASE … Быстрое и простое определение равенства/неравенства
WHEN …
when Others.

ENDCASE

LOOP Цикл по внутренней таблице; может быть с условием или без него.
DO … ENDDO. Безусловные цикл (не по таблице)
WHILE Условный цикл. Используется часто для потоков (streaming, например
чтение/парсинг xml –файла)

Тонкости использования описаны в справке. Нам нужно знать, как он работает.

Пример уже был при динамическом чтении:

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Работа с таблицами базы данных


Создадим таблицу ztz8m_mails, ZTHSTBACK, а также структуру ZSZ8M1_ALV (в ней покажем работу
с элементами данных и доменами).

С таблицами можно работать при помощи операторов, указанных в таблице

Оператор Пояснение
SELECT Чтение данных и таблицы

SELECT * from
ZTHSTBACK

INSERT Вставка данных в таблицу БД


UPDATE Обновление данных в таблице (можно обновить конкретное
поле)
MODIFY Либо вставка, либо обновление данных в таблице.
Система пытается вставить запись в таблицу, но если запись
существует, то система обновляет запись.
DELETE Удаление записи из таблицы.

Рассмотрим пример по обновлению данных списка рассылки в программе по обновлению данных


по заказу на поставку.

В транзакции Z8M1_ALV_PO - Mass delivery completion for PurOrds нажмем кнопку.

При работе с обновлением таблиц необходимо иметь ввиду SAP LUW (SAP Logical Unit of Work),
который обеспечивает транзакционность данных (то есть либо все обновляется, либо ничего).

Рассмотрим предварительный пример с SAP LUW.

А детальнее его разберем в части «Структура программы».

Программа RSM13000, подпрограммы:


Модули обновления помещаются в таблицу VBHDR.

Работа с экранами (ввод/вывод информации)


При работе с экраном важно иметь ввиду следующие команды.

Команды Пояснение

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

PROCESS Определяет один из 4х событий в экране, с помощью которых можно


обратиться к логике работы в программе.

PROCESS BEFORE OUTPUT


[перед тем, как экран отобразился]

PROCESS AFTER INPUT


[после того, как какое-то действие произведено пользователем]

PROCESS ON HELP-REQUEST
[по запросу справки F1]

PROCESS VALUE-REQUEST
[вызов средства поиска, например, по F4]

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


ABAP-логикой в программе.

Module mod1.

FIELD Проверка, относящаяся к полю.

FIELD f [module1]
CHAIN … Объедение нескольких полей для совместной проверки.
ENDCHAIN В таблице используется – показать пример.
LOOP … Обработка таблиц (элемент table control)
ENDLOOP
CALL SUBSCREEN Вызов подэкрана (из текущей или внешней программы).
Используется, например, для табулированных экранов (когда несколько
вкладок)
CALL SCREEN Вызов экрана
SET SCREEN Установка вызова следующего экрана.
SET PF-STATUS Установка GUI статуса для экрана (набора кнопок и допустимых функций)
GET PF-STATUS Получение имени GUI статуса, может использоваться для последующих
проверок

Сходно с переменной sy-pfkey.

SET TITLEBAR Установка заголовка экрана.


Показать пример.
LOOP AT SCREEN Последовательная обработка элементов массива SCREEN
MODIFY SCREEN
SET CURSOR Установка курсора на элементе экрана
GET CURSOR Получение элемента экрана, на котором установлен курсор.
CONTROLS Объявление элемента table control

REFRESH Обновление данных на экране, чтобы актуализировать внутреннюю память


CONTROL и представление на экране.

LEAVE SCREEN Окончание текущего экрана и вызов следующего.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В LEAVE SCREEN можно указать какой именно будет следующим.


LEAVE TO SCREEN XXXX.

SELECTION
SCREEN
SET HOLD DATA Установка значения в памяти поьзоватя
Set hold data on.
Или наоборот отключение
Set hold data off.

SUPPRESS Используется в PAI, чтобы отключить представление (показ) экрана, а сразу


DIALOG перейти

Рассмотрим пример на обновлении почтовых данных.

Функциональный модуль Z_Z8M1_EMAIL_MAINTAIN, привязанный к кнопке на selection screen

Конструкции ABAP OOP

Объектная ориентация

Объектная ориентация (или, более правильно, объектно-ориентированное


программирование) представляет собой решение проблем с помощью представления
объектов реального мира через программные объекты.

Object-oriented programming is based on a ООП (объектно-ориентированное


progamming model in which data and программирование) основано на подзоде
functions are unified in objects. The при котором программная модель
remaining language scope of ABAP mainly объединяет данные и функции в объекты.
supports procedural programming, where the
data is stored at other places than the objects
and where programs that are modularized by
procedures access this data.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

This document defines a few general terms В настоящем документе описаны


that are widely used in object orientation and некоторые термины, используемые в
in ABAP Objects объектно-ориентированным
программировании и в ABAP Objects
(ABAP ООП).

Objects Объекты

Objects represent abstract or concrete objects Объекты представляют собой абстрактные


of the real world. An object is a section of или конкретные объекты реального мира.
program code that has data (called attributes) Объект - это набор программный кода, в
and provides services called methods котором есть данные (называемые
(sometimes also known as operations or атрибутами) и которой представляет
functions). Methods typically work with возможности работы с ним (сервисы)
private data in the object (attributes, also называемые методами (иногда также
known as the object state), that are only называют операциями или функциями).
visible within the object. This guarantees the
internal consistency of the object, since the
data is only changed by the methods, not by
the user. This ensures that the object is
consistent in itself.

Classes Классы

Classes are program code that describes Классы представляют собой программный
objects. Technically, an object is an instance код, который описывает объекты.
of a class. In theory, you can create an Технически, объект представляют собой
infinite number of objects from a single class инстанцию класса. Теоретически, Вы
definition. Each instance of a class (object) можете создать неограниченное
has its own values for its attributes. количество объектов из определения
одного класса. Каждая инстанция класса
(объект) обладает своими значениями
атрибутов.

Object References Ссылка на объекты

In a program, you identify and address В программе, Вы определяете и


objects using a unique object reference. They ссылаетесь на объект используя
allow you to access the attributes and уникальную ссылку на объект. Ссылка на
methods of an object. объект позволяет Вам иметь доступ к
атрибутам и методам объекта.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

In object-oriented programming, objects usually have the following characteristics:

Encapsulation

Objects restrict the external visibility of their resources (attributes and methods). Each object has
an interface that determines how other objects or applications can use it. The implementation of
the object is encapsulated (not visible outside the class).

Public visibility section

All components declared in the public visibility section defined with PUBLIC SECTION are accessible to all
users as well as in the methods of all inheritors and the class itself. The public components of the class
form the interface between the class and its users.

Protected visibility section

All components declared in the protected visibility section defined with PROTECTED SECTION are
accessible in the methods of all inheritors and in the class itself. Protected components form a special
interface between a class and its subclasses.

Private visibility section

All components declared in the private visibility section defined with PRIVATE SECTION are only
accessible in the class itself, and are also not visible to the inheritors. The private components therefore
do not form an interface to the users of the class.

The following table summarizes the visibilities of a class:

PUBLIC PROTECTED PRIVATE


Visible for
SECTION SECTION SECTION
Same class and its
X X X
friends
Any subclasses X X -
Any repository objects X - -

В таблице ниже обобщает информацию по видимости в классах


PUBLIC PRIVATE
Видно/Доступно для PROTECTED SECTION
SECTION SECTION
Этому классу и друзьям X X X
Любому под-классу X X -
Любому объекту в
X - -
репозитарии

Polymorphism

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Methods with the same name can behave differently in different classes. In object-oriented
programming, you can use interfaces to address methods with the same name in different
objects. The form of address always remains the same, but the actual method implementation is
class-specific, and can be different in each class.

Inheritance

You can derive a class from another class. A derived class (subclass) inherits the data and
methods of its superclass. You can add new methods to a subclass, or redefine existing methods.
Redefined methods have the same name and interface as the original method. Their classes are
therefore polymorphous, too.

Benefits of Object Orientation

Object orientation has the following advantages:

 Complex software systems become easier to understand, since an object-oriented


architecture resembles reality more closely than other programming techniques.

 Changes in object-oriented systems should be possible locally (at class level), without
further changes being necessary in other parts of the system. This reduces the amount of
maintenance required.

 Polymorphism and inheritance enable many individual components to be reused.

 Object-oriented systems require fewer revisions and less maintenance, because the
majority of problems can be discovered and corrected in the design and development
phases.

Achieving these goals requires:

 Object-oriented programming languages


Object-oriented programming techniques do not necessarily require object-oriented
programming languages. However, they do depend on the implementation of object-oriented
constructions in the system kernel.

 Object-oriented tools

Object-oriented tools help you create object-oriented programs in object-oriented languages.


They allow you to store and visualize your program objects and the relationship between them.

 Object-oriented modeling

Object-oriented modeling of a software system is the most important, most time consuming, and
most difficult task required to achieve the above goals. Object-oriented design encompasses
more than just object-oriented programming, and offers logical advantages that are independent
of the eventual implementation.

Инкапсуляция, наследование и полиморфизм.

Инкапсуляция: методы с разной областью видимостью. Private, Protected, Public.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Пример программы по Обновлению данных заказа на поставку.

Конструкция Пояснение
Create Object Создается объект со ссылкой на тип.

Method constructor При создании объекта вызывается этот метод.


Здесь могут происходить начальные выборки

Показать создание экземпляра объекта (модели (model) и вид (view)) в контроллере


ZCL_Z8M1_CONTR001.

А также наследование и полиморфизм в программе Z8M001_PO_UPD_BCGRND.

Пояснить на примере отличие private, protected и public. (поменять видимость и попытаться


перегенирить программу – пояснить, почему ошибки).

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Отладчик / Debugger – это инструмент, позволяющий пошагово посмотреть логику работы


приложения. С помощью этого инструмента мы можем увидеть почему в определенном месте
программа выполняется именно так, как выполняется. Отладчик не является 100%-источником с
ответами на все вопросы, но может помочь разобраться в определенных ситуациях. В отладчике
есть опции, которые позволят быстрее найти то или иное место программы.

Применительно к современному ABAP-отладчику (New ABAP Debugger) (не тот, которые в Eclipse, а
тот которые в SAP GUI), то он представляет собой большой набор инструментов, позволяющих
анализировать ABAP-код. В этом разделе мы пройдемся по этим инструментам на примере
программ, написанных в первой части. Мы будем рассматривать новый ABAP отладчик.

Касательно слова New (по ходу дела его постепенно преобразовывают в слово standard)

https://help.sap.com/saphelp_nw75/helpdata/en/49/217b366f7314d0e10000000a42189b/content.ht
m

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

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Через команду в поле для транзакции


Для запуска отладчика в режиме онлайн можно ввести команду /h в поле для ввода транзакции.

/h -
/hs – системный запуск отладчика
/

Нажмем галку (ENTER), запустим программу – система откроет режим отладчика. Для старого
отладчика будет открыто то же самое окно, а для нового – откроется еще одно окно.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Ключевые кнопки
Ключевые кнопки отладчика – это F5 / F6 / F7 / F8 (специально удобно расположены на
клавиатуре). Кнопки расположены в верхней части экрана

Кнопка Пояснение
F5 Шаг вперед (на минимальный шаг). Если будет перед конструкцией, то зайдет в
конструкциию.
F6 Шаг вперед при этом строка кода (даже если в ней был вызов подблока кода)
F7 Выход из блока кода к предыдущему
F8 Выполнение программы до конца.
Shift + F8 Выполнить до курсора
Shift + F12 Перейти к курсору

Рассмотрим примеры.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

При нажатии F5 – зайдем в под программу; а при нажатии F6 останемся в подпрограмме main.

При нажатии F7 останемся в подпрограмме main. При нажатии F8 – программа будет выполнена
до конца.

На рисунке выше мы видим стэк вызовов, то есть то, откуда вызывался определенный блок кода.

Мы можем переходить по блокам кода двойным щелчком по записи стэка

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

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

Точки останова
Статические точки остановка
(точки останова, указанные в коде с помощью операторов)

Статические точки останова можно поставить несколькими способами.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Оператор
BREAK-POINT
С помощью этого оператора программа всегда и для всех пользователей будет останавливаться в
онлайн режиме.
Это быстрый способ поставить точку остановка для того, чтобы сделать какие-нибудь аналитические
работы. Используется для разработки в основном.

Оператор
BREAK USER_NAME.
С помощью этого оператор точка останова ставится только для пользователя USER_NAME.
Тогда программа остановится только для конкретного пользователя.

Оператора
BREAK-POINT ID Z8M001_BREAK1.
В транзакции SAAB можно создавать CHECKPOINT group.
И активировать их в нужных случаях.
О чекпойнтах мы поговорим позднее. Сейчас отметим, что по сути мы можем включить точки
останова для пользователя и всей системы.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В стандарте можно посмотреть на программу DEMO_CHECKPOINTS

С помощью бесконечного цикла.

Это можно сделать разными способами


cl_bcs_breakloop=>execute_loop( 'Z8M001_BASIC' ).

А с помощью метода DISPLAY мы можем создать точку (ID), которая будет обеспечивать бесконечный
цикл

Бесконечный цикл еще можно установить с помощью ФМ C160_HOLD_FOR_DEBUG.


Но у пользователя, для которого устанавливается цикл должен быть параметра ESN.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

После того, как будет создан бесконечный цикл, мы можем увидеть наш процесс в транзакции SM66

И в стэке вызовов мы видим нашу программу

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Этот способ позволяет отладить сложные случаи: такие как RFC вызовы, запуск фоновых заданий,
обработка входящей почты (это было одним из первых стандартных применений класса).

Класс: CL_SMTP_EXT_SAPCONNECT

Динамически точки остановка (точки останова, поставленные на время выполнения


программы в редакторе)

Безусловные точки останова


Динамические точки останова создаются в течение выполнения программы или мы их можем
установить динамически из ABAP-редактора.

В тексте программы поставим точку слева от строки кода

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Тогда при запуске программа остановится в этом месте (если код пройдет через это место (!!!)).

Динамические точки остановка бывают внешними (external break point) и сессионными (session
breakpoint). Сессионные расставляются в рамках конкретной сессии и пользователя – после
выхода из системы они недоступны; внешние точки позволяют отлаживать RFC / WEB-вызовы
(покажем на OData вызове) и другие интеграционные вызовы.

Допустим, у нас есть Gateway-service. Транзакция SEGW. Идем в нужную нам реализацию сервиса

И ставим там точку внешнюю точку, тогда при запуске из Excel (например, из excel) (для
эксперимента поставим две точки – сначала session, а чуть ниже external и убедимся, что external
сработала, а session нет).

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Session breakpoints могут устанавливаться не только явно на конкретной строчке кода, но и через
условие.

Условные точки останова


Для безусловных breakpoint можно «навешивать» условия

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Тогда точка будет срабатывать, когда выполняется условие

Установка break point на STATEMENT

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Под statement нужно понимать не только ABAP-конструкцию, но и все то, что предлагает на выбор
средство поиска.

Под statement следует понимать ABAP-выражения и дополнительные групповые выражения

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

После добавления точки останова она появится на вкладке Breakpoitns / Watchpoints

Когда выйдем из программы назад, то сработает наша точка, так как мы поставили точку на
выражении loop at screen

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Если же мы знаем конкретный класс/метод, функциональный модуль, подпрограмму, сообщение,


где нужно выполнить остановку программы, то можно использовать соответственно

Breakpoint at method

Breakpoint at function, Breakpoint at form, Breakpoint at message. В Message не обязательно


указывать конкретное сообщение: можно одно из трех ID, number, Type

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Также можно поставить breakpoint на изменение стэка вызовов

И мы сможем познакомиться со всеми внутренними вызовами в этом случае

На некоторое время мы можем деактивировать или пропустить остановка в нужных нам точках

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Активация/деактивация выполняется на вкладке Break/Watchpoint

После деактивации наша точка не исчезнет – она будет доступна для активации. И ее можно
активировать, например, через несколько шагов или при следующем запуске (при условии, что
сессия не закрывалась). И мы ее можем активировать.

Также есть возможность пропускать определенное количество точек прерывания через


заполнение поля Skip (Number). Это может быть полезно при работе с циклами (когда нужно
пройти 15 записей цикла, а детально проанализировать только 16ю строчку).

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Мы можем перевести session breakpoints в external breakpoints, однако это доступна только для
строчных точек останова, а не для condition

Но мы можем снять условную точку прерывания и принудительно переделать ее в line breakpoint.


И тогда будет возможность перенести ее в external breakpoint.

Касательно Breakpoint – все.

Переходим к Watchpoint (точки наблюдения) – это точки наблюдения за переменными.


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

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Также можно наделить условием точку наблюдения

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Работать (просматривать и изменять) с watchpoint можно на вкладке Break/Wathpoint

При создании watchpoint у нас создается переменная клон (то есть происходит задвоение
переменной)

O Watchpoint:

https://help.sap.com/saphelp_erp60_sp/helpdata/en/f1/792442db42e22ce10000000a1550b0/content.
htm

В нашем случае создано три клона переменных, так как у нас три watchpoint

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Показать скриптинг на инициализацию переменной (SAS + Debugging)

METHOD script.

* CL_TPDA_SCRIPT_SCAN_ITAB
* CL_TPDA_SCRIPT_SCAN_ITABCHANGE CL_TPDA_SCRIPT_SCAN_ITABREAD
* CL_TPDA_SCRIPT_SCAN_ITAB_DEL CL_TPDA_SCRIPT_SCAN_ITAB_READ
* CL_TPDA_SCRIPT_SCAN_ITAB_ADEL CL_TPDA_SCRIPT_SCAN_ITAB_LOOP
* CL_TPDA_SCRIPT_SCAN_ITAB_INS
* CL_TPDA_SCRIPT_SCAN_ITAB_SORT

data lt_locs type TPDA_SCR_LOCALS_IT .


data ls_locs type LINE OF TPDA_SCR_LOCALS_IT .

* Example for READ TABLE


****************************************************************
*Interface (CLASS = CL_TPDA_SCRIPT_DATA_DESCR / METHOD = LOCALS )
*Returning
* VALUE( P_LOCALS_IT ) TYPE TPDA_SCR_LOCALS_IT
****************************************************************

CALL METHOD CL_TPDA_SCRIPT_DATA_DESCR=>LOCALS


RECEIVING
P_LOCALS_IT = lt_locs
.

LOOP AT lt_locs INTO ls_locs WHERE NAME eq 'ITAB'.


CALL METHOD TRACE->ADD_SRC_INFO( ).
BREAK-POINT.
ENDLOOP.

*** insert your script code here


me->break( ).

ENDMETHOD. "script

Script

https://help.sap.com/saphelp_nw75/helpdata/en/63/6811fa025a43368c4f664ffd46ed05/frameset.htm

С Checkpoint мы уже немного познакомились.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Сохранение точек останова


Эта функция позволяет прервать отладку, сохранить все точки в отдельный файл.

Можно выйти из системы.

А затем мы можем загрузить этот файл; и точки останова будут расставлены автоматически.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

А загружать через пункт Load

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Мы рассмотрели основные функции и возможности отладчика. Теперь рассмотрим интерфейс и


после этого перейдем к конкретным приемам.

Интерфейс отладчика
В версии NetWeaver 740 отладчик состоит из 12 рабочих столов, 3 из которых могут быть
настраиваемыми.

К рабочим столам отладчика можно обращаться через горячие клавиши Ctrl+F1, Ctrl+F2,… Ctrl+F12.

Desktop1 / Desktop2 / Desktop3 можно настраивать и сохранять настройку; по остальным –


настройка сохраняется только на время сессии.

Для переименования UserDefined Desktop можно сделать так:

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Чтобы название закрепилось не только на время сессии – сохраним Layout

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

После сохранения Layout наши настройки будут сохранены: имена рабочих столов, наборы
переменных.

Рабочий Назначение
стол
Desktop Настраиваемый рабочий стол.
1
Desktop Настраиваемый рабочий стол.
2
Desktop Настраиваемый рабочий стол.
3
Standard Отображает ABAP/Screen Stack и переменные
Structure Здесь можно просматривать (редактировать) структуры (а также те структуры, к
s которым было обращение через этот рабочий стол)

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Стэк структур (просмотренные структуры)

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Когда мы просматриваем структуру (двойной щелчок в списке переменных в


отладчике), то мы по сути переходим на этот рабочий стол

Через нажатие на «Карандаш» (Изменить) – мы можем редактировать составные


части структуры.

Tables На этом рабочем столе можно работать с таблицами: просматривать/редактировать.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Есть возможности:
1) редактировать порядок столбцов
простым перетаскиванием или челе кнопку Columns (можно искать столбцы или
перемещать целые группы столбцов)

Для восстановления (как по умолчанию) можно выбрать пункт меню из кнопки


Columns

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Просмотр внутренней таблицы в ALV-формате

На рабочем столе Tables можно редактировать таблицы и ячейки: удалять,


добавлять новые.

Objects Для отображения информации по объектам. Наследованию.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

DetailDis Отображает подробную информацию про объект/переменную.


play Есть информацию по типу данных.

Data Для работы с данными.


Explorer В части таблиц отображает информацию по колонкам
(тип и значение)

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Break./W Работа с точками прерывания, точками наблюдения и точками проверки


atchpoin (CHECKPOINT).
ts
Diff[eren Можно сравнивать объекты и выявлять в них различие.
ce] Удобно для больших таблиц, структур, объектов; когда различие сразу не видно.

Script Для скриптинга.

Прикладные приемы и пояснения к отладчику


Отладка фоновых заданий
Информация доступна из ноты 573128 - Debugging programs in the background

Отладка фоновых заданий возможно после завершения работы фонового задания. Система
сможет повторить программу с теми же селекционными параметрами и установит значение
переменной sy-batch = ‘X’ (которая показывает, что работа идет в фоновом режиме).

Запустим SM37

Найдем задание, которое уже завершилось; выделим его и в поле для транзакции введем JDBG и
нажимаем ENTER

Система запустит фоновое задание и перейдет в режим отладки.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Затем нажимаем два раза F7 (зависит от версии) и переходим в первую программу фонового
задания (первый шаг фонового задания). Для того, чтобы правильно ориентироваться в стэке -
можно открыть стэк Loaded программ (то есть всех загруженных программ, включая системные)

Помимо информации о загруженных переменных (и непосредственно очереди) в стэке хранится


информации по последнему изменению программу, что может быстро прояснить ситуацию на
проблему.

(Отметим, что в стандартном стэке такой информации нет, а очень зря; еще бы цветовую
подсветку  ).

Если шагов в фоновом задании несколько (как например, при прогоне платежей), то можно
нажимать F8, чтобы перейти от программы (как шага фонового задания) к программе.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Если отпустить выполнение, то фоновое задание будет выполнено: распечатана форма,


обновлены данные, отправлено письмо и т.д.

Отладка обновления / отладка системных программ


Перед обновлением (до COMMIT) зайти в отладку и поставить галочки

По меню: Settings -> Change Debugger Profile / Settings -> System Debugging / Update Debugging

Тогда после COMMIT запустятся функции, которые поставлены в очередь на обновление.

https://help.sap.com/saphelp_nw70/helpdata/en/41/7af4bfa79e11d1950f0000e82de14a/content.htm

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Тогда мы сможем увидеть функциональные модули, которые обновляют базу данных или
внешние системы.

Нужно иметь ввиду, что точки остановка для процесса обновления нужно расставлять по новой.

(равно как и breakpoints и wacthpoints). Это полезно при отправке печатных форм и печати при
одновременном сохранении документа.

Отладка системных программ

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Поставив точку остановка в функциональном модуле AUTH_CHECK_TCODE мы не будем туда


попадать прямо сразу, а только при условии активной отладки системных программ

Или таким способом

И ставим галочку

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Когда нельзя ставить точки останова


При конструкция select / endselect, так как это прерывает cursor к базе данных.

А также в некоторых местах экранной обработки.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Отладка окон (POPUP), когда нет поля для ввода транзакции


Текстовый файлик с расширение .sap и содержимым ниже
[FUNCTION]
Command=/H
Tittle=Debugger
Type=SystemCommand

Затем просто перетаскиваем его в открытое окно

Система сообщит, что отладка включена. Если не сообщит, значит что-то пошло не так.

Переключение между старым и новым отладчиком


Способ1 – из ABAP Workbench

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Обращаю внимание, что галка – только для старого отладчика.

Аналогично можно вернуться в старый отладчик.

Способ2 – из отладчика

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Обращаю внимание, что в справке для версии 750 новый отладчик уже называют Standard
Debugger (насколько мог заметить).

При этом из классического -> в новый

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Заметим, что для нового отладчика требуется 2 окна (текущее окно (приложения) и еще одно для
отладчика); для классического – одно окно.

Отладка tRFC модулей


Необходимо поставить точку останова непосредственно перед вызовом функционального модуля
в BACKGROUND TASK

Когда дошли до точки останова, то переходим по меню


Settings -> Change Debugger Profile / Settings

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Затем ставим галочку «TPDA: In Background Task: Block Sending»

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Когда будет выполнен COMMIT, то этот фукнциональный модуль будет в транзакции SM59

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Переходим по меню Edit -> Debug LUW

После этого функциональный модуль удалится из очереди tRFC.

Причины, по которым точки останова могут не отработать


Причина Описание
Процесс работает под Точки остановка нужно ставить под тем пользователем (для того,
другим пользователем пользователя) и в том манданте, в котором происходит обработка
данных

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Системная программа Для отладки системных программ нужно пользоваться


команданой /hs или галочкой отладка системы
Enhancement В Enhancement точки останова лучше ставить либо перед вызовом
Enhancement либо в Enhancement делать инкапсулированный код
блока и ставить точку в нем.
Асинхронный RFC (aRFC, Внешний вызов (вызов из внешней программы) – рассмотрели
HTTP) выше.
Нужно использовать внешнюю точку остановка (с учетом
пользователя, под которым выполняется вызов).

Ноты:
Note 668256 - Using HTTP/external debugging and
Note 751872 - Problem analysis with HTTP or external debugging)
Note 868830 - Cannot debug an RFC in a HTTP session, if

Прием «SET PF-STATUS XXXX» (проверка кнопок в отладчике)


Чтобы определить, почему установился тот или иной набор кнопок в панели на экране, то это
можно проанализировать, поставив точку останова на Statement SET PF-STATUS

С помощью этого оператора происходит установка PF-STATUS, перейдя в который можно понять,
какие функции активируются и деактивируются (с помощью EXCLUDING fcode).

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В ALV можно устанавливать дополнительно кнопки с помощью toolbar (но и этот способ
используется) (об ALV поговорим позднее).

MODIFY SCREEN
Анализирование статуса полей (почему определенное поле открыто или закрыто для изменения)
можно сделать с помощью оператора MODIFY SCREEN.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Вводим оператор MODIFY SCREEN

Система остановится в нужном нам месте.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Однако полей для анализа может быть много и не всегда может быть очевидно, что
определенное поле принадлежит этому экрану (или подэкрану). SCREEN недоступна как

Обращение к таблице (!!! а не структуре) SCREEN


В любом рабочем столе нажимаем кнопку создать или заменить инструмент

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Выбираем Special Tools -> Screen Analysis

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

И на вкладке FIELD-LIST видим полный перечень полей

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

А также с помощью инструмента System Areas (Internal Only)

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

И тогда увидим полный перечень полей, который находится в таблице SCREEN

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

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

Отладка областей выполнения кода (Software Layer Aware Debugging)


C отладчиком после версии 7.30 у нас есть возможность отлаживать определенные участки кода.
Мы можем указать Z* и переходить только между объектами кода Z*. Ранее можно было
использовать лишь точку наблюдения на sy-repid(1) = Z.

Функция отладки областей кода может активироваться непосредственно в отладчика. Рассмотрим


быстрый пример. Запустим транзакцию, например, VA03.

Запустим отладчик непосредственно в транзакции

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В открывшемся окне отладчика нажмем кнопку "Configure Debugger Layer"

Отмечаем галочку "Layer-Aware Debugger Active" и в поле Packages / Classes / Programs указываем
нужное нам пространство имен (мы можем задать несколько пространств, воспользовавшись
множественным выбором). Затем нажимаем ENTER (зеленая галочка).

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Теперь в панели отладчика у нас появилась кнопка "Next Object Set"

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Если мы будет последовательно нажимать на эту кнопку, то система будет последовательно


останавливать в объектах, которые удовлетворяют указанным нам условиям.

и вот мы сразу нашли первый customer code, созданный в BADI_SD*.

Следующее нажатие кнопки "Next Object Set" приведет к остановке в другом (следующем) блоке,
которые удовлетворяет критериям, указанным при активации Debugger Layer (отладка областей
кода).

Кроме того, мы можем настраивать профили областей кода в транзакции SLAD. Тогда в самой
отладке нам нужно будет всего лишь выбрать нужный профиль, в котором уже будут пред
настроены объекты для выбора.

Запускаем транзакцию SLAD и переходим на вкладку Object Sets. На этой вкладке нам нужно
создать наборы объектов, которые мы будем анализировать при отладке.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Затем мы определяем набор выбора (selection set)

Создадим два набора выбора: SET01 и SET02. В первом укажем все программы начинающиеся с Z,
а во втором - все функциональные модули, начинающиеся Z* и Y*.

(мы бы могли, конечно, все сделать в одном наборе, но для целей изучения посмотрим создание
объектов в разных наборах).

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Нажимаем на кнопка Execute ("часы").

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Затем нам нужно задать условие объединения наборов (или исключения)

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В LINK SET03 укажем все Z* пакеты

О том как будет работать остановка по объектам выбора пояснено в таблице

Linking SET01 SET02 SET03


SET01 or SET02 STOP STOP NO
SET01 and SET02 and NO STOP NO
SET03
SET02 and NOT SET03 NO STOP NO

После этого сохраняем Object Set (потребуется запрос и пакет для объекта, так как это переносная
настройка).

Затем мы переходим на вкладку Profiles и нажимаем кнопку "Создать"

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В списке Objects Sets мы добавляем Objects Sets, созданный на предыдущем шаге.

Затем сохраняем на профиль (также потребуется пакет и запрос).

Итак, мы создали профиль ZSALES_ORD.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Теперь запустим отладку в транзакции VA03 и в Layer Debugging будем опираться на профиль.

Нажимаем Configure Layer Debugger

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

и теперь с помощью кнопки "Next Object Set" мы можем переходить между областями кода.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

И мы сможем переходить между преднастроенными областями кода.

Чтобы отключить Layer-Debugger нажимаем кнопку "Deactivate"

также мы можем отключить его через настройки

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

https://blogs.sap.com/2010/07/27/layer-aware-debugging-in-nw-70-ehp2/

Вывод: Чтобы в будущем (в системе тестирования или даже в продуктиве) тратить меньше
времени на отладку или поиск ошибки, можно создавать профили областей отладки кода в
транзакции SLAD и переносить их вместе с разработкой. Тогда Вы сможете довольно быстро

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

ответить на вопрос: "повлияла ли конкретная разработка на изменение/создание тех или иных


данных".

Отладка макросов
Для отладки макросов используется нужно использовать отладку BYTE-кода. При этом, где
вызываются макросы мы должны знать заранее. Это можно узнать по поиску кода или с помощью
скриптинга.

Непосредственно перед макросом нужно перейти в режим ABAP Byte code (debug macro); пункт
меню можно вызвать правой кнопкой мыши.

Давайте рассмотрим пример; пусть у нас определен некий макрос в программе. Непосредственно
перед макросом ставим точку останова и запускаем программу.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Мы остановимся в нужном месте с открытым исполняемым текстом ABAP-кода.

Нам нужно окткрыть дополнительный текст ABAP-кода, чтобы в одном режиме смотреть
непосредственно MacroDebug, а в другом ABAP-код. Для этого нажимаем на инструмент (New
Tool)

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Теперь экран будет выглядеть так

Также добавляем инструмент по просмотру переменных

Теперь экран отладчика будет выглядеть так

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В блок переменных ставим переменные LV_V1, LV_V2, LV_V3, LV_V4.

один из экранов с исходным кодом переводим в режим ABAP Code (Macro Debug); для этого
щелкаем правой кнопкой мыши

Мы видим, что система зашла в макрос (в левом экране стрелочка напротив макроса) и в правом
экране видим оператора IF, CHECK Затем BRAF, PROVIDE и MOVE.

используя кнопку F5 для правого экрана наблюдаем за нужной нам переменной.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Именно так и происходит отладка макросов (это мой рекомендуемый способ с тремся экранами:
ABAP-кода, ABAP-byte кода и перечнем переменных).

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

Полезные ссылки

https://blogs.sap.com/2013/11/17/single-step-debugging-on-macro/
https://blogs.sap.com/2012/10/28/use-macros-use-them-wisely/

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Отладка трансформаций (call transformation)


Трансформация - это механизм преобразования ABAP данных в xml и обратно.

Чтобы понять в каком месте ABAP кода происходит вызов трансформации, а также сам
идентификатор (имя) трансформации нужно поставить точку останова на оператор CALL
TRANSFORMATION

В нашем случае имя трансформации - ID (это универсальная трансформация без дополнительного


мэппинга)

Чтобы произвести отладку самой трансформации нужно зайти в транзакцию XSLT_TOOL, указать
имя трансформации и нажать DISPLAY.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Также трансформацию можно отлаживать с помощью отладки в самой трансформации, но для


этого придется подать данные на вход.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В ABAP различают два вида модели разработок:

1) Объектно-ориентированное, основанное на классах и интерфейсах


2) Процедурное программирование, основанное на функциональных модулях и
подпрограммах.

SAP рекомендует к использованию объектно-ориентированную модель.

Давайте рассмотрим структуру логики обработки (processing logic).

https://help.sap.com/saphelp_erp60_sp/helpdata/en/c3/225b5354f411d194a60000e8353423/content.
htm

Структура логики обработки (processing logic)


Каждая ABAP-программа состоит из вводной части (introductory), декларативной части
(declaration) и множества блоков обработки (processing blocks), которые реализуют несколько
функций в зависимости от приложения. В блоках обработки содержатся ABAP-
обработчики/операторы. Блоки обработки не могут содержать другие блоки обработки. На
рисунке представлена диаграмма, показывающая структуру ABAP-программы.

Вводная часть (Introductory)


каждая ABAP-программа начинается с вводного выражения, которое зависит от типа программы.
Некоторые операторы имеют дополнительные параметры, которые определяют настройки
программы.

Декларативная часть (Declaration)


После вводной части обычно следует объявление глобальных переменных, классов,
селекционных экранов. Операторы для объявления переменной, находящиеся в локальных
блоках, объявляют локальные переменные.

Блоки обработки (Processing Blocks)


Блоки обработки, как правило, содержатся после объявления данных. и не обязательно, что
порядок следования блоков обработки по тексту программы "сверху-вниз" совпадает с порядком
выполнения программы этих блоков в программе. Код в рамках блоков обработки выполняется
последовательно.

Нижеуказанные типы блоков обработки могут быть завершены операторов RETURN:

1) Диалоговые модули (без локальных данных)


2) События (блоки событий) (без локальных данных за исключений двух)
3) процедуры (методы, подпрограммы и функциональные модули, в которых можно указывать
локальные данные).

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Диалоговые модули и процедурные блоки объявляются закрывающими конструкциями; в то


время как события объявляются ключевыми словами и продолжаются до объявления следующего
события. Те выражения, которые не включены в объявленный блок, относятся к событию START-
OF-SELECTION.

Блоки обработки в ABAP-программе


Нижеуказанная информация о блоках обработки в ABAP и поясняет как они вызываются. Они
могут вызываться либо извне ABAP-программы (как в случае с диалоговыми модулями и блоками
событий) или через ABAP-команды, которые сами содержатся в блоках обработки.

Диалоговые модули
Вы можете вызвать диалоговые модули из логики обработки экрана (команда MODULE). Вы
можете написать диалоговый модуль на каждое состояние (PBO, PAI; ввод пользователя:
проверка значений и вызов справки) любого экрана программы. PAI-модуль и PBO-модуль
определенного экрана формируют шаг диалога. Взаимодействие между логикой обработки
данных и логикой экрана обеспечивается диалоговым процессором (Dialog Processor).

Диалоговые модули объявляются оператором MODULE и завершаются оператором ENDMODULE.

Поля на экране имеют те же имена, что и соответствующие поля в ABAP-программах. Данные


передаются между полями с одинаковыми именами полей в программе. Экраны определяются не
в ABAP-программе.

События (блоки события) (Event Blocks)


Блоки событий вызываются через события, которые побуждаются (тригерятся) действиями
пользователей и списками или через среду ABAP runtime. В программе нужно только определить
событийные блоки, с помощью которых программа будет реагировать на события (в то время как
для вызова подпрограммы, например, нужно иметь соответствующую подпрограмму). Это дает
возможность реакции программы на определенное событие, но не обязывает программу
обязательно реагировать на событие.
www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Конструктор программы
После загрузки исполняемой программы (executable program), пула модулей (module pool),
группы функций (function group) или пула подпрограмм (subroutine pool), один специальный блок
может быть исполнен только один раз. Этот блок обработки определен как событийный блок,
использующий оператор LOAD-OF-PROGRAM. LOAD-OF-PROGRAM имеет то же назначение, что и
конструктор в ABAP-классах.

Событийные блоки на селекционных экранах


Различные события на селекционных экранах (PAI, PBO, ввод пользователя) контролируются с
помощью процессора селекционного экрана. Мы можем программировать логику для этих
событий в наших программах. Процессор селекционного экрана контролирует логику потока
данных селекционного экрана.

Вы можете не создавать логику работу экрана сами, и можете не создавать диалоговые модули
для PBO и PAI-модулей. Данные передаются между селекционным экраном и ABAP-программой с
помощью полей (параметры и селекционные таблицы) при определении селекционного экрана в
декларативной части ABAP-программы.

Событийные блоки списка (list)


Вы можете создать их в любом блоке обработки ABAP-программы с помощью специального
набора команд (таких как WRITE, NEW-PAGE и так далее). List Processor (процессор списка)
отображает список на экране и обрабатывает действия пользователя внутри списка. Процессор
списка контролирует логику данных списка. Вы мне нужно создавать логику обработки списка
самостоятельно, так же как Вам не нужно создавать Ваши собственные модули диалогов для
модулей PBO и PAI-событий.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

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


страниц. Картинка выше показывает событие TOP-OF-PAGE, которое вызывается непосредственно
из ABAP-программы. Когда список отображается, пользователь может выполнить действия для
триггера событий интерактивного списка (например, AT LINE-SELECTION). Логика обработки
интерактивных списков может быть сделана в программе. Данные из списка передаются либо с
помощью системных полей либо через область памяти HIDE.

Блоки событий для исполняемых программ (Reports - отчетов)


Выполнение исполняемой программы контролируется предопределенным процессом в среде
runtime. Набор обработчиков (процессоров) вызываются, один за другим. Эти обработчики
тригерят события, за которыми вы можете определить блоки событий. Исполняемая ABAP-
программа выполняется с помощью событий.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Процесс следующий:

1. Runtime создает событие INITIALIZATION и вызывает соответствующий блок (если он определен


в ABAP-программе).

2. Если в программе определен селекционный экран, то управление передается обработчику


селекционного экрана; тем самым генерятся соответствующие события и вызываются блоки
событий.

3. Управление передается процессору отчета (reporting processor); создается событие START-OF-


SELECTION и вызывается соответствующий блок события (если этот блок определен в программе).

4. Если используется ЛБД (логическая база данных), то она вызывает последующие блоки событий
в этом месте.

5. Reporting Processor создается событие END-OF-SELECTION и вызывает соответствующий блок


(если он был определен в программе).

6. Если программа содержит описание списка, то контроль передается к процессору списка.


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

7. Если селекционный экран объявлен в декларативной части программы, то та же самая


программа вызывается автоматически после того, программе завершена (выход из списка).

Процедуры
Процедуры представляют собой вызываемые блоки обработки, которые содержат интерфейс и
локальные данные. Подпрограммы

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Подпрограммы вызываются из ABAP-программ с помощью оператора PERFORM. Подпрограммы


объявляются с помощью конструкции FORM и завершаются конструкцией ENDFORM.

Подпрограммы можно объявлять в любой ABAP-программе (за исключением ООП). Можно


вызывать как подпрограмму, определенную в Вашей программе, так и подпрограмму,
определенную в другой программе. Если вы вызываете внутреннюю подпрограмму, Вы можете
использовать глобальные переменные для передачи значений между основной программой и
подпрограммой. Когда же происходит вызов внешней подпрограммы, то Вам нужно передать
указанные параметры из основной программы во входные параметры подпрограммы.

Функциональные модули
Функциональные модули представляют собой внешний функции с предопределенным
интерфейсом. Вызов функциональных модулей осуществляется с помощью оператора CALL
FUNCTION. Функциональный модуль определяется с помощью конструкции FUNCTION и
завершается с помощью конструкции ENDFUNCTION.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Функциональные модули можно создавать в рамках специальных ABAP-программ называемых


группы функций с помощью Function Builder (Построитель функций / я бы назвал мастер функций).
Функциональные модули всегда вызываются из внешний программ (по сути) и параметры в них
передаются явно (но можно также и через глобальные переменные группы функций).

Методы
Методы, по сути, представляют собой функциональные возможности класса. Как и
функциональные модули, у них имеется интерфейс. Вызов методов выполняется из ABAP-
программы с использованием конструкции CALL METHOD. Методы объявляются конструкцией
METHOD и завершаются конструкцией ENDMETHOD.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Методы реализовываются в имплементации класса. Это можно сделать глобально в словаре


через (построитель классов / class builder / мастер классов), или локально в рамках ABAP-
программы. Методы могут работать с атрибутами класса и с параметрами, которые им переданы
в явном виде.

Типы ABAP-программ и выполнение ABAP-программ


Когда Вы запускаете ABAP-программу, Вы вызываете блоки обработки в определенной
последовательности. Этот процесс контролируется вне программы с помощью процессора
текущего рабочего процесса.

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

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В ABAP есть несколько видов программ

Report (исполняемый отчет)


Тип программы 1. Создается через транзакцию SE38. Программа может быть запущена двумя
способами: через транзакцию и через SUBMIT. Report может отображать много данных на экране;
в report имеются события:

Initialization;
At selection-screen;
Start-of-selection;
End-of-selection;
Load-of-program;
Top-of-page during Line Selection;
At Line-Selection;
at pf<nn>

Пулы модулей (Module Pools)


Это программы типа M обозначаются при помощь конструкции PROGRAM. Для запуска программы
нужна транзакция и начальный экран. Пул модулей может включать 4 компонента:

Экраны
Коды транзакций
GUI -status
ABAP-программу

Пул модулей также включает 4 различных события, которые связаны с экраном и элементами.

Process Before Output (PBO) - событие перед выводом на экран


Process After Input (PAI) - событие после реакции пользователя на экране

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Process on Help Request (POH) - справка к полю (F1)


Process on Value Request (POV) - средство поиска к полю (F4)

Пример: FB01 / SAPMF05A.

Пул классов (Class Pools)


программы типа K. Создаются с помощью Class builder. Могут включать один глобальный класс и
множество локальных классов. Программы не содержат экранов.

Пример (показать через Progdir) ZCL_Z8M1_VIEW001.

Пул интерфейсов (Interface Pools)


Программы типа j; объявляется конструкцией INTERFACE-POOL. Не содержат экранов.

Пример: ZIF_EXCEL_READER.

Пул подпрограмм
Программы типа S. Объявляются ключевым словом PROGRAM.

Пример:
BPR_SALESDOC

BPR_SALESORDER

BPR_SALES_DOCS

ISA_CUSTOMER_SALES_READ=======FT

RV_SALES_DOCUMENT_COPY========FT

SD_SALESDOCUMENT_CHANGE=======FT

SD_SALESDOCUMENT_CREATE=======FT

SD_SALES_ACTIVITY_CHECK_INPUT=FT

SD_SALES_DOCUMENT_READ========FT

SD_SALES_DOCUMENT_SAVE========FT

SD_SALES_HEADER_READ==========FT

SD_SHIPMENT_FOR_SALESORD======FT

Группа функций
Программы типа F. Создаются через Function Builder. Все функциональные модули созданы в
рамках какой-нибудь группы функций.

Пулы типов (Type Pools)


Объявляются словом TYPE-POOL. Содержат только типы.

Include-программы
Программы типа I. Содержат определенный код. При генерации код инклюда включается в
программы. После генерации программы содержат весь код со всех инклюдов.

Интернет источники

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

https://help.sap.com/saphelp_erp60_sp/helpdata/en/fc/eb2d5a358411d1829f0000e829fbfe/conten
t.htm
https://help.sap.com/doc/saphelp_erp60_sp/6.0/en-
US/fc/eb2d5a358411d1829f0000e829fbfe/frameset.htm
https://help.sap.com/saphelp_erp60_sp/helpdata/en/fc/eb2d67358411d1829f0000e829fbfe/conten
t.htm
http://help-legacy.sap.com/abapdocu_751/en/index.htm

SAP LUW and DB LUW

https://help.sap.com/saphelp_nw70/helpdata/en/41/7af4bca79e11d1950f0000e82de14a/frameset.ht
m

https://help.sap.com/saphelp_nw70/helpdata/en/41/7af4bfa79e11d1950f0000e82de14a/content.htm

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

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

Введем понятия, которые нам пригодятся.

Трассировка – пошаговое отслеживание чего-либо.

Рассмотрим инструменты, позволяющие анализировать runtime.

Просмотр статистики (STAD и ST03N)


С помощью транзакции STAD мы можем посмотреть статистику системы за последние несколько
часов (по умолчанию 48). В SAP ERP каждый час записывается файл статистики, а через каждый 48
часов он удаляется.

Что представляет из себя файл статистики? Представляет из себя перечень программ, и


пользователей, которые их запускали, с временем работы; таким образом, файл статистики
показывает, кто что запускал и как это что-то отработало. Файл статистики не покажет точное
место кода, а только представит общую картину.

Этот инструмент – прежде всего для анализа загрузки системы; то есть мы можем заранее найти
узкие места системы, не дожидаясь того, как возникнет ситуация.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В разделе Display Mode мы укажем опцию группировки (сделаем все записи, сортированные по
времени)

(предварительно позапускать транзакции)

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В статистике мы найдем информацию о запускаемых транзакциях, пользователе, времени отклика

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Двойным кликом на строчке – получаем более детальную информацию.

Эта информацию разбита на 4 блока: Время выполнения рабочего процесса (Time), DB (время на
работу с базой данных), Task/memory (затраченное время) и информация по клиенте. В случае,
если были RFC вызовы – будет информация по ним.

Для нас важно обратить внимание на Time – характеризует работу ABAP-кода, и DB –


характеризует время по выборке из базы данных.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В Wait смотрим на показатель Processing time – это то, сколько времени программа
обрабатывалась Application Server.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В блоке DB – смотрим на все столбцы и в особенности на Avg.time / row (ms) – от каждой базы
даны можно требовать своего результата. На современных Oracle и HANA – менее 1 ms – Это
норма; если больше, то стоит задуматься. Для старых БД – менее 10 ms – это норма.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Данные по статистике хранятся в системе по умолчанию 48 часов; время хранения может


изменить базис. Система каждый час накапливает данные в файл и сохраняет его; при достижении
конечного значения, система не создает новый файл, а «перезатирает» имеющейся.

Чтобы не плодить количество файлов, можно поставить программу RSSTAT26 в фоновое


выполнение и анализировать результат по данным фонового задания.

В транзакции ST03N мы можем наблюдать данные статистики в агрегированном виде с


разбитием по пользователям, транзакциям.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Вывод: инструмент STAD показывает данные статистики; при этом анализируется вся система и
все действия пользователей. Что посмотреть результат анализа, не нужно запускать транзакции
повторно. В транзакции ST03N содержится та же информация, но в
структурированном/агрегированном видах. Однако, чтобы детальнее разобраться в причинах –
нужно использовать другие инструменты для анализа запроса БД и выполнения ABAP-кода.

Useful links
https://blogs.sap.com/2013/06/11/how-to-use-stad-to-show-historical-data/
https://wiki.scn.sap.com/wiki/display/SRM/STAD+-+ABAP+Business+Transaction+Analysis
https://blogs.sap.com/2007/01/12/statistical-records-part-1-inside-stad/

SAP Note 579462 - Runtime parameter of the statistics collection


SAP Note 552845 - FAQ: RFC Statistics in Transactions ST03/ST03N and STAD
SAP Note 8963 - Definition of SAP response time/processing time/CPU time

https://blogs.sap.com/2007/03/16/how-to-read-st03n-datasets-from-db/

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Обращение к БД и определение таблиц (ST05)


Транзакция ST05 позволяет получить информацию о запросе к таблицам базы данных, по
обращению к буферным таблицам, по kernel-вызовам (APC), RFC/HTTP-вызовам.

Также трассировка позволяет быстро определить таблицы, к которым идет обращение, что
облегчает понимание того или иного решения (или объекта: логистических заказов / Fi-
документов, технических таблиц и т.д.).

Поле Комментарий
SQL Trace Галочка, включающая SQL-трассировку
BUF Trace
Enqueue Включение трассировки объектов блокирования.
Trace
RFC-Trace Включение трассировка RFC-вызовов
HTTP-Trace Включение трассировки HTTP запросов (в том числе OData - запросов)
APC Trace ABAP Push Channels/ Kernel Trace
Подробнее об ABAP Channels –
https://help.sap.com/saphelp_nw75/helpdata/de/5a/68bfb5dae8474fa1289c10d45a1
7fe/frameset.htm

В настоящий момент ABAP Channels не используются широко, так как


относительно недавно вышли в свет.
Но в будущем, будут активно использоваться в online-операциях, например,
аукционах или online-общениях с клиентом.
Детально не будет рассматривать.

AMC ABAP Messaging Channels


Также относится к ABAP Channels
Подробнее здесь
https://help.sap.com/saphelp_nw74/helpdata/en/96/90807dd15c438b91e2397bf109d
5ad/frameset.htm

https://help.sap.com/saphelp_nw74/helpdata/en/8c/b48d105b83469bb1266e7dcb413
31f/content.htm

Stack Trace Включение / отключение ABAP-стэка вызовов.


Нужно понимать, что при включении параметра нам потребуется больше памяти.
On / Off Этот параметр стоит включать только, когда действительно нужно параллельно
отследить ABAP-вызов.
Весьма полезно при трассировке вместе с трассировкой HTTP (OData).
Progress
Display
On / Off

Рассмотрим трассировку SQL запросов и запросов к буферным таблицам на пример.

При трассировке рекомендуется предварительно продумать, как можно максимально уменьшить


количество операций, которые подвергаются трассировке. Чем меньше файл трассировке, тем

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

больше вероятности, что в файл запишется вся информация и (!!!) то, что результаты трассировки
будет легче анализировать; это важно, так как именно с целью анализа трассировка и делается.

Также трассировку следует делать с 3-4 раза, чтобы были заполнены буферные таблицы и
выполнились другие разовые операции по установка соединения с БД.

В нашем случае мы сделаем трассировку транзакции VA03 на просмотре заказа.

В одном окне запустим транзакцию ST05 (= ST05_NEW)

В транзакции VA02/VA03 пройдемся по вкладкам заголовка и по вкладкам в позиции.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Номер заказа: 1000000004.

По завершении трассировки нажимаем на кнопку «Deactivate Trace», а затем Display Trace.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

На следующем экране мы уже устанавливаем то, что будем выбирать из файла трассировки и
показывать на экране. Мы можем задать также как и на 1ом экране виды трассировок и критерии
фильтрации.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В панели запуска есть несколько кнопок для запуска

Режим «Main Records»


Запуск трассировке в начальном режиме без
отображения операции по соединению
(PREPARE, OPEN, FETCH)

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Запуск трассировке в начальном режиме c


отображением операции по соединению
(PREPARE, OPEN, FETCH)
Режим «Отображение структурно идентичных
выражений»
Обзор трассировки

Сохранение файла трассировки в базе данных

Рассмотрим режим «Main Records»

В столбце Object Name мы видим имя таблицы (объекта), к которому происходит обращение

В столбце Time - время, когда было обращения; в случае сортировки/фильтрации этот столбец
помогает восстановить информацию в хронологическом порядке.

Столбец Duration – это время, в течение которого выполнялся запрос; а количество в столбце
Records показывает сколько записей было возвращено (в случае SELECT) или записано (для
INSERT); с помощью столбца RECORS мы можем отсеять те запросы, которые не вернули нам
данные (в случае, если мы ищем нужную таблицу).

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Более того мы можем перейти непосредственно в место в коде, откуда произошел данный вызов:
либо с помощью специальной кнопке либо двойным щелчком по Program name.

С помощью двойного щелчка по кнопке DDIC Information или по Object Name мы сможем получить
информацию по таблице.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

С информацией о типе таблицы, буферизации и индексах.

Двойной щелчок по выражению покажет какие именно значения, в какие поля попадают.
Полезно, когда запрос не помещаются в 128/256 символов, отведенных для ячейки ALV.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

С помощью кнопки «Display Execution Plan» мы можем понять, почему система выбрала тот или
иной индекс, например. Анализ нужно проводить, начиная с шага 1 (он находится дальше от
начала).

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Система откроет информацию о том, какой индекс использовался в запросе. Также мы можем
посмотреть статистику по таблице

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Index Statistics: сколько записей по каждой части составного ключа

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

С помощью кнопки Analyze мы можем пересобрать статистику.

Вернемся в главное меню.

С помощью кнопки Individual records (предварительно нам нужно выделить какое-то количество
записей, по которым мы хотим посмотреть информацию) мы можем увидеть операции по
запросу: PREPARE, OPEN, FETCH.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Из этой информации мы можем увидеть также, сколько времени было потрачено на операции,
сколько записей было обработано (все то же самое, но в более детальном представлении с
разделением по операциям с курсором базы данных). Если операция PREPARE и OPEN довольно
часто, то лучше сделать повторную трассировку.

Теперь перейдем в режим «Structure Identical Records»

В этом режиме мы видим запросы к базе данных идентичных по структуре.

Мы видим сколько записей объединилось (одинаковых SQL запросов) в столбце Execution,


Redundancy и Identical – сколько раз выполнялся запрос, а также сколько похожих запросов было.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В столбцах Duration, Records, Duration per Records мы видим время исполнения, количество
обработанных записей, а также продолжительность на одну запись.

С помощью кнопки «Absolute <> Relative» мы можем переключаться из режима «в процентах» в


режим «миллисекунды».

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

При работе с Structure and Value Identical statements информации необходимо иметь ввиду
следующее:

1) Несколько различных участков кода могут относится


2) Отображаемое выражение может отличаться от OPEN SQL-выражения

Мы можем посмотреть данные в разрезе доступа к таблицам

В этом режиме в свою очередь мы можем разделить таблицы по приложениям

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Например, из приведенного запроса мы видим, какие таблицы относятся к компоненту SD (Sales


and Distribution)

В режимах Trace Overview и Sizing можем видеть обобщенную информацию по трассировке.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Особого внимания заслуживает кнопка Activate Trace with Filter.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В Sizing мы видим статистику по всем таблицам, над которыми проводились операции

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Также стоит иметь ввиду, что мы можем делать трассировку запросов, напрямую из отладчика.

Useful links
https://archive.sap.com/discussions/thread/630359
https://blogs.sap.com/2007/09/05/the-sql-trace-st05-quick-and-easy/
https://wiki.scn.sap.com/wiki/display/ABAP/Explain+Plan
https://blogs.sap.com/2010/03/04/explaining-the-explain-plan/
http://www.itpsap.com/blog/2014/12/21/abap-database-sql-analysis-performance-trace-part-1/
Книга SAP-PRESS «ABAP Performance Tuning»
http://sapland.ru/books/ABAP_Performance_Tuning.html
http://www.itpsap.com/blog/2016/11/12/running-abap-traces-in-the-new-debugger/

Транзакции SE30 / SAT: Runtime Analysis

До версии ECC 6.0 использовалась транзакцию SE30; сейчас ее заменяет транзакцию SAT. Если мы
зайдем в транзакцию SE30, то получим об этом сообщение.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Сейчас для целей ознакомления будем использовать транзакцию SAT.

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

Вводим имя варианта в description (всего измерения) и ID-варианта.

Перед нами три вкладки: Duration and Type; Statements; Program Components.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Сделаем комментарии по параметрам

Блок «Aggregation»

В случае параметра None система будет показывать вызываемые подпрограммы/методы


столько раз, сколько они вызывались.
В случае параметра Per Call Position – вызываемый метод будет представлен одной строкой, а в
поле Hit будет количество вызовов его. В случае этого параметра – недоступен параметр
Measure Memory Use.

Если мы хотим проследить логику работу, то выбираем None.

Блок «Options»

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Measure RFC and Update Calls – указывает, что нужно учитывать RFC-вызовы и Update-вызовы.
Explicit Switching.. – позволяет включать/выключатть трассировку в любом месте программы
либо через команды: /ron или /roff. Или через путь System -> Utilities -> Runtime Analysis ->
Switch On / Switch Off

Measure Memory Use: система будет показывать статистику по использованию памяти


На экране Statements мы можем отметить конструкции, которые должны анализировать:
например, только запросы к БД или методы или операции Export/Import

В нашем случае – отметим все.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

На вкладке Program Parts мы можем ввести дополнительные ограничения.

No limitation – без ограничений.

Limitation Accroding to definition on Hotspot Monitor – ограничение только по блокам кода,


которые определены в таблице HOTSPOT_DEF.
Таблице

Limitation on program Components – мы можем указать до 10 блоков кода, по которым мы


можем ограничить трассировку.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Чем нам может помочь вариант и все эти ограничения? Тем, что результат трасисровки
будет меньше и «по делу», а чем меньше он будет, тем легче его можно
проанализировать и найти нужный участок кода или причину проблемы.

После заполнения параметров – сохраняем вариант и выходим в главное меню.

Вводим/указываем транзакцию и выполняем действия. Мы могли бы запустить программу в


параллельном окне и ввести команду /ron или /roff.

Если мы хотим отображать имена внутренних таблиц, то отмечаем флажок «Determine Names of
Internal Tables»

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Блок «In parallel Session» позволяет перейти к процессам и протрассировать конкретный


выполняемый процесс.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Блок «For User/Service» позволяет протрассировать с фильтром: по пользователю, транзакции и


другим параметрам.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В нашем случае мы запускаем Execute на транзакции и выполняем транзакцию (не забываем


включиьт /ron и /roff, так как мы указали, что включение и выключение будет принудительным).

После выполнения нужных действий, отключаем трассировку через команд /roff.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Система соберет данные по трассировке и покажет несколько рабочих столов (по образу
отладчика)

Рабочий стол Hit List

Показывает все измеренные выражения. Одинаковые выражения суммируются и отображаются


одной строкой; но одинаковые выражения, вызванные из разных мест кода – отображаются как
отдельные строчки. Показан список в порядке убывания по времени выполнения.

Мы видим время выполнения программы блока кода и его процент (долю).


Полезной является кнопка «Additional Information» - с ее помощью мы можем вывести
дополнительную информацию для анализа

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

И убрать лишние элементы (например, не связанные непосредственно с интересующей нас


разработкой).

Рабочий стол DB Tables

Показана информация по времени обращения к таблицам. Мы можем наблюдать перечень


таблиц, тип доступа к ним, тип буфера, тип таблицы и пакет, в рамках которого была создана
таблица.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Рабочий стол Profile Tool

По умолчанию отображается дерево с закладками с рабочего стола 1. Здесь отображаются


операции, из тех которые были выбраны в варианте; при этом, если операции не было в процессе
выполнения программы, то и здесь ее не будет. А справа содержатся операции, относящиеся к
веткам деревьев.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Также доступна дополнительная информация

При этом система покажет все операции в том числе внутренние (такие как проверки ФМ
DB_EXISTS_FUNCTION, проверки SQL-параметров и, нормадизации отображения, связанные с
вызовами ФМов «CONVERSION_*»). Для каждой строчки система покажет общее время
выполнения команды и чистое время. Чистое время рассчитывается как общее время минус
время выполнения вложенных конструкций. Двойной щелчок позволит перейти в место кода.

При этом мы можем менять инструменты динамически по образу, как это реализовано в
отладчике.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Рабочий стол Processing Blocks содержит иерархическое дерево шагов. Мы видим


последовательность блоков и информацию по времени вызова. Также мы можем видеть
информацию по использованию памяти.

С помощью кнопки “Confine to Subarea” мы можем отобразить выделенный блок в качестве


начального уровня иерархии.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Для возвращения

Рабочий стол “Call Hierarchy” отображает иерархию вызовов.

Есть возможность посмотреть Call Stack

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Рабочий стол «Times» отображает время работы блоков кода.

Обратим внимание еще на несколько функции SAT: фильтр и сравнение трассировок, Tips and
Trick.

Фильтр позволяет уже в существующей трассировке убрать ненужные вызовы

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Тогда данные на всех вкладках будут отображаться с учетом этого фильтра.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Evaluate –

Во-первых, нужно сделать, чтобы трассировки были отформатированными

Можем сравнивать Hit и Call Hierarchy.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Раздел Tips and Tricks

Сборник конструкций кода и, по сути, рекомендаций, как должен выглядеть


аккуратный/производительный код.

Useful links
https://blogs.sap.com/2007/11/13/the-abap-runtime-trace-se30-quick-and-easy/
https://archive.sap.com/discussions/thread/817524
https://blogs.sap.com/2009/12/11/abap-runtime-analysis-se30-how-to-analyze-abap-program-flow/
https://archive.sap.com/discussions/thread/720494
https://blogs.sap.com/2011/01/18/next-generation-abap-runtime-analysis-sat-introduction/
https://blogs.sap.com/2011/01/18/next-generation-abap-runtime-analysis-sat-how-to-analyze-
performance/
https://blogs.sap.com/2011/01/18/next-generation-abap-runtime-analysis-sat-how-to-analyze-
memory-consumption/
https://blogs.sap.com/2011/01/18/next-generation-abap-runtime-analysis-sat-how-to-analyze-
program-flow/

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Книга «Рекомендации по оптимизации программ на языке ABAP, О.Точенюк

Транзакции ST12: Single transaction analysis


Транзакция ST12 предоставляет возможность анализа доступа к базе данных и внутренним
таблица и возможность анализа стэка вызова (как сказано в ноте – «матрешка» - nested Russian
puppets).

Позволяет:
1) выполнить анализ top-down (Сверху вниз) и увидеть время выполнения каждого блока;
2) найти код клиента (последний измененный код)
3) найти узкие места (там, где CPU очень загружен)

Начальный экран транзакции ST12 состоит из нескольких кнопок, определяющих, что именно
нужно трассировать и как.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

User / Трассировка по пользователю и задаче


Tasks
Workproc Выбор сервера и рабочего процесса на сервере
ess
Current Указание транзакции / программы для запуска
Mode
Schedule Трассировка по расписанию (для фоновых заданий): можно сделать трассировку по
расписанию фоновое задание, на рабочий процесс или пользователя
Блок ABAP Отмечаем параметры ABAP-трассировки (трассировка стэка и времени
trace выполнения)
(слева)

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Блок Отмечаем параметры трассировки производительности


Performan
ce traces

Давайте сделаем трассировку транзакции Z8M1_ALV_PO в режиме Current Mode

После выполнения действий – система начнет собирать трассировку.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

После небольшого (зависит от количества выполненных действий) нажимаем на кнопку Full screen

Если трассировка собрана, то будет одна из пиктограмм

«Зеленая галочка» – трассировка собрана без ошибок; «желтая молния» - трассировка собрана, но
с ошибкой.

Выделяем нужный нам файл трассировки и переходим в ABAP или SQL-анализ.

SQL-анализ – это по сути вызов транзакции ST05 (вспомним бегло, что показывает) – показать
Duration.

Интересным является – ABAP-трассировка

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Кнопка «Per ModUnit» позволяет агрегировать результат

Система агрегирует результат по блокам

Мы сможем увидеть продолжительность каждого блока (нам также доступы сортировка/фильтр)

Также мы можем видеть, из чего состоят блоки

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Выделяем нужный нам блок и нажимаем кнопку TopDown call tree; система отобразит иерархию
вызовов с точки зрения конкретного блока кода.

Мы можем переходить в строку кода, которая обеспечивает вызов.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Этот список может быть полезен для анализа узких мест и кода клиента.

Useful links
https://blogs.sap.com/2009/09/08/single-transaction-analysis-st12-getting-started/
https://blogs.sap.com/2013/07/17/st12-trace-step-by-step-instruction-on-how-to-use-it-for-analysis/
755977 – ST12 “ABAP Trace for SAP EarlyWatch/GoingLive”
https://wiki.scn.sap.com/wiki/display/ABAP/Single+Transaction+Analysis?original_fqdn=wiki.sdn.sap.
com
https://blogs.sap.com/2009/10/30/st12-storing-additional-information-and-managing-traces/

Транзакции ST22: Runtime errors


Транзакция ST22 представляет собой отчет по динамическим ошибкам, возникшим в системе. Это
одни из показателей (количество дампов), которые можно применять к оценке стабильности
системы.

Перечень содержит информацию по всем пользователям системы.

Таблица SNAP (а именно в ней хранятся данные по дампам) обычно очищается через каждый
период времени; но если Вам нужно сохранить дамп и чтобы он не исчез из системы, то нужно
нажать кнопку «Keep/Release»

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Возникновение дампа в системе может быть по разным причинам и исправление дампа тоже
может быть различное.

При двойном щелчке на дампе – мы можем увидеть подробную информацию о нем.

Мы можем увидеть краткое описание, а также перейти к место кода, где случилась проблема.

И мы можем посмотреть значения переменных, в момент дампа, а также стэк вызовов.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Популярные дампы и пояснения к ним в таблице

SYSTEM_NO_ROLL Нехватка внутренней памяти: либо нет


TSV_TNEW_PAGE_ALLOC_FAILED проверка на for all entries в выборках на
SQL_CAUGHT_RABAX больших таблиц (Типа VBRK/VBRP, LIKP, LIPS и
т.д.), либо программа просто неоптимально
выбирает (либо вообще без ограничений)
.

Если в описании дампа идет описание о


программе ??????? (вопросики) – это может
быть SUBMIT на пустой программе.

SYNTAX_ERROR Синтаксическая ошибка в коде.

Классический случай, когда что-то забыли


перенести; перенесли частично; или
перенесли то, что не стоит переносить.

Например, в программе идет обращение к


элементу структуры, которого не существует.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

CONVERT_NO_NUMBER В программе идет попытка преобразовать


нечисло к числовому типу данных
DYNPRO_MSG_IN_HELP Программа выдает сообщение такого типа, что
не соответствует месту в программе.

Например, Warning в модулях обновления.

GETWA_NOT_ASSIGNED Обращение к неприсвоенной переменной


(field symbol).

Если это код клиента, то нужно исправлять код


и/или не использовать программу с таким
набором данных, что он приводит к такой
ситуации.

Если это стандартная программа, то нужно


проанализировать данные – все ли правильно
и корректно?
«Нет ли попытки продать несуществующий
материал?» «Или провести документ в
неизвестной валюте?»

Таким образом, дамп может быть связан либо


с ошибочными данными, либо с кодом,
который явно в дампе не фигурирует, но
влияет на данные.

Для стандартных программе нужно


посмотреть ноты и/или выставить сообщение
в SAP SUPPORT.

CALL_FUNCTION_CONFLICT_LENG Вызов ФМ с неправильными параметрами


(либо с отсутствующими, либо
несоответствующими по типу).
MESSAGE_TYPE_X Возникла ислючительная ситуация.
RAISE_EXCEPTION Если программа стандартная – то нужно искать
ноту или выставлять сообщение в SAP.
При этом нужно иметь ввиду, что возникшая
ситуация не обрабатывается стандартом и
значит, возможно, дело в том, что бизнес
данные так сложились, что для SAP ERP это
неприемлемо.
Например, в таблице вариантов для
конфигурации (транзакция CU60 неприемлемо
ведение дублированных значений) (это
логично, так как в случае дублирования
вариант не может быть однозначно
определен), однако в самой транзакции
проверки на это нет; а вот при конфигурации
сбытового заказа может возникнуть дамп.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Для стандартных программе нужно


посмотреть ноты и/или выставить сообщение
в SAP SUPPORT.

CALL_FUNCTION_NOT_REMOTE Вызов ФМ для RFC-обновления (BACKGROUND


task), который не предназначен для таких
операций.
DYNPRO_FIELD_CONVERSION Попытка показать отрицательные значения в
полях экрана без знака.

LOAD_PROGRAM_NOT_FOUND Попытка вызвать несуществующую программу.


Возможно, через SUBMIT.
LOAD_PROGRAM_MISMATCH Идет перенос программы.
При этом в процессе переноса (генерации)
кто-то работал в этой программе.

По этой причине запрещено переносить юзер-


экзиты и другие расширения в течение
рабочего дня.
(только в исключительных ситуациях).

Useful links
https://help.sap.com/saphelp_nw73/helpdata/en/b1/34ab1cd8e44562b0fee9524c638cca/content.ht
m
https://help.sap.com/saphelp_nw73/helpdata/en/b1/34ab1cd8e44562b0fee9524c638cca/frameset.
htm
1699048 - Unexpected short dumps in ST22
2200714 - Dumps in ST22 show ?????? in ALV list

Транзакции S_MEMORY_INSPECTOR: анализ памяти


Позволяет оценить использование памяти; найти наиболее крупные по памяти объекты.

Чтобы оценить использование памяти, нужно сделать memory snapshot.

Это можно сделать прямо из транзакции

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Тогда в транзакции S_MEMORY_INSPECTOR появится запись, которую можно анализировать

Useful links
https://help.sap.com/saphelp_nw70ehp2/helpdata/en/49/243804855616b6e10000000a42189d/fra
meset.htm
https://help.sap.com/saphelp_nw70ehp2/helpdata/en/49/255a8a29ac16b7e10000000a42189d/fram
eset.htm

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

https://archive.sap.com/discussions/thread/3230957
https://help.sap.com/saphelp_nw70ehp2/helpdata/en/49/243804855616b6e10000000a42189d/fra
meset.htm
https://help.sap.com/saphelp_nw70ehp2/helpdata/en/34/f0b36353a34bdba328ce4f717d16c6/fram
eset.htm
А также приложенная статья.

Теперь рассмотрим инструменты по проверке статичного кода, а не кода в Runtime (кода во время
выполнения). Эти инструменты помогают предварительно оценить код, еще до того, как он может
причинить проблемы производительности.

Транзакции SLIN и SCI могут быть полезны при сдаче разработки (когда Вы отдаете Вашу
разработку заказчику и когда, наоборот, принимаете). Транзакции позволяют обратить внимание
на недочеты в коде программы, которые возникают вследствие «вольности или ускоренности
разработчиков» (например, хард код, создание переменных не по convention и прочие вольности
для ускоренного написания кода)

Расширенная проверка кода (SLIN)


Эта транзакция для проверки кода, я бы сказал, на чистоту.

В процессе разработки могут создаться переменные, участки кода, которые в дальнейшем были
заменены другими, тем не менее они остались в коде. Эта проверка поможет выявить такие
участки кода. Кроме того, в случае интернационализации/локализации (когда используется
несколько языков) этот инструмент укажет, где нужно использовать text-ttt (инструмент считает,
что такую конструкцию везде нужно использовать).

Давайте рассмотрим этот инструмент и что он может проверять/а что не может на пример
программы Z_8M2_XL_UPL. Запуск расширенной проверки делается либо с помощью транзакции
SLIN либо непосредственно из меню работы с программой (SE38 / SE80)

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

На первом экране в качестве галочек представлено, что можно проверять. Каждая галочка, в
целом, говорит сама за себя; но если сделать F1 по любой галочке, система даст более подробную
справку о том, что именно проверяется.

Однако давайте сделаем пример использования инструмента, чтобы понять саму суть этой
проверки; нажимаем кнопку Run Checks (набор галочек оставляем как по умолчанию)

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

После запуска система отобразит результаты проверки. Поставим курсор, например, на строку
MESSAGES и нажмем кнопку Display Single Text. Система уже более конкретней отобразит, что
именно она проверяет.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Мы видим, что это был одним из пунктов проверки в сообщении (MESSAGE)

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Если нажмем на кнопку «Dipslay Results», предварительно выделив сообщение о проверке, то


получим в списке только отсылку кода по этой проверке; а если Display All Results, то все
результаты проверки.

Система указывает, что число параметров различно в сообщение (в классе сообщений) и в


количестве передаваемых параметров.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Мы можем перейти к коду в режиме просмотра или в режиме исправления

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Видим, что в сообщении только один параметр

Видим, что SLIN отрабатывает корректно 

Пройдемся по остальным ошибкам

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Делаем вывод, что этот инструмент направлен на создание чистого кода. SLIN можно
использовать для одной программы (или программы, включающей несколько INCLUDE),
результаты в этом случае будут не очень объемными и их можно обработать. Лучше делать
непосредственно перед сдачей проекта и делать выводы, чтобы не попадаться на проверках. Для
более расширенной проверки существует другой инструмент – SAP код инспектор (SCI).

Useful links
https://wiki.scn.sap.com/wiki/display/ABAP/Extended+Program+Check

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Код инспектор (SCI – SAP Code Inspector)


Код инспектор практически аналогичен по смыслу транзакции SLIN, но:

1) Может делать проверку по нескольким объектам (программам, классам, функциям,


пакетам)
2) Мы можем настраивать статус той или иной проверки: делать ее красной/запрещающей,
желтой/предупреждающей, зеленой/информационной.

Инструмент можно запустить из транзакции SCI или непосредственно из программы

Рассмотрим быстрый вариант использования.

Система выдаст результат с соообщениями/статусами. Их нужно посмотреть и принять меры.

Результат мы можем просмотреть не только в дереве, но и таблице.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Иногда то или иное замечание code inspector нельзя (или будет неэффективным) исправить и
тогда нужно указать рядом с нужным участком кодом – псевдокод.

Какой именно псевдокод – можно посмотреть в информационном блоке

Второй способ – через создание варианта инспекции: либо с сохранением инспекции


(транзакция SCI) либо без сохранения (транзакция SCII).

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

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Отмечаем галочками и задаем правила для того, что нужно будет проверять.

Например, уже на этом этапе мы можем найти потенциальные дампы «append <sorted_tabel>»

Проверка на assign

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Или «понижение производительности» за счет отсутствия проверки на FOR ALL ENTRIES

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Для контроля «за растрастанием» какого-то определенного класса мы можем поставить проверку
о количестве методов в нем

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

И (важно для будущей поддержки программ = NAMING CONVENTIONS / Programming Conventions)

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Мы можем определить какие переменные должны начинаться с определенного имени (так


называемую свою «Венгерскую нотацию» (разработана в Microsoft))

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

После отметки всех нужных проверок – сохраняем вариант инспекции.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Теперь переходим к самой инспеции

Укажем проверяемый объект, укажем вариант инспекции (обращаем внимание, что нужно
разделять личные и общие варианты) и можно запускать проверку

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Мы можем запустить фоново или онлайн

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

И ожидаем выполнения.

По завершении система выдаст сообщение

Идем в результаты

И мы можем видеть результат того, что SAP думает по поводу нашего кода, по каждому
обозначенному пункту.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

https://blogs.sap.com/2013/09/19/how-to-trigger-atc-or-code-inspector-checks-during-the-release-of-
a-transport-task/

Сканнер кода
Транзакция CODE_SCANNER позволяет искать сканировать код на наличие в ней определенной
строки. Например, если нам нужно найти где используется параметр памяти, какая-нибудь
константа или комментарий.

Позволяет ограничить пакетом, пространством имен.

Например, вы хотите узнать, где используются переменные с именем ZALV_TEST или оператор
WRITE в пакете

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Запускаем и получаем результат. Мы увидели еще одно преимущество использования


вышестоящих пакетов (superpackage).

Естественно, поиск может быть слишком большим и поэтому иногда стоит запускать эту
программу в фоновом режиме – система это позволяет

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

WHERE USED List – функция «где используется»


В ABAP есть полезный и удобный инструмент, который привязан практически к любому объекту
словаря – это показ списка, где используется данный объект. Например, мы хотим знать, где
используется тип таблицы ZTZ8M_MAILS_TAB: заходим в транзакцию SE11

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Обозначаем объекты, которые следует учитывать и запускаем поиск.

Система выдаст объекты, где используется данный объект

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

То же самое можно сделать с таблицей или полем таблицей или сообщением (что бывает
полезным для поиска места, где возникает сообщение). Заходим в транзакцию

Однако, этот инструмент не учитывает динамического вызова переменных. Тогда нужно ставить
ТЗ или принимать во внимание то, что когда-то сообщение придется искать. Вот как нужно
поступать в случае динамического сообщения или сообщения в IDOC.

Пример: COCI_CONFIRM_MATERIAL_CONS строка 693. Почему так сделано? Идет сообщение в


журнал, но в будущем с помощью этого инструмента мы сможем найти, где возникла ошибка и
быстрее найти нужный код.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Поиск нот и расширений


Механизм ANST (automated notes search) хорошо описан в ноте 1818192 - FAQ: Automated Note
Search Tool.

Это удобный и быстрый инструмент для поиска кода клиента, настроечных таблиц и нот
(применимых и установленных).

Выполняем действия (например, проходим к ценам или еще что-то просматриваем/изменяем


(если не va03)).

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Затем система соберет трассировку по используемым объектам вместе с компонентами (что


важно) и покажет дерево

Отмечаем нужные ветки и жмем кнопку – ноты

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Также можем просмотреть Customer code и список настроечных таблиц, которые находятся в этом
компоненте.

Трассировку можно включать/выключать с нужного по нужный момент, чтобы сократить


анализируемый объем и быстрее прийти к результату.

https://blogs.sap.com/2014/09/08/anst-start-and-stop-the-trace-whenever-you-want/

Поиск нужных BAPI для постановки ТЗ и рекомендации по их работе


и проверки
Транзакция BAPI предназанчена для поиска BAPI – нужно функционального модуля по
обновлению/чтению/созданию нужного объекта SAP.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Также можно использовать транзакции se37 с поиском

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

И транзакцию просмотра объектов – SWO1

Вторым способ для поиска стандартных доступов к объекту нужно использовать SAP NOTE и SDN
Community.

Для тестирования BAPI нужно иметь ввиду функционал Test sequence. Заходим в транзакцию SE37
на просмотр и переходим по меню.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В sequence можно вызвать и COMMIT через BAPI_TRANSACTION_COMMIT.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Тестовые варианты:
TEST_DONE_DATA
test_cond_ZAP0_7
c WAIT

Поиск полей через группу таблиц через ракурс DD03VT


Для поиска поля по тексту среди группы таблиц полезно иметь ввиду ракурс DD03VT.

Покажем на примере.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Указываем краткое описание, где содержится поле *Delivery*

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

И получаем все поля, где есть слово Delivery

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Поиск enhancement через таблицу ENHINCINX и ENHLOG


Для поиска расширения или проверки изменений или существования расширений полезно иметь
ввиду таблицы: ENHINCINX и ENHLOG.

Обычно (с учетом пространства имен) ENHANCEMENT в системе не так много и по имени мы и по


Program Name мы можем определить, где Enhancement используется.

А через таблицу ENHLOG мы можем определить, какие ENHANCEMENT изменялись за


определенный период и кем.

С помощью указанных таблиц можно сократить время на поиск информации о таблицах и


enhancement.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В SAP ERP имеются типовые и общие приложения/программы, которые участвуют (или могут
участвовать) во многих бизнес-процессах/разработках. К таким «типовым приложения» относятся
печатные формы (pdf-формуляры/Adobe, smartforms, sapscript), обработка IDOC, код в customer
function, user-exit, Enhancement, BTE, substitution, ALV-отчеты, анализ полномочий пользователя,
события WF, создание XML-файлов.

Печатные формы
Инструменты работы с печатной формами в определенной мере стандартизированы. При разборе
ошибки с печатной формой (любого вида) нам нужно, прежде всего, определить правильно
программу печати, сам объект формуляра.

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


NACE (для логистики). Таблица TNAPR (и подобные ей в других модулях, например, T390)
содержит информацию о присвоение программы и формуляра. Однако это таблица и ее
использование в программах печати является хорошим тоном. Хорошим, но не обязательным и по
факту таблица используется в ~70% случаях. В программе формуляр может быть указан через hard
code, а также подменяться динамически. Существуют точки в программах печати, на которые
стоит обращать внимание.

Запись в таблице TNAPR говорит о том, что в программе ZV_RVADOR01 будет вызвана
подпрограмма ENTRY.

Непосредственный вызов output


Это делается в программе RSNAST00, строка с кодом perform (tnapr-ronam)

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Однако в разных модулях вызов программы может делаться по-разному, кроме того довольно
много отдельно стоящих программ, в которых логика определения блока кода для формуляра и
самого формуляра может быть специфической (вплоть до того, что она будет динамической);
поэтому важно знать через какие блоки вызывается формуляр.

Вызов формуляра – SAPSCRIPT


Для SAPSCRIPT точку останова нужно поставить в функциональном модуле OPEN_FORM. Поставим
точку останов в function OPEN_FORM (зайдем через SE37 и поставим там точку). Затем выведем
формуляр BA00 через SE37.

Система остановится в указанном ФМ; с помощью стэка вызовов мы «поднимемся выше» и


установим имя формуляра и программу.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Более того, имя формуляра sapscript

В строчке IN мы видим язык и ID-формуляра

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Язык: E
Код формуляра: ZSD_RVORDER02

Теперь посмотрим, как попадают значения на экран в sapscript

Для этого зайдем в формуляр через транзакцию SE71 и посмотрим, как он выглядит (обратим
внимание на язык).

Переходим в Layout

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Выделяем нужный блок

И переходим в код блока (это sapscript-код).

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Мы видим, что значения берутся из переменных программы; то есть переменные не передаются,


а просто берутся из программы; в большинстве случаев это глобальные переменные программы.

Также обратим внимание на FORMAT TAG типа E/ - это начало блоков, которые могут быть
повторены в Window main (и только в этом окне они могут быть повторены).

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

При этом в самой программе будет указано какие окна/блоки выводятся.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Вывод: переменные в SAPSCRIPT контролируются через программу, и вывод блоков тоже


контролируется программно. Сам по себе подход SAPSCRIPT базируется на «длинных текстах»
(SO10); на смену sapscript пришли другие подходы в печати.

Синтаксис вывода (ограничение длины, жирный шрифт – можно указывать как через стили, так и
через дополнительные операторы). Подробнее здесь

https://wiki.scn.sap.com/wiki/display/ABAP/SAPscript#SAPscript-HowcanIdebugmySAPscript?

Формуляр SAPSCRIPT можно отлаживать, что облегчает взаимодействие; в SE71 предварительно


активировать отладчик

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Дополнительный код в SAP SCRIPT можно вложить с помощью вызова подпрограмм из кода
SAPSCRIPT

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Вызов формуляра – SMARTFORMS


Справедливы точки, показанные ранее.

При создании формуляра на основе SMARTFORM за кадром гененрируется функциональный


модуль (при активации формы), который обрабатывает всю информацию

Надстроечные таблицы типа TNAPR / T390


perform (tnapr-ronam) в программе RSNAST00
Вызов фм OPEN_FORM (не всегда)
Просмотр формуляра через OTF Имя формуляра в smartforms обычно длинее,
чем имя SAPSCRIPT

ФМ SSF_FUNCTION_MODULE_NAME Определяем имя формуляра

Рассмотрим программу SF_EXAMPLE_01 с формуляром SF_EXAMPLE_01.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Система остановится в этом ФМе и мы можем определить параметры: как формуляр, так и
программу.

Как видим, имя ФМа - /1BCDWB/SF00000001. Это динамически сгенерированное имя. Именно на
его основе можно сравнивать версии и ставить точки останова в самое смартформе.

Давайте найдем код в сгенеренном ФМе

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

При очередном запуске программа остановилась

Смартформы предоставляют выше гибкость при выводе таблиц, окон и в целом всех блоков кода;
но эта гибкость достигается структурированностью этой формы.

Теперь рассмотрим, как передаются значения из программы в SMARTFORM.

Во1ых, у нас есть интерфейс смартформы, через который мы передаем результат.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Через эти параметры передаются из программы в smartforms и мы можем их использовать.

Во 2ых у нас есть глобальные переменные

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Которые мы можем заполнить уже внутри SMARTFORM и использовать для заполнения значений
ячеек и таблиц.

В ячейках мы можем указать «твердый текст», ссылку на текст из SO10 (стандартный длинный
текст).

Или переменные из выше обозначенных источников (глобальные и параметры импорта).

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Дополнительный код может быть привязан практически в любом месте

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

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

PDF-формуляры
PDF формуляры работают посредством дополнительной службы ADS. Эту функциональность
нужно встраивать отдельно. Более того, чтобы была возможность просматривать шаблоны
формуляров нужна специальная программа Adobe Lifecycle Designer. Ее можно скачать с SAP
Service Market Place (обычно это может сделать только базис, то есть супер-пользователи).

Для проверки работы сервера ADS, а также ознакомление с возможностями PDF, можно
использовать программы FP_TEST_*.

Запустим программу FP_TEST_03

Надстроечные таблицы типа TNAPR


И больше ничего 
https://help.sap.com/erp2005_ehp_04/helpdata/en/46/2d15ce7f944250e10000000a1553f6/framese
t.htm

https://help.sap.com/doc/saphelp_erp60_sp/6.0/en-
US/fc/eb2d5a358411d1829f0000e829fbfe/frameset.htm

https://help.sap.com/erp2005_ehp_04/helpdata/en/46/2d15ce7f944250e10000000a1553f6/framese
t.htm

Для pdf-формуляров – в функциональном модуле FP_FUNCTION_MODULE_NAME. Нужно иметь


ввиду функциональный модуль FP_FUNCTION_MODLUE_NAME – через него от имени формуляра
происходит переход к имени динамически сгенерированного ФМа.

Аналогично с помощью стэка мы можем получить и имя формуляра, и имя программы.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

PDF-формуляры могут быть интерактивными и редактируемыми на стороне пользователя (для


этого задаются специальные свойства полей).

Данные в формуляр из программы попадают через интерфейс и через глобальные переменные.

Дополнительный код в PDF-формулярах – код инициализации и FormCalc

Код инициализации в интерфейсе.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Код инициализации

Код FormCalc предназначается для управлением состояния того или иного элемента:
открыть/скрыть элемент, если значение одной ячейки, то окрасить в определенный цвет и т.д.

FormCalc не имеет отладчика. Значение переменных можно выводить при помощи оператора для
вывода сообщений – messageBox()

https://blogs.sap.com/2014/06/23/how-to-debug-adobe-interactive-forms-with-javascript-or-formcalc/

Детальная справка по работе с FormCalc не предоставляется SAP, а предоставляется Adobe

http://help.adobe.com/en_US/livecycle/10.0/DesignerScriptingBasics/index.html

К сопровождающим материалам прилагаются инструкция по работе с FormCalc.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Трассировка и тестирование PDF-формуляров


1) В тестовой\продуктивной системе запускаем SFP – Утилиты – Параметры настройки.
Ставим трассировку уровень 4

2) Выводим на экран нужный пдф, например VA03 – вывести…


3) Выводим панель инструментов Adobe, у меня для этого нужно подвести курсор к верхней
части окна. Жмем закорючку

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

4) Жмем скрепку, сохраняем XFD.xml (лучше как <вид вых. документа>.xml , например
ZSPE.xml )

5) В системе разработки запускаем SFP, открываем редактор формуляра, правой кнопкой на


Preview PDF, Form Properties…

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

6) Preview – Data File

Значения в поля попадают через интерфейс

Выгрузка в Excel
Стандартный подход к выгрузке в Excel у SAP – это выгрузка при помощи OLE. Однако, энтузиасты-
разработчики создали свои подходы (продукты), которые позволяют выгружать в Excel.

Подход
Выгрузка через Если выгрузка идет этим способом, то точку останова нужно
ZWWW_OPENFORM ставить в ФМ ZWWW_OPENFORM

Автор: Parazit 

http://sapboard.ru/forum/vi
ewtopic.php?f=13&t=4880&
view=unread#unread

Abap2xlsx Если выгрузка идет этим способом, то ставим точку останова на


оператор

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

https://wiki.scn.sap.com/wik
i/display/ABAP/abap2xlsx Call transformation (с помощью этого оператора идет создания xml
файлов; затем с помощью стэка можно прояснить ситуацию для
себя)

Идем классы по маске *EXCEL*WRITE* (но имена классов для


каждой системы могут меняться - это не очень надежный способ).
XLSX Workbench Если выгрузка идет этим способом, то ставим точку останова на
оператор
http://sapland.ru/articles/st
ats/sozdanie-excel-phorm-v- Call transformation (с помощью этого оператора идет создания xml
xlsx-workbench.html файлов; затем с помощью стэка можно прояснить ситуацию для
себя)
https://blogs.sap.com/2014/
04/22/xlsx-workbench/

ALV-отчет: типовая программа


Рассмотрим типовую программу по ALV отчету и основные точки, с помощью которых можно
сократить время на поиск информации о коде/работе алгоритма в программе.

Полезное сочетание клавиш: Ctrl+Shift+[правая кнопка мыши] на любом пустом месте ALV Grid.

При работе с ALV первостепенными вопросами являются:

1) С помощью чего выводится результат: с помощью CL_GUI_ALV_GRID или


REUSE_ALV_GRID_DISPLAY?

Ответ на этот вопрос можно получить, поставив точку останова на метод


SET_TABLE_FOR_FIRST_DISPLAY класса CL_GUI_ALV_GRID и функциональный модуль
REUSE_ALV_GRID_DISPLAY.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Из стэка мы видим, что используется объектный подход.

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

Также, когда программа остановится мы можем дать ответ на второй вопрос.

2) В каком месте программы производится непосредственный показ данных и какая


внутренняя таблица непосредственно отвечает за сбор данных внутри программы?

Также мы видим, что на вход этому методу подается внутренняя таблица - me->T_OUTTAB[]

Именно она и является ключевой при сборе данных отчетом.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

3) В каком месте программы определяется набор полей для отображения?

Мы видим также, что на вход метода подается параметра-таблица it_fieldcatalog

Эта таблица отвечает за каталог полей (за то. какие поля будут отображаться, а какие будут
скрыты). Через поиск по коду текста программы или через точку наблюдения можно определить,
где заполняется эта таблица.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

4) В каком месте программы определяется набор кнопок и текстов (GUI статус)?

В объектном подходе набор кнопок в ALV определяется в методе, который является


обработчиком события (event handler) для события CL_GUI_ALV_GRID : TOOLBAR.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Также кнопки могут добавляться и обрабатываться с помощью экрана. Тогда нужно поставить
точку останова на оператор SET PF-STATUS.

Из стэка мы видим, что вызывается экран 9000 в функциональном модуле Z_Z8M1_SCR9000. (все
это находится в программе SAPLZ8M1_PO_TOOL, группе функций Z8M1_PO_TOOL ).

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

5) В каком месте программы происходит обработка действий пользователя?

Нужно определить экран, в котором открывается ALV-экран (мы это определили на предыдущем
шаге) и зайти в PAI модуль.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Чтобы познакомиться подробнее с возможностями ALV можно зайти в пакет SLIS и посмотреть на
программы. Здесь представлены практически все возможности ALV.

Формирование IDOc: ключевые моменты


IDOC формируется с помощью функционального модуля, предназначенного для типа сообщения.

При работе с iDoc полезно знать следующие транзакции

Транзакция Описание
WE02 = Отчет по обработанным IDOC со статусами.
WE05 Из конкретного IDOC мы можем узнать тип сообщения, настройки
партнера
WE20 Проверка настроек партнера
WE30 Просмотр типа IDOC.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Можно посмотреть как стандартную часть IDOC, так и расширение IDOC.


WE57 Присвоение типа сообщение и IDOC. Также можно увидеть ФМ-обработчик
конкретного типа сообщения.
Именно с помощью такого способа можно быстро установить, какой ФМ
обрабатывает конкретный тип сообщения.
WE82 Присвоение типа сообщения и типа IDOC
WE19 Инструмент для создания IDOC.
Можно создать файл IDOC "с нуля", а можно создать по образцу от
существующего IDOC и внести изменения.
BD87 Перезапуск IDOC.

В целом, при работе с IDOC полезно иметь ввиду следующее меню

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Пример порядка действий при "упавшем IDOC"

Прежде всего, нужно прочитать сообщение об ошибке (если оно есть). Причина "падения" IDOC
может быть не связанна напрямую с бизнес-процессом. Это могут быть: нерасширенные данные,
неприсвоенные орг.структуры; по таким проблемам система явно обозначит причину через
сообщение и Вы сэкономите свое время на исследования.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Для просмотра сообщений к IDOC щелкаем по нему дважды в списке и переходим к


соответствующей части в дереве IDOC.

С помощью транзакции WE57 мы можем определить ФМ, с помощью которого идет обработка
IDOC данного типа.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Эти данные хранятся в таблице EDIFCT (IDoc: Assignment of FM to log. message and IDoc type)

В найденном ФМ мы можем поставить точку останова и детально просмотреть, почему


произошло сообщение об ошибке.

Также мы можем активировать режим отладки непосредственно через транзакцию WE19

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

При отправке IDOC через выходные документы удобно использовать программу RSNAST0D
(Generic output issue). С ее помощью можно тестировать выходные документы; и если к
выходному документу привязан IDOC, то данную программу весьма удобно использовать.

Batch Input: пакетный ввод


Пакетный ввод данных (batch input) - это программное заполнение полей экрана, имитирующее
действие пользователей. Мы можем записать пошагово действия пользователя и затем повторять
эту операцию столько раз, сколько нам нужно, меняя данные.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Для использования пакетного ввода необязательно даже писать отдельную программу можно
использовать возможности регистратора пакетного ввода.

К регистратору пакетного ввода (Batch Input Recorder) можно перейти практически из любого
экрана SAP

В открывшемся экране нажимаем New Recording (Новая запись)

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Система откроет указанную транзакцию, где мы должны указать данные. По завершению


транзакции (когда сработает явный COMMIT), система выдаст данные для пакетного ввода с
именами программ, экранов и команд.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Эти данные дают нам возможность:

1) во-первых, прогнать их по новой с изменёнными данными с помощью кнопки Process

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

мы можем выбрать различные режимы обработки для пакетного ввода

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Выбрав режим A - мы пройдем пошагово по каждому экрану и сможем контролировать ввода


данных в каждое поле на каждом экране, а также каждую команду после ввода данных.

Выбрав режим E - система остановится только на тех экранах и полях, где будет какая-либо
ошибка; ошибка может быть связана как с логикой проверки бизнес-данных, так и с ошибками в
самом пакетном вводе (например, не предусмотрены данные для какого-либо экрана или
используется ошибочная команда).

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

2) С помощью кнопок Import/Export мы можем перенести запись между системами (или


сохранить себе на диск для дальнейшего использования)

3) создать свою собственную ABAP-программу по обновлению данных.

в ABAP пакетный ввод может быть использован при помощи оператора CALL TRANSACTION using
bdc_data.

http://help-legacy.sap.com/abapdocu_70/en/ABAPCALL_TRANSACTION_SHORTREF.htm

https://help.sap.com/saphelp_erp60_sp/helpdata/en/fa/09715a543b11d1898e0000e8322d00/framese
t.htm

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

В ABAP-коде нам нужно будет заполнить данные для пакетного ввода (которые мы получили на
шаге выше) и вызвать оператор CALL TRANSACTION с соответствующими параметрами

Более того, чтобы пошагово просмотреть выполнение пакетного ввода, вызываемого через
самописный ABAP-код нужно импользовать параметр opt-dismode. Этот параметр может
принимать значение E (режим только ошибок), A (видимый режим) и другие.

Клиентский код (Y|Z-код)


Существуют различные способы расширения системы. В каждом модуле развита своя концепция
ведения расширений (написание клиентского кода). Давайте рассмотрим самые популярные и
рекомендованные.

Замещения в модуле FI

Замещения в модуле FI делаются с помощью транзакции OBBH

Подробнее о замещениях в FI можно почитать тут

http://sapland.ru/articles/stats/rabota-s-zamescheniyami-fi.html

http://sapland.ru/articles/stats/rabota-s-zamescheniyami-fi-chasti-2.html

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Для отладки замещений (проверки вызываются ли какие-либо замещения и изменяют ли они


какие-либо данные) можно поставить точку останова в модулях

FI_SUBSTITUTION_DOC
FI_SUBSTITUTION_HEADER
FI_SUBSTITUTION_ITEM

и проверить значение до и после. Таким образом будет понятно, стоит ли исследовать замещения
FI или дело в чем-то другом.

Замещения в модуле PS

Замещения доступны и в модуле PS; принцип работы с замещениями в PS не отличается от


принципов работы в FI, но для работы с замещениями используется другая транзакция - OPSN /
OPSI .

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Работа с расширениями в PS описана в нотах (и в связанных с ними нотах тоже есть полезная
информация):

https://launchpad.support.sap.com/#/notes/358473

https://launchpad.support.sap.com/#/notes/440186

Замещения в модуле CO

Замещения доступны и в модуле PS; принцип работы с замещениями в PS не отличается от


принципов работы в FI, но для работы с замещениями используется другая транзакция - OKC9.

Полезная информация о работе с CO-замещения приведена в нотах (а также в связанных с ними


нотах)

https://launchpad.support.sap.com/#/notes/201897 (201897 - Info: Validatn/substitution for CO-


internal postng)

https://launchpad.support.sap.com/#/notes/2221237/E (2221237 - FAQ in CO-PA (Part III. of note


553626))

https://launchpad.support.sap.com/#/notes/392273/E (392273 - When is validation/substitution


called?)

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Надо также заметить, что работа с замещениями (по всем модулям и событиям), а также
Validation можно выполнить в транзакции GGB0 и GGB1.

В пакете GVAL также представлены другие полезные транзакции при работе с замещениями.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Деривация в модуле CO

С помощью деривации можно передать данные в контроллинговый документ при проводке из


SD/MM/FI. С помощью деривации можно ввести как постоянные значений, так и значения из
промежуточной таблицы.

Деривацию можно выполнить в транзакции KEDR.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Полезные ссылки приведены в таблице ниже по степени полезности.

1 https://wiki.scn.sap.com/wiki/display/ERPFI/Top+down+Distribution+explained+with+an+exampl
e
2 https://wiki.scn.sap.com/wiki/display/ERPFI/Troubleshooting+Guides+-+COPA
3 https://wiki.scn.sap.com/wiki/display/Community/Add+User-
Defined+Characteristics+to+Operating+Concern
4 https://launchpad.support.sap.com/#/notes/932912/E
(KEDR: Termination after table access)
5 https://wiki.scn.sap.com/wiki/display/ERPFI/How+to+analyze+derivation+analysis
6 https://wiki.scn.sap.com/wiki/display/ERPFI/Derivation

BTE - Business Transaction Events (Open FI)

Представляют из себе Функциональные модули, которые вызываются в определенных точках


системы. Эти точки называются событиями.

События и связанные с ними ФМ (которые можно заменить или дополнить) определенны в


транзакции FIBF.

К материалам этого курса прилагается памятка по работе с BTE.

Также при работе с BTE могут быть полезными ссылки, перечисленные в ниже

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

1 http://sapland.ru/articles/stats/bte-business-transaction-events-2.html
2 https://wiki.scn.sap.com/wiki/display/ABAP/BTE+-+Business+Transaction+Event
3 https://blogs.sap.com/2014/05/13/how-to-search-bte/

Customer Function

Используются в различных модулях: QM, MM, SD и других.

Customer Function - Это функциональный модуль, в котором есть Z-инклюд, в котором можно
писать код клиента.

Вызываются данные ФМ через оператор call customer-function (по этому оператору в программе
можно найти).

https://help.sap.com/http.svc/rc/abapdocu_751_index_htm/7.51/en-US/abapcall_customer-
function.htm

Полезная информация по работе с транзакцией CMOD представлена в ноте

25276 - SAP enhancement concept CMOD: Activation

(а также в связанных нотах).

Полезные ссылки касательно Customer Function приведены ниже

1 http://sapland.ru/articles/stats/upravlenie-proektami-rasshirenii-v-sistemah-tehnika-
customerexits-polizovatelisk.html

2 https://wiki.scn.sap.com/wiki/pages/viewpage.action?pageId=107774353
3 https://wiki.scn.sap.com/wiki/pages/viewpage.action?pageId=189893877

User exit in SD/MM

Техника расширений, которая предполагает "врезку" в стандартный код своего Z-объекта.


Технически представляют собой подпрограммы, в котором видны глобальные переменные
программы.

Чтобы найти возможные user-exit можно просто зайти в программу (например, SAPMV45A) и
обратить внимание на include, помеченные комментарием user-exit.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Перейдя в include двойным кликом - из описания можно понять зачем он предназначается.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Также мы можем определить, в каком месте вызывается данная подпрограмма (либо через поиск
либо просто поставить точку останова и прогнать операцию с объектом).

Полезные ссылки по работе с user-exit приведены в таблице

1 http://sapland.ru/articles/stats/userexits-polizovateliskie-podprogrammi.html
2 https://wiki.scn.sap.com/wiki/display/ERPLO/SD+User+exits

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Формулы/предпосылки в SD/MM

Формулы/предпосылки/правила копирования - это подпрограммы, вызываемые из стандартной


программы.

При переносе новой формулы нужно не забывать помещать в запрос программу RV80HGEN.

(https://archive.sap.com/discussions/thread/118726)

При работе с формулами и предпосылками, правилами копирования используется транзакция


VOFM.

В сопровождающих материалах имеются подробные памятки по работе с этой транзакцией.

Follow-up function in QM

RCM: функции и компоненты

Настройка модуля RCM является наиболее гибкой по моему мнение, которая вобрала в себя и
BADI и BTE и принципы ООП.

Настройка модуля RCM выполняется в транзакции SCASE_CUSTOMIZING.

С помощью настроек мы можем определить функции и компоненты и привязать к ним кодовые


объекты.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

За счет гибкости и универсальности на объекте CASE можно реализовать практически любую


бизнес-сущность.

BADI

Business Add-Ins представляют из себя классы с технической точки зрения.

Это самый предпочтительный способ расширения на текущий момент. При наличии


возможности использовать BADI или неBADI следует выбирать BADI (естественно, при прочих
равных и если при этом не страдает другие показатели).

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Как показывает практика у некоторых BADI есть какая-то специфика использования, о которой
можно узнать из sap note или sdn.sap.com.

Ссылки, содержащие полезную информацию приведены в таблице

1 http://sapland.ru/articles/stats/badi-tehnologiya-vnedreniya-biznes-rasshirenii-
dopolnenii.html
2 https://wiki.scn.sap.com/wiki/pages/viewpage.action?pageId=133758980
3 https://wiki.scn.sap.com/wiki/display/SRM/BAdI+-+general+information
4 https://wiki.scn.sap.com/wiki/display/ABAP/Find+a+BADI
5 https://wiki.scn.sap.com/wiki/display/ABAP/BAdI
6 https://wiki.scn.sap.com/wiki/display/ABAP/Document+on+BADI
7

Enhancements

Enhancements spot/section – Техника расширения, позволяющая практически выполнить


внедрение пользовательского кода в любом месте стандартной бизнес-транзакции. Enhancement-
ы в системе разделяются на «явные» и «не явные». Явные точки расширения аналогично технике
Customer-exits используют специально введенный оператор, неявные же фактически присутствуют
в начале и конце логически завершенных блоков кода или структур данных. Техника
Enhancements spot/section позволяет внедрять пользовательский код в контекст выполнения
стандартного кода системы. Вы получаете доступ ко всем переменным и можете фактически
полностью переопределить логику работы системы, что является очень небезопасным, так как
может привести к серьезным сбоям в работе стандартных транзакций, в случае некорректной
реализации кода расширения. На данный момент это, с одной стороны- очень мощный механизм
расширения функциональности, а с другой стороны- самый небезопасный из всех типов
расширений. Общая рекомендация от компании SAP: если существует возможность
использования любой другой тип расширения – используйте его, технику Enhancements –
используйте только в том случае, если других возможностей влияния на выполняемый код нет.

Ссылки, содержащие полезную информацию приведены в таблице

1 http://sapland.ru/articles/stats/rasshireniya-sistemi-enhancement-framework-chasti-1.html
2 http://sapland.ru/articles/stats/rasshireniya-sistemi-enhancement-framework-chasti-2.html
3 https://wiki.scn.sap.com/wiki/display/ABAP/How+to+do+Explicit+Enhancement
4 https://wiki.scn.sap.com/wiki/display/ABAP/Enhancements+Types
5 http://sapland.ru/articles/spj/2008/1/Novaya_kontseptsiya_rasshirenii_kak_metod_sovershenstv
ovaniya_programm_SAP_bez_ih_modifikatsii.html

Как видим различные подходы к расширению системы сводится к созданию отдельных


"инкапсулированных" блоков кода: функционального модуля, замещения, класса. При работе
с разработкой полезно записывать/обозначать эти места; тогда анализ разработки будет
происходить быстрее. Более того, в документации к разработке/функционалу также
будет правильным обозначать эти места. При работе с разработчиком также стоит
обозначать эти места, чтобы не изобретать велосипед и не плодить дополнительные
места в системе, которые могут работать не так, как ожидается; и на поиск которых
будет потрачено время.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Анализ полномочий пользователя


Проанализировать полномочия пользователя можно с помощью трассировки или оператора
AUTHORITY-CHECK.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

При этом рекомендуется включать системную отладку (/hs) – показать пример с ФМом
SMTR_KERNEL_CHECK_AUTHORITY.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

События и WF-события
Транзакции, полезные при работе с WF

SWELS Включение/отключение трассировки событий


SWEL Просмотр результатов трассировки
SWETYPV В транзакции можно увидеть связь между событие WF и задачей WF,
которая будет запущена.
SWUS Тестирование WF
SWUI Запуск WF
SWDB Создание WF. Построитель WF

Для определения нужного события WF сначала включаем трассировку в транзакции SWELS

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

С помощью кнопки Restrictions мы можем внести ограничения на трассировки (имя пользователя,


транзакция, время и т.д.)

Затем идем в нужную нам транзакцию и выполняем действия.

В моем случае, я пойду в транзакцию VA02 и сделаю изменение в документе.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

По завершению нужно действия, вернемся в транзакцию SWELS и выключим трассировку; затем


пойдем в транзакцию SWEL и просмотрим результат.

На селекционном экране мы можем задать параметры для отбора нужны результатов и запускаем
отчет. В моем случае, я запущу отчет на всех параметрах, так как трассировка была активирована
мною на непродолжительное время.

В результате мы получим объект и сработавшее событие

Мы видим, что отработали объекты:

объект BUS2032 / событие CHANGED


объект FREBUS2032/ событие CHANGEDFRE
объект BUS2032 / событие CHANGED

В транзакции SWETYPV мы можем посмотреть события WF, которые привязаны к этим событиям
объектов.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Также, чтобы найти место вызова WF можно поставить точку останова на функциональные модули

SWE_EVENT_CREATE*. Именно с их помощью можно вызвать свое событие WF или стандартное, но


вызов которого осуществляется через Z-код.

https://wiki.scn.sap.com/wiki/display/ABAP/Brief+Overview+of+Workflow+Step-Types
https://wiki.scn.sap.com/wiki/display/ABAP/Workflow+Scenario+for+PO+Change
https://wiki.scn.sap.com/wiki/display/ABAP/SAP+Business+Workflow

Сравнение версий программ


Сравнение версий объектов между системами в ландшафте полезно проводить для
интеграционных объектов (да и для не интеграционных тоже :-) ), чтобы избежать элементарных
синтаксических ошибок.

Распространенной ошибкой при работе с интеграционными является различные версии связанных


объектов (или вообще отсутствие связанных объектов). Например, определение переменной
будет лежать в TOP-include некой группы функция, а использоваться переменная будет в одном из
ФМ этой группы функций. Если перенести этот функциональный модуль без TOP-include, то
система перенесет только часть объектов, а при попытке генерации всего общего объекта
возникнет Syntax Error и, как следствие, программой/транзакцией не смогут воспользоваться
пользователи до устранения ошибки.

Сравнение версий можно проводить не только между системами, но и между версиями


программами, чтобы понять, что изменялось. Версия создается автоматически при
деблокировании запроса, в котором находится объект.

Функция "Сравнение версий" доступна практически из любого ABAP-объекта.

Рассмотрим пример из SE38.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Заходим в программу в режиме просмотра

переходим по меню

Utilities -> Versions -> Version Management

Для сравнения с предыдущей версией (например на какую-нибудь дату) - мы отмечаем нужные


версии галочкой и нажимаем Compare (F8); как результат, система выдаст нам список отличий

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Результат

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

мы можем отображать результат "в столбик" и "в строчку" - регулируется с помощью кнопки
"Single-Column/Parallel" (в левом верхнем углу)

Сравнение между системами

Для сравнения версий между системами нам нужно: выбрать версию в текущей системе, нажать
на кнопку "REMOTE Comparison" (мы можем сравнивать не только активные версии)

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

затем выбираем систему, с которой нужно сравнить объект.

Система выдаст результат

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Для сравнения версий и вообще программ между собой можно использовать транзакцию SE39

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Система откроет текст программ: слева и справа; затем нажимаем кнопку "сравнить", и система
покажет места, где программы отличаются и совпадают.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Касательно сравнения версий смартформ

При создании смартформ у нас за кадром всегда создаётся определенный ФМ и нам нужно
сравнивать именно этот ФМ.

Для определения ФМ нужно зайти в нужно смартформу через транзакцию SMARTFORMS.

Перейти Environment -> Function Module Name

Система выдаст имя функционального модуля - /1BCDWB/SF00000001.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Затем идем в транзакцию SE39 и сравниваем функции

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Вывод: мы рассмотрели приёмы анализа кода в наиболее популярных прикладных программах.


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

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

SAP shortcut и команда sapshcut


SAP shortcut – это файл ярлыка с параметрами для запуска программы SAP Logon.

В ярлыке указывается информация о системе, к которой идет подключение, а также может быть
информация о пользователе/логине/запускаемой транзакции и даже параметры в транзакции
(номер документа или параметр для запуска отчета).

Этот способ позволяет открыть документ, запустить отчет с помощью SAP Logon на основе
команды из внешней программы.

(!!!) непосредственно с помощью SAP Logon запустить любую транзакцию возможности нет;
так как не на каждое поле экрана можно найти нужный параметр и не каждое поле экрана
отображается при запуске той или иной транзакции. Например, транзакцию SE16N запустить
можно с пред указанной таблицей, а сделать выборку по определенным записям уже
затруднительно. Для преодоления этого ограничения есть другие варианты.

Расширение файла - .sap

Содержимое файла

Код

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

[System]
Name=SYSID
Description = System_Descrition
Client = 500
[User]
Name=USERNAME
Password=PW_14EC7E1AD3F538
Language = EN
[Function]
Title = SAP Easy Access
Command=SESSION_MANAGER
[Configuration]
WorkDir=C:\Users\[windows_username]\Documents\SAP\SAP GUI
[Options]
Reuse=1

В файле может быть различный набор параметров и одним из параметров может быть пароль

Password=PW_14EC7E1AD3F538

Пароль хранится в этом файле в зашифрованном виде.

Создать файлик с расширением .sap можно практически из любого экрана SAP.

Для этого нажимаем кнопку «Generates Shortcut» (например, в транзакции LSMW)

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

На следующем экране среди прочего мы можем указать параметр запуска

Мы можем указать также параметр для запуска в создаваемом ярлыке.

В данном случае, для транзакции LSMW укажем имя проекта

/SAPDMC/LSSCREEN-PROJECT=Z01

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Нажимаем кнопку Next.

Теперь мы сможем увидеть этот ярлык и использовать

При двойном щелчке по записи у нас откроется система и транзакция LSMW.

До версии 740 можно было активировать поле пароль.

Подробнее об этом в одной из статей

http://sapland.ru/articles/stats/2012/1/sozdanie-bistrogo-vvoda-parolya-v-sistemu-sap-erp-ecc-na-
storone-klienta.html

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Однако на текущий момент такой возможности «нет»:

1) Возможность ручного добавления параметра Password=PW_14EC7E1AD3F538 осталась.

2) Есть возможность использовать команду sapshcut

Пример для понимания синтаксиса приведен ниже

Синтаксис команды sapshcut


sapshcut -system=SYSID -client=100 -user=USERNAME -pw=password -command=*LSMW
/SAPDMC/LSSCREEN-PROJECT=Z01

После создания ярлыка в SAP Logon мы можем его преобразовать до файлика с расширением .sap
и под редактировать, а также мы можем преобразовать его содержимое до уровня команды.

Для этого перетащим файлик из SAP Logon на рабочий стол или в другую папку.

Откроем файл в блокноте.

Мы можем подредактировать содержимое файла:

1) Добавить пароль

2) Под редактировать запуск ввода (перенести в атрибут command параметр экрана)

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

3) Изменить свойство reuse – чтобы создавать новое соединение или наоборот не создавать
его.

4) Подредактировать свойство Description, чтобы оно совпадало с описанием в списке SAP


Logon

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Запустим ярлык дважды и убедимся, что параметр Z02 проставился в нужном поле

Как видим это довольно простой/быстрый/быстро развёртываемый способ обращения к SAP.


Однако этот способ будет работать, когда будет SAP Logon на компьютере пользователя.

У этого способа есть усовершенствование: запуск через универсальную транзакцию, о которой


будет рассказано позднее.

Далее рассмотрим доступ к данным с помощью RFC-модуля.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Вызов RFC из Excel по чтению таблиц


Для RFC –функционала необходимо, чтобы в системе SAP был создан соответствующий
функциональный модуль.

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

Давайте посмотрим, как это может выглядеть (это не единственная возможная реализация,
естественно).

На первом шаге нужно создать:

1) Функциональный модуль для извлечения данных из таблицы

Код функционального модуля Z_LSP_TAB_TABLE_GET


Назначение функционального модуля: извлечение данных из таблицы.
Представление их в табличной строке
FUNCTION Z_LSP_TAB_TABLE_GET.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(N_RECORD) TYPE TBMAXSEL DEFAULT 200
*" VALUE(TABLENAME) TYPE TABNAME
*" VALUE(N_FIELD) TYPE TBMAXSEL DEFAULT 10
*" VALUE(CONDITION) TYPE CHAR100
*" TABLES
*" TABLECONTENT TYPE ZLSP_CHAR1250_T
*" TABLESTRUCT TYPE LTR_T_DD03L
*" TABLESTEXT TYPE BKK_TAB_DD03T
*" EXCEPTIONS
*" TABLE_NOT_DECLARED
*" NO_RECORD_FOUND
*"----------------------------------------------------------------------
"INCLUDE ZLSPTAB_TABLE_DECLARE if FOUND.

data offset TYPE i.


data index type syindex.

data lt_data_el_text TYPE STANDARD TABLE OF dd04t.

data ftab TYPE STANDARD TABLE OF string.


data fieldname TYPE FIELDNAME.

FIELD-SYMBOLS <fs> TYPE any.


FIELD-SYMBOLS <fs2> TYPE any.
FIELD-SYMBOLS <fs_tabinfo> TYPE DD03L.

data ls_content TYPE ZLSP_CHAR1250.

SELECT * from dd03l


into CORRESPONDING FIELDS OF TABLE TABLESTRUCT
WHERE TABNAME = TABLENAME
and fieldname not LIKE '.INCLU%'
ORDER BY position
.

IF sy-subrc eq 0.
LOOP AT TABLESTRUCT ASSIGNING <fs_tabinfo>.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

APPEND <fs_tabinfo>-fieldname to ftab.


ENDLOOP.
IF TABLESTRUCT[] is INITIAL.
else.
SELECT *
from dd03t
INTO CORRESPONDING FIELDS OF TABLE TABLESTEXT
FOR ALL ENTRIES IN TABLESTRUCT
WHERE ddlanguage = sy-langu
and tabname = TABLESTRUCT-tabname
AND fieldname = TABLESTRUCT-fieldname
.
IF sy-subrc eq 0.

ENDIF.

SELECT *
from dd04t
INTO CORRESPONDING FIELDS OF TABLE lt_data_el_text
FOR ALL ENTRIES IN TABLESTRUCT[]
WHERE rollname = TABLESTRUCT-rollname
and ddlanguage = sy-langu
.
IF sy-subrc eq 0.

ENDIF.

LOOP AT TABLESTEXT ASSIGNING


FIELD-SYMBOL(<fs_text>) WHERE DDTEXT is INITIAL.

READ TABLE TABLESTRUCT ASSIGNING <fs_tabinfo>


WITH KEY TABNAME = <fs_text>-tabname
fieldname = <fs_text>-FIELDNAME
.
IF sy-subrc eq 0.
READ TABLE lt_data_el_text ASSIGNING
FIELD-SYMBOL(<fs_de_txt>) WITH KEY rollname = <fs_tabinfo>-
rollname.
IF sy-subrc eq 0.
<fs_text>-ddtext = <fs_de_txt>-ddtext.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.

DATA: w_tab TYPE STANDARD TABLE OF abap_compdescr,


w_tab_wa TYPE abap_compdescr,
w_typ TYPE REF TO cl_abap_elemdescr,
lt_tot_comp TYPE cl_abap_structdescr=>component_table,
lt_comp TYPE cl_abap_structdescr=>component_table,
la_comp LIKE LINE OF lt_comp,
lo_new_type TYPE REF TO cl_abap_structdescr,
lo_table_type TYPE REF TO cl_abap_tabledescr,
w_tref TYPE REF TO data,
w_dy_line TYPE REF TO data.

FIELD-SYMBOLS: <dyn_tab> TYPE STANDARD TABLE,


<dyn_wa>,
<dyn_field>.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

LOOP AT TABLESTRUCT ASSIGNING <fs_tabinfo>.


* CLEAR w_tab_wa.
w_tab_wa-name = <fs_tabinfo>-FIELDNAME.
w_tab_wa-type_kind = <fs_tabinfo>-INTTYPE. "Char field
w_tab_wa-length = <fs_tabinfo>-LENG.
w_tab_wa-DECIMALS = <fs_tabinfo>-DECIMALS.
* APPEND w_tab_wa TO w_tab.

CASE w_tab_wa-type_kind.
WHEN 'STRING'. w_typ = cl_abap_elemdescr=>get_string( ).
WHEN 'XSTRING'. w_typ = cl_abap_elemdescr=>get_xstring( ).
WHEN 'I'. w_typ = cl_abap_elemdescr=>get_i( ).
WHEN 'F'. w_typ = cl_abap_elemdescr=>get_f( ).
WHEN 'D'. w_typ = cl_abap_elemdescr=>get_d( ).
WHEN 'T'. w_typ = cl_abap_elemdescr=>get_t( ).
WHEN 'C'. w_typ = cl_abap_elemdescr=>get_c( p_length = w_tab_wa-
length ).
WHEN 'N'. w_typ = cl_abap_elemdescr=>get_n( p_length = w_tab_wa-
length ).
WHEN 'X'.
w_tab_wa-length = <fs_tabinfo>-INTLEN.
CASE <fs_tabinfo>-DATATYPE.
WHEN 'INT4'.
" w_typ = cl_abap_elemdescr=>get_n( p_length = w_tab_wa-length ).
w_typ = cl_abap_elemdescr=>get_i( ).
WHEN OTHERS.
w_typ = cl_abap_elemdescr=>get_x( p_length = w_tab_wa-length ).
ENDCASE.
WHEN 'P'.
TRY .
w_typ = cl_abap_elemdescr=>get_p( p_length = ( w_tab_wa-
length - w_tab_wa-DECIMALS )
p_decimals = w_tab_wa-
DECIMALS ).
CATCH CX_PARAMETER_INVALID_RANGE.
"w_typ = cl_abap_elemdescr=>DESCRIBE_BY_NAME( P_NAME = <fs_tabinfo
>-ROLLNAME ).
ENDTRY.

ENDCASE.

CLEAR la_comp.
la_comp-type = w_typ. "Field type
la_comp-name = w_tab_wa-name. "Field name ex: FIELD1
APPEND la_comp TO lt_tot_comp. "Add entry to component table

ENDLOOP.

* Create new type from component table


lo_new_type = cl_abap_structdescr=>create( lt_tot_comp ).

* Create new table type


lo_table_type = cl_abap_tabledescr=>create( lo_new_type ).

* Create dynamic internal table and assign to Field Symbol


CREATE DATA w_tref TYPE HANDLE lo_table_type.
ASSIGN w_tref->* TO <dyn_tab>.

* Create dynamic work area and assign to Field Symbol


CREATE DATA w_dy_line LIKE LINE OF <dyn_tab>.
ASSIGN w_dy_line->* TO <dyn_wa>.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

SELECT (ftab)
INTO CORRESPONDING FIELDS OF TABLE <dyn_tab>
from (tablename)
UP TO N_RECORD ROWS
WHERE (CONDITION)
.
IF sy-subrc eq 0.
CLEAR ls_content.

* ASSIGN TABLE FIELD <dyn_tab> to <fs>.


* IF sy-subrc eq 0.
* LOOP AT CH_TABLESTRUCT ASSIGNING <FS_TABINFO>.
* ASSIGN COMPONENT sy-tabix OF STRUCTURE <dyn_tab> to <fs2>.
* ls_content-line+offset = <fs2>.
* offset = offset + <fs_tabinfo>-leng.
* ENDLOOP.

LOOP AT <dyn_tab> ASSIGNING FIELD-SYMBOL(<fs_dyn_tab>).


clear offset.
"ls_content-line = <fs_dyn_tab>.
LOOP AT TABLESTRUCT ASSIGNING <FS_TABINFO>.
ASSIGN COMPONENT sy-tabix OF STRUCTURE <fs_dyn_tab> to <fs2>.
ls_content-line+offset = <fs2>.
offset = offset + <fs_tabinfo>-leng.
ENDLOOP.
APPEND ls_content to TABLECONTENT.
ENDLOOP.

"ENDIF.
ENDIF.

TABLECONTENT[] = TABLECONTENT[].
TABLESTRUCT[] = TABLESTRUCT[].
TABLESTEXT[] = TABLESTEXT[].
ENDFUNCTION.

Проверим работу ФМа посредством VBA.

Добавляем вкладку Developer.

На следующем шаге необходимо подготовить Excel-файл

Добавим ActiveX элементы

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Имя файла/папки Комментарий


wdobapiU.ocx SAP BAPI Unicode Control
wdtaocxU.ocx SAP Table Factory Unicode
wdtfuncU.ocx SAP Remote Function Call Unicode Control
wdtlogU.ocx SAP Logon Unicode Control

C:\Program Files\SAP\FrontEnd\SAPgui\Unicode Возможно, в этой папке нужно смотреть файл


wdtlogU.ocx (именно Unicode)
C:\Program Files\SAP\FrontEnd\SAPgui В этой папке могут быть как Unicode, так и не
Unicode
Если не нашли определенный файлик – не
паникуем! – запускаем поиск Windows по
именам файлам по всему компьютеру.
Если нашли – используем.
Если не нашли – требуется переустановка SAP
Logon (или возьмите файлы у тех, у кого они
есть).

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Код макроса для доступа в SAP


Sub SetTable()
Dim functionCtrl As Object 'Function Control (Collective object)
Dim sapConnection As Object 'Connection object
Dim theFunc As Object 'Function object
Set functionCtrl = CreateObject("SAP.Functions")
Set sapConnection = functionCtrl.Connection
'
'Declaration
'
Dim linetab As Object
Dim TabDef As Object
Dim returnFunc As Boolean
Dim startzeil As Integer
Dim endcol As Integer
Dim table_name As String
Dim n_record As String
Dim n_fields As String
Dim where_condition As String
Dim start_char As Integer
Dim WriteCell As String
Dim Offset As Integer
Dim Destination_System As Integer
'
'Logon with initial values
'
Destination_System = ActiveSheet.Cells(11, 2).Value
sapConnection.client = ActiveSheet.Cells(3, Destination_System).Value
sapConnection.user = ActiveSheet.Cells(4, Destination_System).Value
sapConnection.Language = ActiveSheet.Cells(7, Destination_System).Value
sapConnection.hostname = ActiveSheet.Cells(6, Destination_System).Value

sapConnection.Password = ActiveSheet.Cells(5, Destination_System).Value

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

sapConnection.SystemNumber = ActiveSheet.Cells(9, Destination_System).Value


sapConnection.System = ActiveSheet.Cells(8, Destination_System).Value
sapConnection.Destination = ActiveSheet.Cells(8, Destination_System).Value

If sapConnection.logon(0, False) <> True Then


MsgBox "No connection to R/3!"
Exit Sub 'End program
End If

Set theFunc = functionCtrl.Add("Z_BC_TAB_TABLE_DEC")

table_name = ActiveSheet.Cells(16, 2).Value

theFunc.Exports("TABLENAME") = table_name
returnFunc = theFunc.Call
die_exception = theFunc.Exception

End Sub
Sub GetTableContent()
Dim functionCtrl As Object 'Function Control (Collective object)
Dim sapConnection As Object 'Connection object
Dim theFunc As Object 'Function object
Set functionCtrl = CreateObject("SAP.Functions")
Set sapConnection = functionCtrl.Connection
'
'Declaration
'
Dim linetab As Object
Dim TabDef As Object
Dim TabDefName As Object
Dim returnFunc As Boolean
Dim startzeil As Integer
Dim endcol As Integer
Dim table_name As String
Dim n_record As String
Dim n_fields As String
Dim where_condition As String
Dim start_char As Integer
Dim WriteCell As String
Dim Offset As Integer
'
'Logon with initial values
'
Worksheets(1).Select
Destination_System = ActiveSheet.Cells(11, 2).Value

sapConnection.client = ActiveSheet.Cells(3, Destination_System).Value


sapConnection.user = ActiveSheet.Cells(4, Destination_System).Value
sapConnection.Language = ActiveSheet.Cells(7, Destination_System).Value

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

sapConnection.hostname = ActiveSheet.Cells(6, Destination_System).Value


sapConnection.Password = ActiveSheet.Cells(5, Destination_System).Value
sapConnection.SystemNumber = ActiveSheet.Cells(9, Destination_System).Value
sapConnection.System = ActiveSheet.Cells(8, Destination_System).Value
sapConnection.Destination = ActiveSheet.Cells(8, Destination_System).Value

' If sapConnection.logon(0, False) <> True Then ' < with screen
If sapConnection.logon(1, True) <> True Then ' without screen
MsgBox "No connection to R/3!"
Exit Sub 'End program
End If

Set theFunc = functionCtrl.Add("Z_LSP_TAB_TABLE_GET")

n_fields = ActiveSheet.Cells(15, 2).Value


n_record = ActiveSheet.Cells(16, 2).Value
where_condition = ActiveSheet.Cells(17, 2).Value
table_name = ActiveSheet.Cells(14, 2).Value
'Prepare output to the EXCEL worksheet
'
Worksheets(2).Select
Cells.Clear

startzeil = 1

'Determine the import parameters for the function call


'
' For start_char = Asc("A") To Asc("Z")
theFunc.Exports("TABLENAME") = table_name
theFunc.Exports("N_FIELD") = n_fields
theFunc.Exports("N_RECORD") = n_record
theFunc.Exports("CONDITION") = where_condition

returnFunc = theFunc.Call
die_exception = theFunc.Exception
If returnFunc = True Then
Set linetab = theFunc.Tables.Item("TABLECONTENT")
Set TabDef = theFunc.Tables.Item("TABLESTRUCT")
Set TabDefName = theFunc.Tables.Item("TABLESTEXT")
' Set linetab = theFunc.Imports.Item("CH_TABLECONTENT")
' Set TabDef = theFunc.Imports.Item("CH_TABLESTRUCT")
' Set TabDefName = theFunc.Imports.Item("CH_TABLESTEXT")
endcol = 0
Call display_header(TabDef, TabDefName, n_fields)
Call display_lines(table_name, linetab, TabDef, startzeil, endcol)
startzeil = endcol
Set customers = Nothing

Else
If die_exception = "NO_RECORD_FOUND" Then
Cells(startzeil, 1) = "No values exist for " + the_name

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

startzeil = startzeil + 1
Else
MsgBox "Error when accessing function in R/3 ! "
Exit Sub
End If
End If
'Close connection to R/3 !
'
functionCtrl.Connection.logoff

'
'Release the objects to free storage space
'
Set sapConnection = Nothing
Set functionCtrl = Nothing

MsgBox "Program terminated!", 0, "Exit"


End Sub
Sub display_header(ByRef table_def As Object, ByRef table_name As Object, n_fields As String)
'
'Show table header
'For each field, the name and the description.

j=1
For Each TabDef In table_def.Rows
Cells(1, j) = Trim(TabDef("FIELDNAME"))
j=j+1
Next
j=1
For Each TabDefName In table_name.Rows
Cells(2, j) = Trim(TabDefName("DDTEXT"))
j=j+1
Next
End Sub

Sub display_lines(TabName As String, ByRef line_table As Object, ByRef table_def As Object, start_zeil
As Integer, ByRef end_col As Integer)
'
'Display contents of customer table
'

bManyLines = False
If (bManyLines = False) Then
i=3
For Each Line In line_table.Rows
Offset = 1
j=1

For Each TabDef In table_def.Rows

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Leng = Trim(TabDef("LENG"))
WriteCell = Mid(Trim(Line("LINE")), Offset, Leng)
Cells(i, j) = WriteCell
Offset = Offset + Leng
j=j+1
Next
i=i+1
Next
End If

end_col = i
End Sub

Вызов WebService / Odata Service из Excel


На первом шаге убедимся, что в системе присутствуют нужные компоненты.
ID компонента Описание
GW_CORE
IW_FND
IW_BEP

Проверяем так:

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Если компонентов нет, то просим базис поставить нужные компоненты.

Если базис – это Вы, то установка компонентов делается в транзакции SAINT.

Следующим шагом – установка eclipse и дополнительных ABAP-надстроек.


https://tools.hana.ondemand.com/#abap

http://www.eclipse.org/mars/

Устанавливаем версию

http://www.eclipse.org/downloads/packages/release/Mars/2

Выбираем нужную версию – 32bit или 64bit.

Запускаем файл eclipse.exe

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Для установки abap надстроек переходим по пути

Help -> Install new Software

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Далее подтверждаем соглашение

Система начнет установку всех надстроек

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

После установки всех надстроек мы можем создать ABAP-проект

Eclipse поможет нам в отладке WEB/OData-service.

Также это еще и удобная среда разработки 

Также проверить активирован ли SAP NetWeaver Gateway


SPRO:

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Затем переходим к пункту ведение aliases

Идем в SAP Gateway Settings

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Активируем нужные сервисы через транзакцию SICF

Путь для активации OPU (OData for SAP Products)


default_host -> sap -> opu -> правой кнопкой мыши и нажимаем ActivateService

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Нажимаем Refresh – убеждаемся, что сервисы активированы

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Протестируем настройки с помощью транзакции SEGW


Пример взят на основе книги OData and SAP NetWeaver GateWay, но рассмотрен более подробно.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

https://www.sap-press.com/sap-gateway-and-odata_3904/

Для этого создадим пробный Gateway (Product)

Теперь запустим транзакцию (/IWFND/MAINT_SERVICE - Activate and Maintain Services)

Видим, что сервис зарегистрирован

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Проверим Service (конфигурацию) на стандартном сервисе

/sap/opu/odata/IWFND/USERSERVICE/UserCollection

В транзакции /IWFND/GW_CLIENT - SAP Gateway Client

Система вернет данные

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Если мы укажем это в строке браузера, то также получим данные.

Ссылка
http://<host_name:port>/sap/opu/odata/IWFND/USERSERVICE/UserCollection

Также проверим подключение из Excel

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Система вернет данные

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Создадим webService/OData Service на чтение данных из таблицы

Код класса для чтения приведен ниже

Метод TABSTRINGSET_GET_ENTITYSET
method TABSTRINGSET_GET_ENTITYSET.
data lv_tabname TYPE tabname VALUE 'DD03L'.
data lv_condition TYPE char100.
data lt_TABLECONTENT TYPE ZLSP_CHAR1250_T.
data lt_TABLESTRUCT TYPE LTR_T_DD03L.
data lt_TABLESTEXT TYPE BKK_TAB_DD03T.

data tab_head TYPE string.

DATA ls_entity TYPE ZLSP_CHAR1250_NUM.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

data lv_length TYPE i.

data ls_dd03l TYPE dd03l.

" ?search=VBAP&cond=VBELN LIKE '100011'

SPLIT IV_SEARCH_STRING at ';' INTO: lv_tabname lv_condition .

lv_length = strlen( lv_tabname ).


lv_length = lv_length - 6.

IF lv_length gt 0.
lv_tabname = lv_tabname+6.
ENDIF.

lv_condition = lv_condition+5.

" BREAK-POINT.
IF lv_tabname is INITIAL.

else.
" lv_tabname = iv_entity_name.

CALL FUNCTION 'Z_LSP_TAB_TABLE_GET'


EXPORTING
N_RECORD = 20000
TABLENAME = lv_tabname
* N_FIELD = 10
CONDITION = lv_condition
ADD_OFFSET = 'X'
TABLES
TABLECONTENT = lt_TABLECONTENT
TABLESTRUCT = lt_TABLESTRUCT
TABLESTEXT = lt_TABLESTEXT
EXCEPTIONS
TABLE_NOT_DECLARED = 1
NO_RECORD_FOUND = 2
OTHERS = 3
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
else.
clear TAB_HEAD.
LOOP AT lt_TABLESTRUCT ASSIGNING FIELD-SYMBOL(<fs_tab>).
" APPEND <fs_tab> to ET_ENTITYSET.
IF tab_head is INITIAL.
tab_head = <fs_tab>-fieldname.
else.
CONCATENATE tab_head '|' <fs_tab>-fieldname INTO tab_head.
ENDIF.
ENDLOOP.
ls_entity-posnr = 1.
ls_entity-line = tab_head.
APPEND LS_ENTITY to ET_ENTITYSET.

LOOP AT lt_TABLECONTENT ASSIGNING FIELD-SYMBOL(<fs_tc>).


ls_entity-posnr = ls_entity-posnr + 1.
ls_entity-line = <fs_tc>-line.
APPEND ls_entity to ET_ENTITYSET.
ENDLOOP.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

ENDIF.

ENDIF.
endmethod.

В Excel создадим вызов

Пройдемся по коду и по стандартным вызовам.

UseFul links
Conver https://support.office.com/en-us/article/Split-text-into-different-columns-with-the-
t Text Convert-Text-to-Columns-Wizard-30b14928-5550-41f5-97ca-7a3e9c363ed7
to Tab
Split http://www.exceltrick.com/formulas_macros/vba-split-function/
Functi
on
VBA
OData https://blogs.msdn.microsoft.com/marcelolr/2010/02/16/consuming-odata-with-office-
call in vba-part-i/
VBA https://blogs.msdn.microsoft.com/marcelolr/2010/02/17/consuming-odata-with-office-
vba-part-ii/
https://blogs.msdn.microsoft.com/marcelolr/2010/02/18/consuming-odata-with-office-
vba-part-iii-excel/

Itab to https://archive.sap.com/discussions/thread/3550748
JSON
Query http://stackoverflow.com/questions/28052391/odata-sap-gateway-about-query-with-filter-
with and-expand-simultaneously
$filter

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Odta https://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/odata-
v4 in actions-and-functions
.Net
http://www.odata.org/documentation/odata-version-2-0/uri-conventions/

.net https://archive.sap.com/discussions/thread/1446750
.net https://archive.sap.com/discussions/thread/3578601
useful links:
https://blogs.sap.com/2012/08/22/sap-connectivity-with-ms-excel/

As it appears wdtlog.ocx file was missing from c:\Program Files\Common Files\SAP Shared\

https://wiki.scn.sap.com/wiki/display/Snippets/Example+-
+create+a+dynamic+internal+table

http://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/com.sap.nw.wpc.runtime.docs/libra
ry/abap/_abap/abap-code-
samples/Read%20Any%20SAP%20Table%20with%20Microsoft%20Excel.pdf

https://blogs.sap.com/2006/12/14/read-any-sap-tables-from-excel/

Inbound mail – письма для обмена с SAP ERP


Конфигурация делается базисом на основе ноты 455140

Также должна быть сделана настройка на почтовом сервере.

http://scn.sap.com/people/thomas.jung/blog/2004/09/09/receiving-e-mail-and-processing-it-with-
abap--version-610-and-higher

Затем создаем класс-обработчик на основе интерфейса IF_INBOUND_EXIT_BCS.

Далее в настройках транзакции SCOT необходимо сделать мэппинг адреса и класс обработчика.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Разобрать примерный код обработчика.

Архитектура работы:

MS Exchange Server -> SAP ERP -> SAPconnect (SMTP Host) -> класс CL_SMTP_EXT_SAPCONNECT ->
класс ZCL_LSP000_MAIL_INBOUND.

Примерный код ZCL_LSP000_MAIL_INBOUND


Класс ZCL_LSP000_MAIL_INBOUND, метод IF_INBOUND_EXIT_BCS~CREATE_INSTANCE
method IF_INBOUND_EXIT_BCS~CREATE_INSTANCE.
IF unique_instance IS INITIAL.
CREATE OBJECT unique_instance.
ENDIF.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

ro_ref = unique_instance.
endmethod.
Класс ZCL_LSP000_MAIL_INBOUND, метод IF_INBOUND_EXIT_BCS~PROCESS_INBOUND
method IF_INBOUND_EXIT_BCS~PROCESS_INBOUND.
DATA: sender TYPE REF TO if_sender_bcs.
DATA: sender_addr TYPE string.
DATA: lo_reply TYPE REF TO cl_send_request_bcs .
DATA: li_document TYPE REF TO if_document_bcs,
l_subject TYPE so_obj_des,
ls_text TYPE soli,
lt_text TYPE soli_tab.
TRY.
**** init
CLEAR e_retcode.
CLEAR es_t100msg.
**** Get a pointer to the reply email object
lo_reply = io_sreq->reply( ).

**** Check to make sure this is from an approved Sender


sender = io_sreq->get_sender( ).
sender_addr = sender->address_string( ).
TRANSLATE sender_addr TO UPPER CASE.
**** Only reply if this message came from within out mail system
IF sender_addr CS '@OLEGBASH.RU' OR
sender_addr CS '@MOBILE.OLEGBASH.COM'.

**** send reply


CONCATENATE 'System Status for:'(s01)
sy-sysid
INTO l_subject
SEPARATED BY space.

DATA: itab TYPE TABLE OF abaplist.


SUBMIT rsmon000_alv AND RETURN
EXPORTING LIST TO MEMORY.

CALL FUNCTION 'LIST_FROM_MEMORY'


TABLES
listobject = itab
EXCEPTIONS
not_found = 1.

CALL FUNCTION 'WWW_HTML_FROM_LISTOBJECT'


EXPORTING
template_name = 'WEBREPORTING_REPORT'
TABLES
html = lt_text
listobject = itab.

me->send_reply( io_reply = lo_reply


ip_subject = l_subject
it_content = lt_text ).

"ENDIF.

ENDIF.

" CATCH CX_SEND_REQ_BCS.


* —————————————————————————————-
* error handling
* —————————————————————————————-

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

* system error
CATCH cx_os_object_not_found
cx_alert_recipient_unknown
cx_document_bcs
cx_send_req_bcs
cx_address_bcs.
TRY.
**** send reply
l_subject = 'Message could not be processed'.
**** build content for reply
ls_text = 'An internal system error occured!! Please send
the message again.'.
APPEND ls_text TO lt_text.

ls_text = 'If this error occurs again please call your sys
tem administrator.'.
APPEND ls_text TO lt_text.

me->send_reply( io_reply = lo_reply


ip_subject = l_subject
it_content = lt_text ).
* e_retcode = 4. CATCH cx_document_bcs cx_address_bcs cx_sen
d_req_bcs.*
e_retcode = 4.
ENDTRY.
ENDTRY.
**** exit has done its work
e_retcode = if_inbound_exit_bcs=>gc_terminate.

endmethod.
Класс ZCL_LSP000_MAIL_INBOUND, метод SEND_REPLY
method SEND_REPLY.
* —————————————————————————————-
* send confirmation or error status mail
* —————————————————————————————-
data: lo_sender type ref to cl_sapuser_bcs,
ls_config type salrtsconf,
lo_reply_doc type ref to cl_document_bcs,
lo_alert_man type ref to cl_alert_manager,
lo_bcs type ref to cl_bcs,
l_rc type sy-subrc.
* set sender
" NOT MAILER
TRY .
lo_sender = cl_sapuser_bcs=>create( 'OLEGBASH' ).
CATCH cx_address_bcs.

ENDTRY.

* add sender
TRY .
call method io_reply->setu_sender
exporting
i_sender = lo_sender.
CATCH cx_send_req_bcs
cx_address_bcs
.

ENDTRY.

* build document for reply

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

TRY .
lo_reply_doc = cl_document_bcs=>create_document(
i_type = 'HTM'
i_text = it_content
i_subject = ip_subject ).
CATCH cx_send_req_bcs
cx_document_bcs
.

ENDTRY.

* set document
try.
io_reply->setu_document( lo_reply_doc ).
CATCH cx_send_req_bcs
cx_document_bcs
.

ENDTRY.
* no status messages required
try.
io_reply->setu_status_mail( 'N' ).
CATCH cx_send_req_bcs.

ENDTRY.
try.
io_reply->setu_requested_status( 'N' ).
CATCH cx_send_req_bcs.

ENDTRY.
* get facade
try.
lo_bcs = io_reply->getu_facade( ).
CATCH cx_send_req_bcs.

ENDTRY.
* set send immediately flag
try.
lo_bcs->set_send_immediately( 'X' ).
CATCH cx_send_req_bcs.

ENDTRY.
* send
try.
io_reply->release( ).
CATCH cx_send_req_bcs.

ENDTRY.
commit work.

endmethod.

Uni file и универсальная транзакция и SmartyMail


Под «универсальной транзакцией» следует понимать такую транзакцию, через которую можно
делать как можно больше действий с наименьшим количеством кликов:

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

- Открыть документы
- запускать отчеты
- запускать функции в отчетах.

Рассмотрим простой подход к транзакции.

Сделаем транзакцию, которая из одного экрана открывает сбытовой, закупочный и финансовый


документы.

Tcode: ZTLSP000_UNI_CODE
Report: ZLSP000_UNI_CODE

[показать функционал]

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

Например, даже, чтобы открыть FI-документ нужно три параметра.

Также мы можем переходить не только в начальный экран транзакции, но и «поглубже» -


например, в позицию заказа на поставку.

Можно создать бессчётное количество параметров в ABAP-экране.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Но я решил пойти по пути создания файла для запуска (исполнения) и назвал его uni_file.

Uni file
Uni_file – Это xml файл который состоит из тэгов headerXX и LineYY, то есть из «общих,
обезличенных» тэгов заголовка и позиции (все тэги входят в общий тэг order).

При этом Header служим в основном для информационных целей.

Файл сам по себе может включать информацию о любом объекте; файл может быть небольшим и
большим по размеру.

Структура xml: файл состоит из одного тэга – Order.

В атрибутах этого узла содержится тип файла, который говорит о назначениях полей. Описание
(назначение и смысл каждого поля) может быть описана во внутренних таблицах SAP ERP, но это
не является обязательным условием для его обработки.

Пример приведен на скриншоте.

Для его чтения и приведения создадим отдельный класс.

Класс ZCL_LSP000_UNI_FILE.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Это класс либо «выполняет» содержимое из файла, либо возвращает данные из uni_file во
внутренней таблице.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Вернемся к нашей «универсальной транзакции»: теперь получается мы можем передать любое


количество параметров и указать, что именно нужно выполнить и на каких значениях. Это дает
нам определенную гибкость в запуске транзакции.

С помощью uni_file мы можем передать любое количество параметров в любую программу без
расширения экрана в SAP (в общем случае, редактирование ABAP-логики потребуется).

Uni_file запуска транзакции LSMW будет выглядеть как ниже

Содержимое uni_file для запуска транзакции LSMW


<?xml version="1.0"?>
<Order TypeTx="TmpTransfer" Type="9999">
<HeaderTexts Type="FreeText" Copy="No">
<HeaderTag01>Start sales tools tcode</HeaderTag01>
<HeaderTag02>WITHOUT Parameter</HeaderTag02>
</HeaderTexts>
<HeaderIDs Type="ID" Copy="No">
<HeaderTag01>TCODE_WO</HeaderTag01>
<HeaderTag02>LSMW</HeaderTag02></HeaderIDs>
<Line Copy="No" ItemNum="1">
<Tag00>S</Tag00>
<Tag01>S_VBELN</Tag01>
<Tag02>VBELN_NUM</Tag02>

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

<Tag11>310325932</Tag11></Line></Order>

Сделаем uni_file для запуска отчета по сбытовым заказам (VA05N)

Содержимое uni_file для запуска транзакции VA05N (отчет SD_SALES_ORDERS_VIEW)

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

Получается, что мы получаем «универсальный запуск» = smartTcode 

Теперь вернемся к обработке входящей почты.

Uni_file мы можем передать через вложение; с помощью класса по обработке входящих


сообщений мы можем получить бинарное содержимое xml-файла uni_file и выполнить нужное
нам действие в системе.

Из-за универсальности обработки я назвал этот подход SmartyMail.

Универсальность заключается в том, что мы можем принимать информацию с любого устройства


(как в сети, так и не в сети) через уже протестированный и понятный всем протокол SMTP.

С помощью данного подхода интеграционный обмен данными, ориентированный на клиента,


можно развернуть менее чем за 1 день (имеется ввиду, именно обмен данными, то есть из uni_file
помещает данные во внутреннюю таблицу и в таблицу базы данных); дальнейший обработчик –
создание заказа, или фин.документа мы, вероятно, будем писать более продолжительное время.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

Современные ERP-системы (или практически любые системы учета) способны генерировать email.
Таким образом, с помощью данного способа можно развернуть быстро и надежно
интеграционный обмен данными; и это обойдется в минимум затрат по деньгам, по усилиям и по
времени.

Пример Search4file_uni_pre in mail inbound processing


Код, который выполняет поиск Uni_file во входящем письме.
method SEARCH4FILE_UNI_PRE.

*http://sen.sap.com/people/thomas.jung/blog/2004/09/09/receiving-e-mail-and-
processing-it-with-abap--version-610-and-higher

*http://wiki.sen.sap.com/wiki/display/Snippets/Sample+Code+for+processing+In
bound+Ma+with+Adobe+Interactive+Forms
*" http://sen.sap.com/thread/756086

*http://sen.sap.com/community/crm/blog/2005/10/02/inbound-mail-processing-
attach-files-to-opportunity
data binary_file TYPE xstring.
DATA : pdf_line TYPE solix . " SAPoffice: Binary data, length 255
DATA : nb_att(10) TYPE n. " Att(10) of type Numeric Text Fields
DATA : w_part TYPE int4 " Natural Number
, lv_strlen type i " Strlen of type Integers
, lv_char255 TYPE C LENGTH 255 " Char255 of type
, do_not_process TYPE C LENGTH 1 " Not_process of type
, lv_vbeln TYPE VBELN_VA " Sales Document
, lv_auart TYPE auart " Sales Document Type
, lv_vbe1n_tmp TYPE VBELN_VA " Sales Document
, lv_charl00 TYPE C LENGTH 100
, lv_char255_2 TYPE C LENGTH 255 " Char255_2 of type
, lv_char255_3 TYPE C LENGTH 255 " Char255_3 of type
.
FIELD-
SYMBOLS : <pdf_line> TYPE solix. " SAPoffice: Binary data, length 255
data ls_attachement_attributes TYPE BCSS_DBPA. " Attributes of a Documen
t Body Part
data attachement_attributes TYPE BCSS_DBPA. " Attributes of a Document B
ody Part
data: mail TYPE REF TO if_document_bcs " Document Interface for BCS
.

data lv_bool_found_xml TYPE char1. " Bool_found_xml of type CHAR1


lv_bool_found_xml = abap_false.

TRY .
* Get the email document that was sent.
mail = io_sreq->get_document( ).
* Get number of attachement in the mail
* If number is lower than 2 that means no attachement to the mail
nb_att = mail->get_body_part_count( ) - 1.
IF nb_att = 0.
"me->ADD_L0G( EXPORTING i_text255 = text-214 ).
else . " ELSE -> IF nb_att = 0
clear lv_char255_3.
lv_char255_3 = text-215.
" REPLACE all OCCURRENCES OF '$$$1' in lv_char255_3 with nb_att.
"me->ADD_LOG( EXPORTING i_text255 = lv_char255_3 ).
CLEAR w_part.
* Process each document

DO nb_att TIMES.

www.olegbash.ru
Read ABAP: чтение ABAP-кода, мастер-класс Олега Башкатова Contents
Москва, 26 октября 2017

clear do_not_process.
w_part = sy-index + 1 .
" CLEAR xml_document .
" Get attachement attributes
" attachement_attributes =
ls_attachement_attributes =
mail->get_body_part_attributes( im_part = w_part ).
MOVE-CORRESPONDING ls_attachement_attributes
to attachement_attributes.
IF attachement_attributes-doc_type IS INITIAL.
DATA w_pos TYPE i . " Pos of type Integers
FIND '.' IN attachement_attributes-filename
IN CHARACTER MODE MATCH OFFSET w_pos.
ADD 1 TO w_pos.
attachement_attributes-doc_type =
attachement_attributes-filename+w_pos.
ENDIF. " IF attachement_attributes-doc_type IS INITIAL
" Get the attachement
TRANSLATE attachement_attributes-doc_type TO UPPER CASE.
if attachement_attributes-doc_type = 'XML'
and attachement_attributes-filename = 'file_uni_pre.xml'.
lv_bool_found_xml = abap_true.
data(attachement_file) = mail-
>get_body_part_content( w_part ).
"If attachement is not a binary one ,
" transform it to binary.

if attachement_attributes-binary IS INITIAL.
CALL FUNCTION 'SO_SOLITAB_TO_SOLIXTAB'
EXPORTING
ip_solitab = attachement_file-cont_text
IMPORTING
ep_solixtab = attachement_file-cont_hex.
endif. " if attachement_attributes-binary IS INITIAL

* Convert the attachement file into an xstring.

CLEAR binary_file.
LOOP AT attachement_file-cont_hex ASSIGNING <pdf_line>.
CONCATENATE binary_file <pdf_line>-line
INTO binary_file IN BYTE MODE.
ENDLOOP. " LOOP AT attachement_file-
cont_hex ASSIGNING <pdf_line>
*clear lv_char255_3.
**Iv_char255_3 = text-310.
**" REPLACE all OCCURRENCES OF '$$$1' in lv_char255_3 with nb_att.
**me->ADD_LOG( EXPORTING i_text255 = lv_char255_3 ).
*me->process_xml_file( EXPORTING input_xstring = binary_file
*IMPORTING et_sales = CH_SALES_ORDERS
*) •
E_XSTRING = binary_file.
endif. " if attachement_attributes-doc_type = 'XML'
ENDDO.
ENDIF. " IF nb_att = 0
CATCH cx_root.
ENDTRY.

endmethod.

www.olegbash.ru

Оценить