- •Тема 9 Операторы присваивания, преобразования и вычисления
- •1. Работа с системными переменными
- •Обычно используемые системные переменные
- •2. Операторы присваивания
- •Использование оператора move
- •Правильное и неправильное использование присваивания
- •Преобразования Данных
- •Использование move c Field Strings
- •3. Выполнение вычислений
Использование оператора 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