Разработчики SAP постоянно нас радуют новыми апгрейдами, в том числе и в ABAP; сегодня я хотел бы рассмотреть новые конструкции языка, которые упрощают нам с вами жизнь.

Содержание

Аннотация

Работа с операторами

Оператор VALUE

Примеры использования

Пример №1. Несколько способов инициализации структур

Пример №2. Инициализации внутренних таблиц

Пример №3. Инициализация сложных типов таблиц с глубокой структурой

Оператор FOR

Примеры использования

Пример №4. Копирование данных при создании таблицы из другой внутренней таблицы

Пример №5. Использование WHERE условий в операторе FOR

Пример №6. Использование вложенных FOR

TABLE EXPRESSIONS

Примеры использования

Пример №7. Чтение таблицы по индексу

Пример №8. Запись значений компонента в таблицу по индексу

Пример №9. Поиск и выдача данных из таблицы с использованием ключа, без какой-либо рабочей области

Аннотация

Разработчики SAP постоянно нас радуют новыми апгрейдами, в том числе и в ABAP; сегодня я хотел бы рассмотреть новые конструкции языка, которые упрощают нам с вами жизнь. Я использовал как материалы с официальных блогов SAP, так и некоторые заметки из иностранных обзоров. Цель же моя проста: познакомить тех, кто еще не знает этого, с новыми операторами и конструкциями языка, а может, и напомнить, о том, что иногда стоит привыкать делать что-то «по-новому», оставляя старые привычки позади!

Итак, рассмотрим два новых оператора и синтаксис работы с внутренними таблицами:

  1. Оператор VALUE
  2. Оператор FOR
  3. Выражения для внутренних таблиц (TABLE EXPRESSIONS)

Работа с операторами

Оператор VALUE

Для начала обратимся к официальной информации и почитаем, что пишут о новом операторе:

1. VDLUE – это по сути конструктор, который определяет данные с указанным типом

… VALUE dtype|#( ) …

2. Он может установить начальные значения для любого типа данных

… VALUE dtype|#( comp1 = a1 comp2 = a2 … ) …

3. Он может установить значение сразу для нескольких записей

… VALUE dtype|#( ( … ) ( … ) … ) …

4. Он не работает с простыми типами

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

VALUE dtype|#( col1 = dobj11 … ( col2 = dobj12 col3 = dobj13 … ) 
                                 ( col2 = dobj22 col3 = dobj23 … ) 
                                   … 
               col1 = dobj31 col2 = dobj32 … ( col3 = dobj33 … ) 
                                               ( col3 = dobj43 … ) 
               … ).

Как видно, синтаксис имеет гибкую структуру и чем-то походит на объявления массивов в современных языках программирования.

 Примеры использования

Пример №1. Несколько способов инициализации структур

TYPES:  BEGIN OF t_col2, 
           col1 TYPE i, 
           col2 TYPE i, 
        END OF t_col2.


TYPES: BEGIN OF t_struct, 
         col1 TYPE i, 
         col2 TYPE t_col2, 
       END OF t_struct.

DATA: struct TYPE t_struct, 
      col2 TYPE t_col2. 

“1
struct = VALUE t_struct( col1 = 1 
                         col2-col1 = 1 
                         col2-col2 = 2 ).

“2

col2   = VALUE   t_col2( col1 = 1 
                         col2 = 2 ). 
struct = VALUE t_struct( col1 = 1 
                         col2 = col2 ).

“3

struct = VALUE t_struct( col1 = 1 
                         col2 = VALUE #( col1 = 1 
                                         col2 = 2 ) ).

Пример №2. Инициализации внутренних таблиц

TYPES t_itab TYPE TABLE OF i WITH EMPTY KEY.

DATA itab TYPE t_itab.

itab = VALUE #( ( ) ( 1 ) ( 2 ) ).


DATA itab TYPE RANGE OF i.


itab = VALUE #( sign = ‘I’  option = ‘BT’ ( low = 1  high = 10 ) 
                                          ( low = 21 high = 30 ) 
                                          ( low = 41 high = 50 ) 
                            option = ‘GE’ ( low = 61 )  ).

Пример №3. Инициализация сложных типов таблиц с глубокой структурой

TYPES:

  BEGIN OF ty_alv_data,

    kunnr   TYPE kunnr,

    name1   TYPE name1,

    ort01   TYPE ort01,

    land1   TYPE land1,

    t_color TYPE lvc_t_scol,

  END   OF ty_alv_data.

TYPES: tt_alv_data TYPE STANDARD TABLE OF ty_alv_data

                                        WITH DEFAULT KEY.

* classical

DATA: itab_alv_c TYPE tt_alv_data.

FIELD-SYMBOLS: <fs_a>   LIKE LINE OF itab_alv_c,

               <fs_col> LIKE LINE OF <fs_a>-t_color.

APPEND INITIAL LINE TO itab_alv_c ASSIGNING <fs_a>.

<fs_a>-kunnr = '123'.

<fs_a>-name1 = 'ABCD'.

<fs_a>-ort01 = 'LV'.

<fs_a>-land1 = 'NV'.

APPEND INITIAL LINE TO <fs_a>-t_color ASSIGNING <fs_col>.

<fs_col>-fname = 'KUNNR'.

<fs_col>-color-col = COL_NEGATIVE.

<fs_col>-color-int = 0.

<fs_col>-color-inv = 0.

APPEND INITIAL LINE TO <fs_a>-t_color ASSIGNING <fs_col>.

<fs_col>-fname = 'ORT01'.

<fs_col>-color-col = COL_TOTAL.

<fs_col>-color-int = 1.

<fs_col>-color-inv = 1.

APPEND INITIAL LINE TO itab_alv_c ASSIGNING <fs_a>.

<fs_a>-kunnr = '456'.

<fs_a>-name1 = 'XYZ'.

<fs_a>-ort01 = 'LA'.

<fs_a>-land1 = 'CA'.


* Using VALUE

DATA(itab_alv) =

  VALUE tt_alv_data(

                    "First Row

                    ( kunnr = '123' name1 = 'ABCD'

                        ort01 = 'LV' land1 = 'NV'

                        " color table

                        t_color = VALUE #(

                                          " Color table - First Row

                                           ( fname = 'KUNNR'

                                             color-col = COL_NEGATIVE

                                             color-int = 0

                                             color-inv = 0

                                            )

                                          " Color Table - 2nd Row

                                           ( fname = 'ORT01'

                                             color-col = COL_TOTAL

                                             color-int = 1

                                             color-inv = 1

                                            )

                                          )

                    )

                    "Second row

                   ( kunnr = '456' name1 = 'XYZ'

                        ort01 = 'LA' land1 = 'CA'

                    )

                 ).

Тесно с этим оператором может сотрудничать еще один новенький оператор, оператор FOR!

Оператор FOR

Этот оператор предоставляет возможность пройтись по таблице (почти как старый добрый LOOP), и по своей природе является итератором, его особенность в удобном синтаксисе и достаточно широких возможностях использования.

Рассмотрим мини-пример:

DATA(t_city) =
  VALUE tt_citys(
    FOR ls_cust IN t_customres
      INDEX INTO cust_index
    ( ls_cust-city )
  ).
 

Мы определяем таблицу t_city, записи в которую добавляются одновременно с созданием. В таблицу t_ заносятся все города из таблицы ls_cust, одновременно с каждой итерацией переключается индекс строки в переменной cust_index.

Примеры использования

Посмотрим полные примеры использования…

Пример №4. Копирование данных при создании таблицы из другой внутренней таблицы

 
TYPES:
  BEGIN OF ty_customer,
    customer TYPE char10,
    NAME     TYPE char30,
    city     TYPE char30,
    route    TYPE char10,
  END   OF ty_customer.
TYPES: tt_customers TYPE SORTED TABLE OF ty_customer

Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland

У вас уже есть учетная запись?

Войти