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

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

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

Читать далее

Начиная с ABAP 7.4 SP08 нам стал доступен специальный тип BAdI — AMDP BAdI, который позволяет заменить/расширить стандартную реализацию AMDP процедур реализованных SAP-ом или в Custom решениях. Основное предназначение AMDP BAdI — вызов процедур реализованных в реализации AMDP BAdI из других AMDP процедур в системе. Чтобы это стало возможным используется ключевое слово USING в определении AMDP процедуры:

Особенности AMDP BAdI:

  • Нет возможности использования BAdI фильтров
  • Fallback класс — обязателен для реализации BAdI (данный класс определяет поведение по умолчанию, если не определена иная реализация)
  • Каждый метод AMDP BAdI класса реализации должен быть AMDP процедурой
  • Вызов таких BAdI может осуществляться обычным образом через GET BADI и CALL BADI

Далее реализуем свой AMDP BAdI, реализацию к нему по умолчанию через Fallback класс, а так же дополнительную Custom реализацию.

Читать далее

У оператора 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 мы можем считывать данные из таблиц через табличные выражения следующим образом:

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

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

Уже несколько раз сталкивался с ситуацией когда разработчик пишет что-то вроде:

Данный код приведёт к исключению CX_SY_ITAB_DUPLICATE_KEY. Все потому, что при определении полей ключа разработчик указал запятую. Запятая в данном случае отделяет определение переменной lt_some_table от переменной b с типом C 🙂

 

Обнаружил для себя забавную особенность при работе с сообщениями.

Есть код:

Логично предположить что сообщение будет вида ‘S’ (Status), однако есть возможность внутри самого сообщения указать принудительно DISPLAY LIKE, переопределив тем самым отображаемый вид сообщения:

Более того, можно подставить & вместо типа сообщения и передавать его как параметр 🙂

Начиная с ABAP 7.4. нам стали доступны операторы конструкторы, такие как:

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

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

Читать далее

Рассмотрим простой пример:

В данном случае у нас возникнет исключительная ситуация, т.к. среда не сможет целиком поместить указанное число в переменную типа p.

Как вы считаете что в данном случае будет с переменной lv_p? Очевидным ответом будет — ну раз произошло исключение, значит переменная осталась без изменений. В реальной же ситуации все несколько иначе.

Далее рассмотрим почему.

Читать далее