Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 9 День 9 Присваивание преобразование выч...doc
Скачиваний:
6
Добавлен:
21.11.2019
Размер:
299.01 Кб
Скачать

Использование оператора move

Чтобы присвоить значение одного поля другому используется оператор move. Вместо move можно использовать оператор присваивания =. Они оба называются операторами присваивания.

Синтаксис оператора move. Операторы и операнды должны быть отделены пробелами. Множественное присваивание происходит справа налево.

move v1 to v2.

или

v2 = v1.

или

v2 = v1 = vm = vn . . ..

или

move v1[+N(L)] to v2[+N(L)].

или

v2[+N(L)] = v1[+N(L)].

где:

  • v1 – переменная посылки или Field String.

  • v2 – переменная получения или Field String.

  • N – смещение от начала переменной или Field String.

  • L – число байтов перемещения.

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

Правильно

Неправильно

f1 = f2.

f1=f2.

f1 = f2 = f3.

f1=f2=f3.

Преобразования Данных

Если у двух переменных различные типы данных или длины, данные при присваивании будут преобразованы по определенным правилам. Это называется автоматическим преобразованием. Для просмотра правил преобразования, можно использовать документацию ключевого слова ABAP/4 для оператора move.

Подполя (Subfield)

Часть поля, на которое ссылается спецификация смещения и/или длины, называют подполем (Subfield).

Синтаксис subfield

v1[+o][(L)] = v2[+o][(L)].

где:

  • v1 и v2 – переменные или имена Field String .

  • o – отсчитываемое от нуля смещение с начала поля.

  • L – длина в байтах.

Особенности оператора:

  • смещение или длина являются дополнительными параметрами и оба могут присутствовать;

  • если смещение не определено, начало подполя в начале поля;

  • если длина не определена – до конца поля;

  • пробелы не могут использоваться в пределах спецификации подполя;

  • смещению всегда предшествуют плюс (+) признак.

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

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

report ztx0907.

data: f1(7),

f2(7).

f1 = 'BOY'. "same as: move 'BOY' to f1.

f2 = 'BIG'. "same as: move 'BIG' to f2.

f1+0(1) = 'T'. "f1 now contains 'TOY '.

write / f1.

f1(1) = 'J'. "same as: f1+0(1) = 'J'.

write / f1. "f1 now contains 'JOY '.

f1(1) = f2. "same as: f1(1) = f2(1).

write / f1. "f1 now contains 'BOY '.

f1+4 = f1. "same as: f1+4(3) = f1(3).

write / f1. "f1 now contains 'BOY BOY'.

f1(3) = f2(3). "same as: f1+0(3) = f2+0(3).

write / f1. "f1 now contains 'BIG BOY'.

TOY

JOY

BOY

BOY BOY

BIG BOY

Использование move c Field Strings

В операторе move имя Field String без указания полей обрабатывается как переменная типа c. Пример:

report ztx0908.

data: f1(4) value 'ABCD',

begin of s1,

c1(1),

c2(2),

c3(1),

end of s1.

s1 = f1. "s1 is treated as a char 4 variable

write: / s1, "writes ABCD

/ s1-c1, s1-c2, s1-c3. "writes A BC D

ABCD

A BC D

Можно использовать оператора move с двумя Field String, если оба Field String содержат компоненты только символьных типов данных (c, n, d, t, и x).

При использовании оператора move с двумя Field Strings, необходимо помнить, что типы данных Field Strings должны быть совместимы

report ztx0910.

data: begin of s1,

d1 type d value '19980217', "8 bytes

n1(4) type n value '1234', "4 bytes

c1 value 'A', "1 byte

c2 value 'B', "1 byte

end of s1,

begin of s2,

y1(4) type n, "4 bytes

m1(2) type c, "2 bytes

d1(2) type n, "2 bytes

n1(2) type c, "2 bytes

c1(4) type c, "4 bytes

end of s2.

s2 = s1.

write: / s1,

/ s2,

/ s1-d1, s1-n1, s1-c1, s1-c2,

/ s2-y1, s2-m1, s2-d1, s2-n1, s2-c1.

199802171234AB

199802171234AB

19980217 1234 A B

1998 02 17 12 34AB

Использование оператора move-corresponding

Оператор move-corresponding может использоваться, чтобы переместить Field Strings, у которых есть смесь символьных и числовых типов данных. Чтобы выполнить перемещение от одного Field String другому, где типы данных и/или длины не соответствуют, используйте оператора move-corresponding. Он генерирует отдельные операторы move для компонент в соответствии с их названием. Компоненты в строке поля получения, у которых нет соответствующего названия в строке поля посылки, не изменяются.

Синтаксис оператора move-corresponding. Операторы и операнды должны быть отделены пробелами. Множественное присваивание происходит справа налево.

move-corresponding v1 to v2.

где:

  • v1 – переменная посылки или field string.

  • v2 – переменная получения или field string.

Замечание: Если два Field Strings точно соответствуют друг другу, не используйте move-corresponding. Использование move более эффективно.

Оператор move-corresponding генерирует индивидуальные операторы move и выполняет преобразование данных

report ztx0912.

data: begin of s1,

c1 type p decimals 2 value '1234.56',

c2(3) value 'ABC',

c3(4) value '1234',

end of s1,

begin of s2,

c1(8),

x2(3) value 'XYZ',

c3 type i,

end of s2.

write: / 's1 :', s1-c1, s1-c2, s1-c3.

write: / 's2 before move-corresponding:', s2-c1, s2-x2, s2-c3.

move-corresponding s1 to s2. "same as coding the following two statements

* move s1-c1 to s2-c1. "performs conversion

* move s1-c3 to s2-c3. "performs conversion

write: / 's2 after move-corresponding:', s2-c1, s2-x2, s2-c3.

s1 : 1,234.56 ABC 1234

s2 before move-corresponding: XYZ 0

s2 after move-corresponding: 1234.56 XYZ 1,234