ASSIGN <f>[+<o>][<l>] TO <FS>.
在ASSIGN语句中,偏移量的说明有下列特殊特征:
1.<o> 和 <l> 可以是变量
2.系统不检查所选部分是否位于字段 <f> 内部。偏移量 <o> 和长度 <l> 的 <f> 部分被分配给字段符号
<FS>。写地址时,可以超出 <f> 的限制,但不能超出所定义的内存区。
3.如果没有指定长度<l>,系统自动输入字段<f>的长度。如果<o>大于零,<FS>总是指向超出<f>限制的区域。
4.如果<o>小于<f>的长度,可以为<l>指定一个星号(*)来阻止<FS>参照<f>限制之外的区域。
例子:
FIELD-SYMBOLS <fs>.
DATA: BEGIN OF line,
string1(10) VALUE '0123456789',
string2(10) VALUE 'qwertfghij',
END OF line.
WRITE / line-string1+5.
ASSIGN line-string1+5 TO <fs>.
WRITE / <fs>.
ASSIGN line-string1+5(*) TO <fs>.
WRITE / <fs>.
该示例中,可以看到WRITE语句和ASSIGN语句中的偏移量说明的区别。对于WRITE,在LINE-STRING端部截短了输出。
如果指定偏移量大于9,将导致语法检查时出错。在第一个ASSIGN语句中,将LINE-STRING中以偏移量5开头长度为10的内存
区域分配给字段符号<FS>。因为程序中明确定义了LINE-STRING1后面的内存区,所以这将导致“56789abcde”的输出结果。
在第二个ASSIGN语句中,避免了LINE-STRING1 边界后面的内存分配。
再来看一个例子:
FIELD-SYMBOLS <fs>.
DATA: BEGIN OF line,
a VALUE '1', b VALUE '2', c VALUE '3', d VALUE '4',
e VALUE '5', f VALUE '6', g VALUE '7', h VALUE '8',
END OF line,
off TYPE i,
len TYPE i VALUE 2.
DO 2 TIMES.
off = sy-index * 3.
ASSIGN line-a+off(len) TO <fs>.
<fs> = 'xx'.
ENDDO.
DO 8 TIMES.
off = sy-index - 1.
ASSIGN line-a+off(1) TO <fs>.
WRITE <fs>.
ENDDO.
输出结果如下: