Разработка на ABAP для SAP HANA

    Привет, хабрасообщество!

    В данной статье я хотел бы осветить новые подходы к разработке на ABAP, применительно к SAP HANA. Мы рассмотрим новые элементы языка ABAP, которые позволят эффективнее использовать возможности, предоставляемые SAP HANA.

    Допустим, у нас есть отчет, написанный на языке ABAP, время работы которого нас не устраивает. Мы хотим оптимизировать работу этого отчета. Основная идея изменения логики работы отчета, заключается в том, что часть логики отчета, которая интенсивно использует данные из СУБД (в нашем случае это SAP HANA), будет делегирована на уровень СУБД.

    image
    Рис.1. Code to Data pushdown.

    Для осуществления этого подхода могут быть использованы следующие конструкции:
    1. Расширенный Open SQL
    2. FOR ALL ENTRIES
    3. ABAP Managed Database Procedures


    Расширенный Open SQL


    Начиная с Application Server ABAP 7.4 SP5 были значительно расширены возможности встроенного в ABAP языка работы с базами данных -– Open SQL.

    image
    Рис.2. Расширенный Open SQL

    Новые возможности Open SQL:
    1. Расширенный JOIN БД таблиц
    2. Арифметические выражения
    3. Строковые выражения
    4. CASE, COALESCE выражения

    Дополнительную информацию по расширенному Open SQL вы можете найти в курсе от Open SAP под названием “ABAP Development for SAP HANA” (link).

    FOR ALL ENTRIES


    Новые возможности касаются, как правило, оперированием оперирования с таблицами на уровне СУБД.Но часто возникают ситуации, когда нужно совместно «манипулировать» как внутренними таблицами так и таблицами базы данных. Для этих целей можно использовать конструкцию SELECT … FOR ALL ENTRIES (FAE).

    SELECT result FROM table FOR ALL ENTRIES IN itab WHERE… col op itab_comp…

    Эта конструкция выражение не имеет соответствия в стандарте языка SQL, поэтому интерпретатор осуществляет преобразование к семантически эквивалентному SELECT выражению, которое может быть выполнено базой данных.
    Управлять процессом преобразования можно с использованием ProfileParameters (задаются в тарнзакции RZ11):
    • rsdb/prefer_in_itab_opt (преобразовать к IN)
    • rsdb/prefer_join (преобразовать к JOIN)
    • rsdb/prefer_union_all (преобразовать к UNION ALL)
    • rsdb/max_blocking_factor (максимальное кол-во строк переданных из itab)
    • rsdb/max_in_blocking_factor (максимальное кол-во строк переданных из itab в случае с IN)


    Например, конструкция:
    ABAP
    SELECT col1, col2, ..., colM from TAB
    FOR ALL ENTRIES IN itab
    WHERE col1 op1 itab-a1
    op col2 op2 itab-a2

    op colM opM itab-aM


    в зависимости от настроек может быть преобразована следующими способами:
    UNION
    SELECT col1, col2, ..., colM FROM TAB WHERE col1 op1 i11 op col2 op2 i12 op… op colM opM i1N
    UNION ALL SELECT col1, col2, ..., colM FROM TAB WHERE col1 op1 i21 op col2 op2 i22 op… op colM opM i2N

    UNION ALL SELECT col1, col2, ..., colM FROM TAB WHERE col1 op1 iM1 op col2 op2 iM2 op… op colM opM iMN


    OR
    SELECT col1,, col2, ..., colM FROM TAB WHERE col1 op1 i11 op col2 op2 i12 op… op colM opM i1N
    OR col1 op1 i21 op col2 op2 i22 op… op colM opM i2N

    OR col1 op1 iM1 op col2 op2 iM2 op… op colM opM iMN


    IN
    SELECT col1, col2, ..., colM FROM TAB WHERE (col1, ..., colM) IN ( (i11, ..., i1N),
    (i21, ..., i2N),

    (iM1, ..., iMN) )


    JOIN
    SELECT col1, col2, ..., colM FROM TAB, ABAP_ITAB AS T1 ( C_1 datatype, C_2 datatype, ..., C_M datatype )
    WHERE TAB.col1 op1 T1.C_1 op
    op TAB.col2 op2 T1.C_2

    op TAB.colM opM T1.C_M


    Profile parameters могут быть перегружены с использованием хинтов:
    SELECT * FROM [..] FOR ALL ENTRIES IN [..] WHERE [..]
    %_HINTS HDB '&prefer_join 1'.


    Дополнительную информацию по FOR ALL ENTRIES вы найдете в SAP нотах 48230, 129385, 1622681.

    ABAP Managed Database Procedures (AMDP)





    Не всегда функциональности Open SQL бывает достаточно. Например, Open SQL выражение может получить на вход и вернуть только одну внутреннюю таблицу. Для реализации более сложной логики запроса к СУБД все в той же версии AS ABAP 7.4 SP5 появилась возможность создавать хранимые процедуры SAP HANA прямо в ABAP. Выглядит это так, как будто хранимая процедура «оборачивается» в метод класса.Для создания и редактирования AMDP потребуется ABAP Development Tools in Eclipse версии 2.19 или выше. Просматривать код AMDP можно и в SAP GUI (например, через транзакции SE24, SE80).

    image
    Рис.3. ABAP Managed Database Procedures

    Возможности AMDP:
    1. Поддержка Lifecycle-Management
    2. Использование объектов ABAP словаря
    3. Вызов других AMDP
    4. Язык написания – SQL Script
    5. Вызывается как обычный ABAP метод

    Дополнительную информацию по AMDP вы можете найти все в том же курсе от “ABAP Development for SAP HANA” (link) или в SCN(link).

    Итоги

    В этой статье мы хотели показать, что в ABAP имеется развитый инструментарий, который позволяет эффективно использовать возможности SAP HANA.

    Полезные ссылки
    SAP
    87,03
    Лидер рынка корпоративных приложений
    Поделиться публикацией

    Комментарии 12

      –1
      А под кат спрятать саму статью нельзя было?
        0
        Исправил.
        +1
        Планируется полноценная поддержка SQL?

        В статье говорится о новизне и больших возможностях, но запросы, на которых построена основная часть логики программ, до сих пор ограничены «очень своеобразным» синтаксисом. Да кейсы и динамическая типизация таблиц это очень круто и сэкономит много времени, но все же… Доколе? :)

        Поддержка новейшего OpenSQL?
        image
          0
          В SAP NW 7.4 SP5 также появились CDS Views (1, 2, 3).

          Языком написания AMDP является не OpenSQL, а SQL Script.

          Какие конкретно возможности SQL-92 вас интересуют?
            –1
            О. Живой SAPовец. А можно задать Вам вопрос для общего развития?
            Откуда в SAP взялось это совершенно идиотское ограничение в 40 символов и как вообще с этим работать и жить?
              0
              В ERP столько ограничений, про какие именно 40 символов идёт речь?
                0
                В наименованиях. «Краткий текст»
                  0
                  Простите, в наименованиях чего? Какая таблица\программа\поле?
                    +1
                    Ответ прост и печален: тип CHAR занимает фиксированную длину в таблице, был даже специальный костыль LCHR для длинных строк, который имеет ряд ограничений.
                    Сейчас есть тип STRING, который может держать любые строки и не жрёт лишней памяти (наконец-то), но старые разработки, боюсь никто уже никогда изменять не будет.
                      0
                      У меня есть подозрения, зная общую идеологию SAP, что ноги растут аж со стандарта перфокарт IBM, которые 80 символов. Ну и юникод — итого целых 40.
                        0
                        Я думаю с появления abap-словаря в 1983, а вот Юникода изначально не было, поэтому вряд ли эта теория верна.
                        Интересно, что у некоторых до сих пор установлена ERP без поддержки юникода, ведь до седьмой версии SAP NetWeaver (аж 2008-ой год!) юникод не был обязательным. При конвертации максимально допустимая длина строк не уменьшалась: как было 40, так и осталось.
                  0
                  Так исторически сложилось, видимо ничего не остаётся, кроме как просто смириться с этим…

                  Как работать и жить? Сокращать где можно, а в документации, в том числе и к создаваемым объектам, писать пояснения «что это» и «для чего нужно» — придёт за вами программист, увидит ZE731_T48_PCKGCF, ужаснётся, прочитает в документации «Table for document packages creation flags» и скажет больше спасибо :)

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое