Считывание метаданных SAP HANA Calculation View в ABAP при помощи класса cl_rsdd_hana_model

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

Описание класса на sapdatasheet

Как пользоваться

Для начала создадим Calculation view типа cube, добавим в него агрегированную колонку и входящий параметр. В качестве входящих данных я взял таблицу SFLIGHT.

Фильтр наложил на поле CURRENCY, по полю PAYMENTSUM сделал агрегацию типа SUM.

Генерируем SQL запрос.

Итак, на этом этапе нам важно извлечь из запроса 2 параметра.

  • Путь ( ocrv.rgp.STADNIKOV );
  • имя модели ( EXAMPLE )

Пишем код на ABAP, применяем класс cl_rsdd_hana_model

Какие данные можно получить

В итоге я получил 2 внутренних таблицы и структуру.

e_t_metadata — каталог полей со всеми свойствами

Тут можно найти: названия полей, их описания, лейблы, типы данных в SQL и ABAP форматах, размеры целой и десятичной частей, агрегированные поля с названием агрегирующей функции. Более подробно об структуре, можно узнать по ссылке из начала статьи в графе Types.

e_t_var — входящие параметры модели.

Для нашей модели определился входящий параметр currency. В этой внутренней таблице можно найти: название, ABAP тип, размер и другие. Как вариант практического использования с помощью get_metadata() можно проверить какие у модели есть входящие параметры во время исполнения (at runtime).

Пожалуй самое интересное находится в структуре E_S_CUBE.

Мы тут видим все свойства Calculation view. Директорию, имя, тип, схему, описание, автора и даже даты создания и активации.

Что с этим можно сделать

Например можно динамически построить полноценный field catalog, с его помощью создавать внутреннюю таблицу и затем вызывать Hana модель, т.е. без предварительного объявления структуры для внутренней таблицы. Кратко об этом, я рассказывал в прошлой статье. Там я показал как вызвать соответствующий метод глобального класса. (Код класса)

Итак, еще раз, вызов. SQL запрос из примера выше, CURRENCY = EUR.

Реализация

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

Логика этого парсинга у меня вынесена в метод get_model_data().

По итогу получаются следующие результаты

  • E_PATCH = ocrv.rgp.STADNIKOV
  • E_MODEL_NAME = EXAMPLE
  • REQUEST_TAIL = (‘PLACEHOLDER’ = (‘$$CURRENCY$$’, ‘EUR’)) GROUP BY «CARRID», «CONNID», «FLDATE», «PRICE», «CURRENCY_1», «PLANETYPE», «SEATSMAX», «SEATSOCC», «SEATSMAX_B», «SEATSOCC_B», «SEATSMAX_F», «SEATSOCC_F»

Извлекаем метаданные

Далее необходимо сформировать блок запроса select по набору вызываемых полей и параллельно сформировать field catalog.

Тут я реализовал 2 варианта, select со звездочкой (*) и набором вызываемых полей.

Select со звездочкой (*)

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

Метод append_field()

Select с набором вызываемых полей

Тут немного сложнее. Мы знаем что набор полей идет через запятую до ключевого слова FROM, исходя из этих правил создаем внутреннюю таблицу с набором полей из запроса, перебираем их, ищем соответствия в полученном наборе полей, формируем начало строки SQL.

Все готово для формирования валидного sql запроса, т.е. теперь набор вызываемых полей будет соответствовать полям из field catalog’а

Собираем весь запрос, i_top — входящий параметр ограничивающий количество возвращаемых записей.

Далее осталась создать динамическую внутреннюю таблицу и вызвать SQL запрос

Результат

В конце всех манипуляций, в <result_table> можно увидеть следующий результат.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *