Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
пособие авар.doc
Скачиваний:
62
Добавлен:
02.09.2019
Размер:
2.34 Mб
Скачать

Создание доменов

Создать новый домен можно в окне ABAP Dictionary, выбрав переключатель Domain.

Рисунок 17

В окне Maintain Domain введите все необходимые поля, после чего сохраните домен и активируйте его.

Рисунок 18

Работа с данными Копирование полей с помощью команд Move и Compute

Самый простой способ работы с данными в программе - их перемещение посредством команд Move и Compute.

В следующем примере после применения команды Move поле Name содержит строку 'ERP Group', а COUNTER - число 25.

DATA: NAME(25),

COUNTER TYPE I.

MOVE: 'ERP Group' TO NAME,

25 TO COUNTER.

Общий формат оператора Move:

MOVE SOURCE TO TARGET.

Если Вы привыкли писать целевое поле с левой стороны оператора, то можно воспользоваться командой Compute.

COMPUTE TARGET = SOURCE.

Ключевое слово COMPUTE можно опускать. Следующая команда полностью аналогична предыдущей.

TARGET = SOURCE.

При необходимости заполнить несколько полей одинаковыми значениями можно объединить команды COMPUTE. Например:

DATA: PHONE_1 LIKE SOURCE,

PHONE_2 LIKE PHONE_1,

PHONE_3 LIKE PHONE_2,

PHONE_4 LIKE PHONE_3.

PHONE_4 = PHONE_3 = PHONE_2 = PHONE_1 = SOURCE.

Преобразования содержимого полей

Если у исходного и целевого полей разный тип и размер данных, ABAP/4 всегда преобразует содержимое исходного поля к формату целевого. Например, вычислите сумму двух полей типа character, а результат сохраните в тип integer.

DATA: NUMBER_1(4) VALUE '1771',

NUMBER_2(3),

RESULT TYPE I.

NUMBER_2 = '005'.

RESULT = NUMBER_1 + NUMBER_2.

WRITE / RESULT.

NUMBER_2 = ' 5'.

RESULT = NUMBER_1 + NUMBER_2.

WRITE / RESULT.

В обоих вариантах поле RESULT будет равным 1776.

В другом примере нужно вычислить дату того же дня следующей недели:

DATA: ANY_DATE TYPE D,

SAME_DAY_OF_NEXT_WEEK TYPE D.

ANY_DATE = '19991231'.

SAME_DAY_OF_NEXT_WEEK = ANY_DATE + 7.

WRITE / SAME_DAY_OF_NEXT_WEEK.

Так для даты '19991231' (31 декабря 1999) результатом будет '20000107' (7 января 2000).

Рассмотрим следующий пример работы с символьными полями:

DATA: SHORT_NAME(8),

LONG_NAME(16).

LONG_NAME = SHORT_NAME = 'Washington'.

WRITE: / SHORT_NAME, LONG_NAME.

В данном случает значение 'Washington' передается полю SHORT_NAME, т.е. сократится до 8 символов, а потом из SHORT_NAME передается в LONG_NAME. Т.е. и LONG_NAME станет равным 'Washingt'.

В данном примере правильным было бы написать так:

...

SHORT_NAME = LONG_NAME = 'Washington'.

WRITE: / SHORT_NAME, LONG_NAME.

Копирование структурированных объектов

Для копирования структурированных объектов данных можно воспользоваться приемом явного пошагового копирования компонентов. Для этого придется написать длинную и сложно поддерживаемую программу. Оператор MOVE-CORRESPONDING позволяет копировать данные из одной структуры в другую компоненты с одинаковыми именами.

Рассмотрим следующий пример.

DATA: BEGIN OF MY_CUSTOMER,

ID(8) TYPE N,

NAME(25),

CITY(25),

END OF MY_CUSTOMER,

BEGIN OF CITY_OF_CUSTOMER,

CITY LIKE MY_CUSTOMER-CITY,

TEXT(30),

ID LIKE MY_CUSTOMER-ID,

END OF CITY_OF_CUSTOMER.

MY_CUSTOMER-ID = '87654321'.

MY_CUSTOMER-NAME = 'ERP Group'.

MY_CUSTOMER-CITY = 'Moscow'.

CITY_OF_CUSTOMER-TEXT = 'Old text'.

MOVE-CORRESPONDING MY_CUSTOMER TO CITY_OF_CUSTOMER.

WRITE: / 'ID = ', CITY_OF_CUSTOMER-ID,

/ 'CITY = ', CITY_OF_CUSTOMER-CITY,

/ 'TEXT = ', CITY_OF_CUSTOMER-TEXT.

После применения команды MOVE-CORRESPONDING в новой структуре CITY_OF_CUSTOMER поля ID станет равным '87654321', поле CITY = 'Moscow', а поле TEXT останется неизменным, т.к. в исходной структуре нет поля с таким именем.

Если одноименные поля будут разных типов, их содержимое преобразуется согласно общим правилам преобразования типов в языке ABAP/4.

С помощью команды MOVE можно также копировать структурированные объекты типа записей или внутренних таблиц.

...

DATA: CURRENT_CUSTOMER LIKE MY_CUSTOMER,

BEGIN OF PREVIOUS_CUSTOMER,

IDENTIFIER LIKE MY_CUSTOMER-ID,

NAME LIKE MY_CUSTOMER-NAME,

CITY LIKE MY_CUSTOMER-CITY,

END OF PREVIOUS_CUSTOMER.

CURRENT_CUSTOMER-ID = '12345678'.

MOVE CURRENT_CUSTOMER TO PREVIOUS_CUSTOMER.

WRITE: / 'ID = ', PREVIOUS_CUSTOMER-IDENTIFIER.

Но в отличие от команды MOVE-CORRESPONDING имена полей (IDENTIFIER и ID) должны иметь одинаковый элементарный тип и длину.

С помощью команды MOVE можно аналогичным образом копировать все строки из одной таблицы в другую.