ABAP Object Services — Query Service

1401801143_033

Ранее было показано, каким образом можно загрузить хранимый объект из БД относительно ключевых полей и даже как массово их инициализировать (метод GET_PERSISTENT_BY_KEY_TAB). Альтернативой подобному методу служит — Query Service. QS — Инструмент позволяющий Вам делать поиск и загрузку хранимых объектов, относительно логических выражений (условий). Кроме фильтров относительно условий, QS позволяет задать параметры сортировки. Используя QS, вам не надо будет выбирать отдельные ключевые поля, т.о. для массовой инициализации группы объектов, система выполнит только один SQL запрос.

Пример использования QS с фильтром по дате полёта:

Для того чтобы иметь возможность получить объекты по запросу, необходимо сначала этот запрос создать. За создание запроса отвечает менеджер запросов, получить ссылку на который, можно через класс CL_OS_SYSTEM. Далее, используя метод CREATE_QUERY, создается экземпляр класса запроса (реализующего интерфейс — IF_OS_QUERY). В данный метод передан параметр, формирующий динамическое условие относительно даты полёта. Результатом запроса будет внутренняя таблица (gt_result), заполненная ссылочными переменными на хранимые объекты.

 

Компоненты Query Service

 

QS включает в себя следующие компоненты:

gs_components

 

Методы менеджера запросов (IF_OS_QUERY_MANAGER)

CREATE_QUERY. Создание экземпляра класса запроса, на вход получает следующие параметры: I_FILTER,I_ORDERING,I_PARAMETERS. Условие фильтрации основано на динамическом вызове WHERE, с поддержкой некоторых условий относительно ссылочных переменных. Как и в условии WHERE, поддерживаются логические операторы AND, OR, NOT, а так же объединение условий через круглые скобки. При вызове запроса через агент класса, фильтрация привязана к атрибутам хранимого класса для этого агента, атрибуты должны быть публичными (public) хранимыми атрибутами, иначе произойдет исключение. Таким образом, созданный объект запроса может использоваться разными агентами, но с соблюдением условий наличия атрибутов.

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

Условия фильтрации поддерживают следующие операторы:

  • =, <>, <, <=, >, >=
  • attr [NOT] LIKE { pattern } [ESCAPE escape]
  • attr IS [NOT] NULL
  • attr EQUALSREF par – Сравнение двух ссылочных переменных. Когда выполняется запрос, параметр parдолжен быть привязан к ссылочной переменной хранимого класса.
  • NOT expr
  • expr AND expr
  • expr OR expr

Примеры фильтров:

  • price < ‘100’ AND currency = ‘EUR’
  • name LIKE PAR1 AND age > ’45’ AND age < ’65’
  • ( department EQUALSREF DEP1 OR department EQUALSREF DEP2 ) AND NOT ( salary > ‘50000’ AND currency = ‘EUR’ ) )

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

Если параметров будет больше чем 3, необходимо использовать таблицу параметров (нельзя одновременно использовать i_par1-3 и таблицу параметров).  Пример:

I_PARAMETERS — определяет имена используемых в запросе параметров, имена должны быть разделены пробелом. В условии сортировки I_ORDERING может быть прописано два вида условия: сортировка по возрастанию и сортировка по убыванию, пример:

price ASCENDING date DESCENDING

 

Методы интерфейса IF_OS_QUERY

IF_OS_QUERY~GET_EXPR_FACTORY.Получает ссылку на фабрику условий, класс реализующий интерфейс IF_OS_QUERY_EXPR_FACTORY. С помощью фабрики условий можно формировать условия во внутреннем представлении QS.

IF_OS_QUERY~SET_FILTER_EXPR. Установка условия фильтрации, на вход принимает класс реализующий интерфейс IF_OS_QUERY_FILTER_EXPR. Ссылку на данный класс можно получить через фабрику условий:

В условии выражения с операторами можно указать индекс в таблице с параметрами:

IF_OS_QUERY~SET_PARAMETERS_EXPR. Устанавливает список параметров для условия фильтрации:

IF_OS_QUERY~SET_ORDERING_EXPR. Устанавливает условия сортировки:

Условия фильтрации, показанные ранее, включали в себя всего одно условие, QS позволяет создавать комплексные условия (OR,AND,NOT), пример:

Инициировать объекты через QS можно как с помощью агента класса, так и с помощью менеджера постоянства, указав имя класса: