ABAP/4

Типы данных

N, С – символ

I – integer

D – date

T – time

X – Hex

Задание константы

CONSTANTS:

max_count TYPE I Value 9999.

Дата

Формат: YYYYMMDD

минус без пробела это обращение к полю структуры

плюс без пробела это сдвиг по строке

DATA:

day1 TYPE D.

day1 = sy-datum.  //получение текущей даты

day1+6(2) = ’01’. //сдвиг на 6 символов вправо и выделить 2 символа , присвоить им значение 01

Сложные типы

Структура переменной

DATA: BEGIN OF customer,

id(8) type n,

name(25),

tel(12),

END OF customer.

Работа с ней:

Data vendors LIKE customer,

customer-id = ‘1’.

customer-name=’red’.

customer-tel = ‘987897786’.

MOVE customer TO vendor.

Структура типа

TYPES: BEGIN OF pers_data,

name(25),

city(25),

street(30),

END OF per_data.

Работа с ней

DATA people TYPE pers_data OCCURS 100.

Операторы 

MOVE: receiver TO receiver_tab.

Команда MOVE-CORRESPONDING копирует из одной записи в другую компоненты с одинаковыми именами. Поля с одинаковыми именами копируются независимо от их позиции внутри записи.

со строками

DATA: str1(3) VALUE ‘Red’,

     str2(6) VALUE ‘Yellou’,

     str3(6) VALUE ‘Green’,

     str4(50).

CONCATENATE str1 str2 str3 INTO str4 SEPARATED BY ‘,’.

Разделитель

DATAlist(40VALUE ‘edison, ivi,mayson, tailor’,
name1(20)name2(20)name3(20)name4(20).
SPLIT list AT‘,’ INTO name1 name2 name3 name4.
WRITE list.

ИЛИ

DATAlist(40VALUE ‘edison, ivi,mayson, tailor’,
name1(20)name2(20)name3(20)name4(20).
DATA names LIKE name1 OCCURS 100.
SPLIT list AT ‘,’ INTO TABLE names.
write list.

Сдвинуть символьную строку можно командой SHIFT.

SHIFT name1 BY places.
SHIFT name2 RIGHT.
SHIFT name3 UP TO ‘JON’.

Замена

REPLACE ‘E’ WITH ‘Ma’ INTO list.

Для замены всех символов ‘,’ на ‘.’ используется команда TRANSLATE.

Поиск символьных строк в полях или внутренних таблицах  осуществляется по команде SEARCH. Системное поле sy-fdpos содержит сдвиг найденной строки относительно начала.

Пример:

SEARCH list FOR ‘Green’.

IF sy-subrc NE 0.

WRITE ‘Not found’.

ENDIF.

РАБОТА С ВНУТРЕННИМИ ТАБЛИЦАМИ.

Чтение строки из внутренней таблицы осуществляется оператором READ TABLE.

READ TABLE <вн.табл.> FROM <раб.обл.> INTO <результат>.

В случае, безуспешного поиска системное поле sy-subrc устанавливается в отличное от нуля значение и в 0 в случае успеха.

Вставка записи во внутреннюю таблицу осуществляется с помощью операторов INSERT или APPEND.

INSERT < раб.обл.> INTO <вн. таблица>.

APPEND < раб.обл.> TO <вн. таблица>.

Пример:

DATABEGIN OF line,
col1 TYPE i,
col2 TYPE i,
END OF line.
DATA itab LIKE TABLE OF Line WITh HEADER LINE.
DO TIMES.
linecol1 syindex.
linecol2 syindex ** 2.
INSERT line INTO TABLE itab.
ENDDO.
linecol1 2linecol2 3.
READ TABLE itab WITH key col1 col2 4.
WRITE itabcol1.

Cобытия, инициализируемые системой

INITIALIZATION

AT SELECTION- SCREEN

START-OF-SELECTION

GET

END-OF-SELECTION

Cобытия, инициализируемые пользователем

AT LINE-SELECTION

AT PFN

AT USER-COMMAND

События, инициализируемые программой

TOP-OF-PAGE

END-OF-PAGE

Пример программы,  иллюстрирующей  работу операторов: IF/ELSEIF/ELSE/ENDIF , DO/ENDDO , CASE/WHEN/ENDCASE.

Пример:

 

REPORT ZELSEIF .

 

DATA RESULT TYPE I.

 

DATA: ONE   TYPE I VALUE 1,

     THREE TYPE P VALUE 3,

     FOUR  TYPE P VALUE 4.

 

DATA: BEGIN OF WORD,

       ONE   VALUE ‘E’,

       TWO   VALUE ‘X’,

       THREE VALUE ‘A’,

       FOUR  VALUE ‘M’,

       FIVE  VALUE ‘P’,

       SIX   VALUE ‘L’,

       SEVEN VALUE ‘E’,

       EIGHT VALUE ‘!’,

     END   OF WORD,

     LETTER1, LETTER2.

 

DATA COUNT TYPE I.

 

DATA: SEARCH_ME TYPE I,

     MIN       TYPE I VALUE 0,

     MAX       TYPE I VALUE 1000,

     TRIES     TYPE I,

     NUMBER    TYPE I.

 

RESULT = 1.

IF RESULT < 0.

 WRITE / ‘RESULT LESS THAN ZERO’.

ELSEIF RESULT = 0.

 WRITE / ‘RESULT EQUAL ZERO’.

ELSE.

 WRITE / ‘RESULT GREATER THAN ZERO’.

ENDIF.

 

DO 4 TIMES.

 CASE SY-INDEX.

   WHEN ONE.

     WRITE / ‘THAT IS’.

   WHEN 2.

     WRITE   ‘A’.

   WHEN THREE.

     WRITE ‘GOOD’.

     WRITE ‘EXAMPLE’.

   WHEN OTHERS.

     WRITE ‘!’.

 ENDCASE.

ENDDO.

 

SKIP.

 

DO VARYING LETTER1 FROM WORD-ONE NEXT WORD-THREE

  VARYING LETTER2 FROM WORD-TWO NEXT WORD-FOUR.

 WRITE:  LETTER1, LETTER2.

 IF LETTER2 = ‘!’.

   EXIT.

 ENDIF.

ENDDO.

 

SKIP.

 

WRITE: / ‘COUNT_INIT = ‘, COUNT.

 

DO 10 TIMES.

 ADD SY-INDEX TO COUNT.

 ENDDO.

WRITE: / ‘COUNT = ‘, COUNT.

 

SEARCH_ME = 23.

WHILE NUMBER <> SEARCH_ME.

 ADD 1 TO TRIES.

 NUMBER = ( MIN + MAX ) / 2.

 IF NUMBER > SEARCH_ME.

   MAX = NUMBER – 1.

 ELSE.

   MIN = NUMBER + 1.

 ENDIF.

ENDWHILE.

 

SKIP.
WRITE: / ‘NUMBER = ‘, NUMBER, ‘MAX = ‘, M AX, ‘MIN = ‘, MIN.

Создание подпрограмм и функциональных модулей

Форма или подпрограмма определяется парой операторов FORM/ENDFORM и вызывается из основной программы с помощью оператора PERFORM.

При необходимости объединить и локализовать данные,  принадлежащие только этой подпрограмме,  следует определить эту локальную переменную внутри формы обычным  образом, c помощью ключевого слова DATA.

Применение локальных переменных улучшают читабельность исходных текстов. Напротив, работа с глобальными данными в подпрограмме может привести к ошибкам и затруднённому анализу текста программ.

Статические переменные STATICS применяются, когда необходимо сохранить содержимое локального объекта данных  от однго вызова подпрограммы до другого,  (то есть внутри неё).  

Возвращаемая из формы информация передаётся с помощью параметров интерфейса.

Иногда для  выполнения подпрограммы необходимо передать туда параметры, которым при каждом вызове присваиваются  необходимые фактические значения.

В ABAP/4  поддерживаются различные способы передачи параметров.  Параметры интерфейса бывают 2-х  типов:

  • только для чтения (USING);
  • изменяемые (CHANGING).

По способам  передачи их можно классифицировать так:

  • передаваемые по значению (BY VALUE)
  • передаваемые по ссылке (BY REFERENCE)

Параметры,  описанные как using, не могут изменяться внутри формы,  однако при выполнении программы различий  между определениями  USING  и CHANGING  нет. Чтобы облегчить чтение программы, рекомендуется по-разному обозначать входные (USING)  и выходные (CHANGING) параметры, передаваемые по ссылке.

Дополнение TABLES itab1, itab2, …  позволяет передавать в подпрограмму внутренние таблицы. Они могут передаваться со строкой заголовка (HEADER LINE) или без.  Если внутренняя таблица передаётся без header line,  то после имени внутренней таблицы должны стоять []: itab[]. Параметры таблицы всегда передаются по ссылке.

Подпрограммы можно также вызывать из других программ.  Например:
PERFORM FORM IN PROGRAM PROG [IF FOUND].

Функции определяются парой операторов – FUNCTION и ENDFUNCTION и вызывается с помощью оператора CALL FUNCTION.  Имя функции записывается прописными  буквами.

ИНТЕРФЕЙСНЫЕ ПАРАМЕТРЫ

Формальные параметры функции подразделяются на импортируемые, экспортируемые и изменяемые. В операторе CALL FUNCTION описание формальных параметров располагается слева от знака =,  а фактических – справа. Фактические параметры идентифицируются по имени формальных. Значение дополнения IMPORTING и EXPORTING зависит от того, где они употребляются: в вызывающей или в вызываемой функции.

Передача параметров по значению и по ссылке синтаксически различается по дополнениям VALUE(P) и REFERENCE(P).

Для любого параметра можно задать тип, указав ссылку на структуру или на поле в Dictionary, или применить прямую ссылку на тип.

Импортируемые и изменяемые параметры могут быть отнесены к разряду необязательных.

В интерфейсе функции разрешено использовать внутренние таблицы, которые всегда вызываются по ссылке.

Работа с таблицами

Пример:

SELECT * FROM MARA.

ENDSELECT.

Чтение списка всех полей всех записей таблицы во внутреннюю таблицу.

Пример:

SELECT * FROM MARA INTO INTTAB.

ENDSELECT.

Копирование содержимого всей таблицы во внутреннюю таблицу.

Пример:

SELECT * FROM MARA INTO TABLE INTTAB.

Выборка подмножества записей, удовлетворяющих определенному условию.

Пример:

SELECT * FROM MARA WHERE (MATNR < 5).

ENDSELECT.

Комбинация нескольких условий для выборки.

Пример:

SELECT * FROM MARA

WHERE (MATNR < 5) AND ( MTART = ‘ABCD’).

ENDSELECT.

Использование в условиях шаблона для поиска.

Пример:

SELECT * FROM MARA WHERE (MATNR LIKE ‘_M%’) .

ENDSELECT.

Чтение единственного элемента таблицы.

Пример:

SELECT SINGLE * FROM MARA.

Извлечение единственного поля.

Пример:

SELECT MATNR INTO I_MATNR FROM MARA.

ENDSELECT.

Получение статистической информации о данных в таблице.

Пример:

DATA:

COUNT TYPE I, SUM TYPE P DECIMALS 2, AVG TYPE F.

SELECT COUNT( * ) SUM( LUGGWEIGHT ) AVG( LUGGWEIGHT )

INTO (COUNT, SUM, AVG)

FROM SBOOK.

Упорядочение результатов запроса.

Пример:

SELECT * FROM MARA GROUP BY MTART.

Получение данных из нескольких таблиц с помощью вложенных циклов SELECT.

SELECT * FROM MARA.

SELECT SINGLE MAKTX INTO TEXT

FROM MAKT WHERE MATNR = MARA-MATNR.

WRITE: / MARA-MATNR, TEXT.

ENDSELECT.

ПРИМЕРЫ ЗАПРОСОВ

DATABEGIN OF seats,
fldate TYPE sflightfldate,
seatsocc TYPE sflightseatsocc,
seatsmax  TYPE sflightseatsmax,
seatsfree TYPE sflightseatsocc,
END OF seats.

DATA seats_tab LIKE STANDARD TABLE OF seats
INITIAL SIZE 3.
seatsfldate sydatum.
*Do 10 TIMES.
*  seats-seatsocc = sy-index.
*  APPEND seats TO seats_tab.
*ENDDO.
*INSERT seats
*         INTO seats_tab INDEX 1 .
APPEND seats TO seats_tab.
seatsfldate ‘awdwddwd’.
MODIFY seats_tab INDEX FROM seats.
BREAK-POINT.

DELETE seats_tab INDEX 1.

Использование SELECT-OPTIONS в запросах

DATABEGIN OF seats,
fldate TYPE sflightfldate,
seatsocc TYPE sflightseatsocc,
seatsmax  TYPE sflightseatsmax,
seatsfree TYPE sflightseatsocc,
END OF seats.
SELECT-OPTIONS opt FOR seatsfldate.

DATA seats_tab LIKE STANDARD TABLE OF seats
INITIAL SIZE 3.
seatsfldate sydatum.
Do 10 TIMES.
seatsfldate sydatum + syindex.
APPEND seats TO seats_tab.
ENDDO.

DELETE seats_tab WHERE fldate IN opt.

SORT

Do 10 TIMES.
seatsseatsocc syindex MOD 3.
APPEND seats TO seats_tab.
ENDDO.
SORT seats_tab BY seatsocc DESCENDING .//ЛИБО ASCENDING

Loop At

DATAld_ranint type QF00RAN_INT.
DATABEGIN OF seats,
fldate    TYPE sflightfldate,
seatsocc  TYPE sflightseatsocc,
seatsmax  TYPE sflightseatsmax,
seatsfree TYPE sflightseatsocc,
END OF seats.
SELECT-OPTIONS opt FOR seatsseatsocc.
DATA seats_tab LIKE STANDARD TABLE OF seats
INITIAL SIZE 3.
*seats-fldate = sy-datum.
Do 10 TIMES.
seatsseatsocc syindex MOD 3.
APPEND seats TO seats_tab.
ENDDO.
*SORT seats_tab BY seatsocc DESCENDING.
*DELETE seats_tab WHERE fldate IN opt.
LOOP AT seats_tab INTO seats WHERE seatsocc IN opt.
WRITE seatsseatsocc.
ENDLOOP.
*BREAK-POINT.

READ TABLE

READ TABLE itab FROM line INTO line.

READ TABLE seats_tab INTO seats WITH KEY seatsocc 1.
READ TABLE seats_tab INTO seats INDEX 1.

Табличные типы данных (Standart & Sorted Tables)

TYPESBEGIN OF line,
column1 TYPE i,
column2 TYPE i,
column3 TYPE i,
END OF line.
TYPES itab TYPE SORTED TABLE OF line WITH UNIQUE KEY column1.

Создание табличного типа данных (SE11)

SELECT С созданой таблицей

DATA avto TYPE TABLE OF ZAVTO WITH HEADER LINE.
SELECT FROM zavto into CORRESPONDING FIELDS OF TABLE avto.

Либо DATA avto TYPE TABLE OF ZAVTO.
SELECT FROM ZAVTO INTO TABLE avto.

SELECT с выводом через loop at

DATA avto TYPE TABLE OF ZAVTO WITH HEADER LINE.
SELECT FROM ZAVTO INTO TABLE avto.
LOOP AT avto.
WRITE avtoname.
ENDLOOP.
BREAK-POINT.

INSERT

DO TIMES.
avtocar_mass syindex.
avtoname syindex 3.
append avto.
ENDDO.

INSERT  zavto from avto .
BREAK-POINT.

со структурой 

DATA dat TYPE zavto.

INSERT INTO zavto VALUES dat.