将数据对象 分配给字段 符号
在使用字段 符号之前必 须先分配数 据对象给它 。对于结构 化字段符号 ,必须在定 义中包括这 个分配(参 见定义结构化字段符号)。对于 非结构化字 段符号,可 以自由决定 何时何地首 次分配数据 对象。在程 序中,不管 字段符号是 否结构化, 都可以将不 同的数据对 象分配给同 样的字段符 号。
要给字段符 号分配数据 对象,可以 使用 ASSIGN 语句。ASSIGN 语句有几个 变量和参数 。下列主题 说明:
ASSIGN 语句的基本格式
将字段符号分配给其它字段符号
分配字段串组件
定义字段符号的数据类型
更改小数位
分配全局字段的局部副本
ASSIGN 语句的基本 格式
ASSIGN 语句的基本 格式包含两 个静态变量 和两个动态 变量。
静态 ASSIGN
具有偏移量说明的静态 ASSIGN
动态 ASSIGN
表工作区的动态分配
静态 ASSIGN
如果运行之 前知道想要 分配给字段 符号的数据 对象的名称 ,则如下使 用 ASSIGN 语句:
语法
ASSIGN <f> TO <FS>.
分配之后, 字段符号 <FS> 具有数据对 象 <f> 的属性,并 指向相同的 内存区。
FIELD-SYMBOLS: <F1>, <F2> TYPE I.
DATA: TEXT(20) TYPE C VALUE 'Hello, how are you?',
NUM TYPE I VALUE 5,
BEGIN OF LINE1,
COL1 TYPE F VALUE '1.1e+10',
COL2 TYPE I VALUE '1234',
END OF LINE1,
LINE2 LIKE LINE1.
ASSIGN TEXT TO <F1>.
ASSIGN NUM TO <F2>.
DESCRIBE FIELD <F1> LENGTH <F2>.
WRITE: / <F1>, 'has length', NUM.
ASSIGN LINE1 TO <F1>.
ASSIGN LINE2-COL2 TO <F2>.
MOVE <F1> TO LINE2.
ASSIGN 'LINE2-COL2 =' TO <F1>.
WRITE: / <F1>, <F2>.
输出如下:
Hello, how are you? has length 20
LINE-COL2 = 1,234
示例定义两 个字段符号 <F1> 和 <F2>。 因为 <F2> 的类型指定 为 I,它只能 指向 I 类型字段。 在示例教程 中 <F1> 和 <F2> 指向几个不 同的数据对 象。
具有偏移量 说明的静态 ASSIGN
通过使用下 列 ASSIGN 语句,可以 指定要分配 给字段符号 的字段的偏 移值:
语法:
ASSIGN <f>[+<o>][(<l>)] TO <FS>.
正如在 指定数据对象的偏移量中所描述的少将级别 ,具有偏移 量 <o> 押运公司和长度 <l> 的 <f> 部分被分配 给字段符号 <FS>。 在 ASSIGN 语句中,偏 移量的说明 有下列特殊 特征:
_ <o> 和 <l> 可以是变量
_ 系统不检 查所选部分 是否位于字 段 <f> 内部。偏移 量 <o> 和 长度 <l> 都可以比 <f> 的长度大。 写地址时, 可以超出 <f> 的限制,但 不能超出所 定义内存区 (参见 运行检查)。
_ 如果没有 指定长度 <l>,系 统自动输入 字段 <f> 的长度。如 果 <o> 大于零,<FS> 总是指向超 出 <f> 限制的区域 。
_ 如果<o>小 于<f> 的长度,可 以为 <l> 指定一个星 号 (*) 来阻止 <FS> 参照 <f> 限
制之外的 区域。
FIELD-SYMBOLS <FS>.
DATA: BEGIN OF LINE,
STRING1(10) VALUE '0123456789',
STRING2(10) VALUE 'abcdefghij',
END OF LINE.
WRITE / LINE-STRING1+5.
ASSIGN LINE-STRING1+5 TO <FS>.
WRITE / <FS>.
ASSIGN LINE-STRING1+5(*) TO <FS>.
WRITE / <FS>.
输出如下:
56789
56789abcde
56789
该示例中, 可以看到 WRITE 语句和 ASSIGN 语句中的偏 移量说明的 区别。对于 WRITE, 在 LINE-STRING1 端部截短了 输出。如果 指定偏移量 大于 9,将导致 语法检查时 出错。在第 一个 ASSIGN 语句中,将 LINE-STRING1中 以偏移量 5开头长度 为 10 的内存区域 分配给字段 符号 <FS>。 因为程序中 明确定义了 LINE-STRING1 后面的内存 区,所以这 将导致很有 意义的输出 结果。在第 二个 ASSIGN语 句中,避免丝路传说 了新疆vs广东 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.
输出如下:
1 2 3 X X 6 X X
该示例中, 可以看到字 段符号是如 何方便访问 和规则字段 串的处理的 。然而,请 注意,这种 处理字段限 制范围之外 内存内容的 灵活方法也 有其危险性 ,可能导致 运行错误。
动态ASSIGN
如果仅在运 行时才知道 要分配给字 段符号的数 据对象名称 ,请使用下 列 ASSIGN 语句:
语法
ASSIGN (<f>) TO <FS>.
这个语句将 名称包含在 <f> 中的字段分 配给字段符 号 <FS>。 对(<f>) 不能指定偏 移量。
运行时,系 统按下列顺 序搜索给定 的字段:
1. 如果 分配是在子 程序或功能 模块中执行 的,系统将 在局部数据 的子程序或 功能模块中 搜索字段。
2. 如果 分配是在子 程序或功能 模块之外执 行的,或者 在其中未找 到字段,则 系统将在程 序的全局数 据中搜索字 段。
3. 如果 在全局数据 中未发现此 字段,系统 将在表工作 区中搜索, 该表工作区 是指当前程 序组的主程 序中 TABLES 语句声明的 表工作区。 程序组由主 程序和包含 外部子程序 的定义的所 有程序组成 ,这些外部 子程序被主 程序调用( 包括被嵌套 的程序)。
由于这种搜 索对响应时 间有负面效 应,只有绝 对必要时, 才可使用动 态 ASSIGN。 如
果在运行 之前知道只 分配表工作 区,则可以 使用在 表工作区的动态分配 中所描述的 ASSIGN 语句的变量 。
如果搜索成 功并且字段 可分配给字 段符号,则 SY-SUBRC 设为 0。否则, 返回 4。为安全 起见,动态 ASSIGN 之后总要检 查 SY-SUBRC 的值,以避 免字段符号 指向未定义 区域。
假设主程序 SAPMZTST 如下:
PROGRAM SAPMZTST.
TABLES SBOOK.
SBOOK-FLDATE = SY-DATUM.
PERFORM FORM1(MYFORMS1).
假设还调用 两个程序 MYFORMS1 和 MYFORMS2:
PROGRAM MYFORMS1.
FORM FORM1.
PERFORM FORM2(MYFORMS2).
ENDFORM.
和
PROGRAM MYFORMS2.
FORM FORM2.
炒芸豆的做法 DATA NAME(20) VALUE 'SBOOK-FLDATE'.
FIELD-SYMBOLS <FS>.
ASSIGN (NAME) TO <FS>.
IF SY-SUBRC EQ 0.
WRITE / <FS>.
ENDIF.
ENDFORM.
执行 SAPMZTST 之后,输出 显示如下:
08.02.1995
该示例中,油菜花花语 程序组由吗啡片 SAPMZTST、 MYFORMS1 蒜蓉粉丝蒸虾怎么做和 MYFORMS2 组成。在 MYFORMS2 中定义字段 符号 <FS>。 动态 ASSIGN 语句之后, 指向主程序 SAPMZTST 中声明的表 工作区的组 件 FLDATE。 用静态 ASSIGN 语句,这是 不可能的。 换句话说, 不能用 SBOOK-FLDATE 替代 (NAME), 因为语法检 查时将导致 错误。
created with Help to RTF file format converter
表工作区的 动态分配
如果运行之 前知道要将 表工作区分 配给字段符 号,但不知 道表区的名 称,请使用 动态 ASSIGN 语句的下列 变量:
语法
ASSIGN TABLE FIELD (<f>) TO <FS>.
系统仅在表 工作区中搜 索要分配给 字段符号的 数据对象, 该表工作区 是由当前程 序组的主程 序中 TABLES 语句声明的 。即,系统 仅执行在 动态 ASSIGN所描述的搜 索的第三步 。