Маски в ABAP и SQL

Файловая система Open SQL ABAP
Любое кол-во символов * % *
Один любой символ ? _ +

Давайте рассмотрим примеры поиска
SQL используется оператор LIKE

Внутренние таблицы ABAP используем оператор CP и NP для:
Чтение по маске:

 

Удаление по маске(проверить возможность установить CP NP)
и использовать RANGE

Эскейп символ.

Немного усложним задачу, что если в искомой строке уже будет  специальный
символ. Например, мы хотим выбрать строку "В молоке 30% жирности"
Для этого и существуют дополнение ESCAPE. SAP рекомендует использоать символ "#"

Пример:

Для внутренних таблиц аналогично, но работает без дополнения:

 

Блокировки SAP. Позитивные\Негативные. Пример блокировок

Блокировка - отметка записи в базе данных на время проведения операции(INSERT, UPDATE и т.д.). Служит для предотвращения коллизий при доступе к записи и устанавливается на время операции на уровне БД. SAP для своей системы позволяет создал свою концепцию блокировок, которая позволяет блокировать определенные данные на все время работы транзакции.

Читать далее «Блокировки SAP. Позитивные\Негативные. Пример блокировок»

SELECT во внутренней таблице

Начиная с версии 7.52 ABAP позволяет делать внутреннюю таблицу источником данных.
Существует два варианта выполнения подобного запроса:
1. Выполнение операции на стороне сервера приложений. Работает только с операциями которые поддерживают работу с буфером.

2. Выполнение на стороне базы данных.
Для выполнения второго случая, операция должна поддерживаться самой базой данных. Иначе получаете исключение CX_SY_SQL_UNSUPPORTED_FEATURE. (удалось выполнить только в системе с HANA. Сомневаюсь, что другие БД поддерживают данную операцию)
Читать далее «SELECT во внутренней таблице»

oData Aliases работа с несколькими системами

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

Читать далее «oData Aliases работа с несколькими системами»

Динамический вызов метода бизнес-объекта

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

Читать далее «Динамический вызов метода бизнес-объекта»

Динамическое программирование ABAP. RFC ФМ для вызова методов произвольного класса.

При интеграциях между системами частенько надо получать данные из смежных систем. Самое простое -  обернуть метод  в RFC ФМ и вызвать его в нужной системе. Это хорошее решение, но что делать если нам нужно вызвать не один метод, а 50 или даже 100. Писать обертку для каждого? Довольно долгое занятие, плюс любое изменение в методе повлечет необходимость дополнительной поддержки этих ФМ. Короче, самое очевидное решение, не всегда самое удобное в конкретном случае. 
Один из альтернативных путей решений - динамическое программирование. Это способ тоже не без недостатков, но он может позволить избежать создании сотен лишних ФМ.  Если надо вызвать один-два метода, я бы не заморачивался и делал все в обертках.

Задача: Написать RFC функцию которая сможет выполнить произвольный метод любого класса и вернуть результат.
Конечно, все случаи мы не предусмотрим, особенно если классу требуется какое-то сложное создание инстанции, попробуем разобрать базовый подход.
Читать далее «Динамическое программирование ABAP. RFC ФМ для вызова методов произвольного класса.»

Узнать откуда вызвали RFC

Буквально вчера пришлось выяснять как изнутри RFC ФМ узнать систему из которой он вызвался.
Скажу кратко ФМ - 'RFC_SYSTEM_INFO' вызываем его как DESTINATION 'BACK'.
Пример вызова:

Если мы вызовем ФМ таким образом не через RFC то он ничего не возвращает.

или можно вызвать ФМ 'RFC_GET_ATTRIBUTES' тоже вернет информацию о системе

Изменить поведение стандартной кнопки в ALV GRID

Частенько у консультанта возникает желание сделать так, чтобы кнопка была стандартная и располагалась на своем обычном месте, но реакция на нажатие была несколько другоя. Особенно часто это касается кнопки выгрузки, то формуляр нужен немного другой, то какую-то постобработкку сделать и т.д. Для таких целей можно использовать событие before_user_command
Демо пример:
Читать далее «Изменить поведение стандартной кнопки в ALV GRID»

oData использование кэша для хранения данных между вызовами

Предположим, что есть некая гипотетическая ситуация, в ходе которой нужно пойти на некоторый неправильный подход с точки зрения REST. Получить данные в одном методе, а потом использовать их при следующем вызове другого метода. В этом случае можем воспользоваться классом для кэша /ui2/cl_cache_handler

Читать далее «oData использование кэша для хранения данных между вызовами»

oData обновить метаданные сервиса

Когда производятся манипуляции с сущностями oData, необходимо обновить метаданные и очистить кэш. Иначе рискуете работать с неактуальной версией сервиса.
1. Транзакция 1. /IWFND/MAINT_SERVICE - Активация и ведение сервисов

Выбираем строку с нашим сервисом и жмем "Загрузить метаданные"

Читать далее «oData обновить метаданные сервиса»