Типы данных
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 ‘,’.
Разделитель
DATA: list(40) VALUE ‘edison, ivi,mayson, tailor’,
name1(20), name2(20), name3(20), name4(20).
SPLIT list AT‘,’ INTO name1 name2 name3 name4.
WRITE list.
ИЛИ
DATA: list(40) VALUE ‘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 3 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 <вн. таблица>.
Пример:
DATA: BEGIN OF line,
col1 TYPE i,
col2 TYPE i,
END OF line.
DATA itab LIKE TABLE OF Line WITh HEADER LINE.
DO 4 TIMES.
line–col1 = sy–index.
line–col2 = sy–index ** 2.
INSERT line INTO TABLE itab.
ENDDO.
line–col1 = 2. line–col2 = 3.
READ TABLE itab WITH key col1 = 2 col2 = 4.
WRITE itab–col1.
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.
ПРИМЕРЫ ЗАПРОСОВ
DATA: BEGIN OF seats,
fldate TYPE sflight–fldate,
seatsocc TYPE sflight–seatsocc,
seatsmax TYPE sflight–seatsmax,
seatsfree TYPE sflight–seatsocc,
END OF seats.
DATA seats_tab LIKE STANDARD TABLE OF seats
INITIAL SIZE 3.
seats–fldate = sy–datum.
*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.
seats–fldate = ‘awdwddwd’.
MODIFY seats_tab INDEX 1 FROM seats.
BREAK-POINT.
DELETE seats_tab INDEX 1.
Использование SELECT-OPTIONS в запросах
DATA: BEGIN OF seats,
fldate TYPE sflight–fldate,
seatsocc TYPE sflight–seatsocc,
seatsmax TYPE sflight–seatsmax,
seatsfree TYPE sflight–seatsocc,
END OF seats.
SELECT-OPTIONS opt FOR seats–fldate.
DATA seats_tab LIKE STANDARD TABLE OF seats
INITIAL SIZE 3.
seats–fldate = sy–datum.
Do 10 TIMES.
seats–fldate = sy–datum + sy–index.
APPEND seats TO seats_tab.
ENDDO.
DELETE seats_tab WHERE fldate IN opt.
SORT
Do 10 TIMES.
seats–seatsocc = sy–index MOD 3.
APPEND seats TO seats_tab.
ENDDO.
SORT seats_tab BY seatsocc DESCENDING .//ЛИБО ASCENDING
Loop At
DATA: ld_ranint type QF00–RAN_INT.
DATA: BEGIN OF seats,
fldate TYPE sflight–fldate,
seatsocc TYPE sflight–seatsocc,
seatsmax TYPE sflight–seatsmax,
seatsfree TYPE sflight–seatsocc,
END OF seats.
SELECT-OPTIONS opt FOR seats–seatsocc.
DATA seats_tab LIKE STANDARD TABLE OF seats
INITIAL SIZE 3.
*seats-fldate = sy-datum.
Do 10 TIMES.
seats–seatsocc = sy–index 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 seats–seatsocc.
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)
TYPES: BEGIN 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 avto–name.
ENDLOOP.
BREAK-POINT.
INSERT
DO 5 TIMES.
avto–car_mass = sy–index.
avto–name = sy–index + 3.
append avto.
ENDDO.
INSERT zavto from avto .
BREAK-POINT.
со структурой
DATA dat TYPE zavto.
INSERT INTO zavto VALUES dat.