В подробных текстах сообщений (тр. SE91) или в документации (тр. SO10) мы кроме непосредственно описания можем так же вставлять ссылки на транзакции или отчёты для их запуска, что позволяет упростить жизнь пользователям.

Однако у стандартной реализации данного механизма есть ряд ограничений:

  • Длинна ссылки ограничена, из-за чего передать все необходимые параметры для запуска транзакции может не получиться.
  • Нет возможности вставки интернет-ссылок более 70 символов (ограничение стандарта).
  • Нет возможности запуска отчёта с параметрами (только запуск с вариантом).

В статье рассмотрим каким образом можно расширить стандартные возможности чтобы избежать вышеуказанных ограничений.

Читать далее

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

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

Давайте разберёмся как это сделать.

Читать далее

В релизе ABAP 7.52 стало возможным использование внутренних таблиц как источника данных в ABAP SQL:

Существует два сценария выполнения таких запросов:

  • Для выполнения SQL запроса не требуется переноса содержимого внутренней таблицы на уровень СУБД. В таком случае обработка запроса осуществляется непосредственно на сервере приложений, по аналогии с табличным буфером.
  • Для выполнения SQL запроса требуется перенести содержимое внутренней таблицы во временную таблицу на уровень СУБД. Этот сценарий поддерживается не всеми СУБД и чтобы статический анализ кода не ругался, следует использовать прагму: ##itab_db_select. При отсутствии поддержки система выдаст исключение в runtime — CX_SY_SQL_UNSUPPORTED_FEATURE.

Разберём текущие особенности использования этих сценариев.

Читать далее

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

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

Для этих целей начиная с ABAP 7.5 ввели так называемые динамические журнальные точки, которые позволяют:

  • Сохранять значения переменных по определённым условиям
  • Записывать стек вызовов, чтобы понять откуда происходит вызов того или иного кода
  • Выполнять анализ выполнения отдельного SQL выражения
  • Активировать запись SQL трассировки для заданного выражения оп указанному условию
  • Активировать трассировку использования табличного буфера заданного SQL выражения для анализа потребляемой памяти

Создавать или модифицировать журнальные точки можно либо через ADT (Eclipse), либо через транзакцию SDLP.

Далее на простых примерах рассмотрим вариант использования.

Читать далее

Начиная с релиза ABAP 7.50 у нас появилась возможность создания не только AMDP процедур, но и AMDP функций. В зависимости от типа AMDP функции они могут быть вызваны:

  • непосредственно из ABAP кода,
  • из других AMDP методов,
  • как источник данных для специальной ABAP CDS сущности называемой табличной функцией CDS.

Далее рассмотрим все варианты использования AMDP функций.

Читать далее

У оператора VALUE #( ) при формировании внутренних таблиц есть так называемая короткая форма:

Что соответствует следующему полному синтаксису:

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

Удобно использовать для формирования диапазонов:

Все что указано за пределами внутренних скобок дублируется в следующие строки:

SIGN OPTION LOW HIGH
I BT  1 10
BT  21 30
I BT 41 50
I GE 61 0

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

Исходя из документации в третьей строке мы должны увидеть пустые значения sign и option, т.к. мы ничего не указывали за пределами внутренних скобок, однако они заполнены из второй строки:

SIGN OPTION LOW HIGH
    1 0
I EQ 2 0
I EQ 3 0

Описанное поведение судя по всему является багом, исправление будет под нотой: 3042453

Казалось бы, выборка единственной записи из таблицы довольно простая и логически понятная операция, однако все еще частой ошибкой находимой на code-review является следующее предупреждение Code Inspector’a:

Syntax check warning

In «SELECT SINGLE …», the WHERE condition for a key field does not test for equality or the FROM clause contains a join. This means the result is possibly not unique. Internal message code: MESSAGE GSB

Deactivatable using pragma ##WARN_OK. Message Code WRN 1305

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

Читать далее

Иногда бывает полезно посмотреть каталог ALV без погружения в код или в отладку. Cделать это можно для любого ALV зажав Shift и щёлкнув два раза правой кнопкой мыши на не занятом данными месте, пример:

Откроется сервисный инструмент (alv consistency check), где среди прочего есть каталог полей:

В полноэкранных ALV можно просто набрать команду &SOS.

Начиная с версии ABAP 7.40 мы можем считывать данные из таблиц через табличные выражения следующим образом:

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

Сравнение на примере: