您好,欢迎来到尚车旅游网。
搜索
您的当前位置:首页第十章使用字段符 号

第十章使用字段符 号

来源:尚车旅游网
 1第十章 使用字段符号

概览

内容

字段符号的 概念 ................................................................................................................ 1 定义字段符 号 .................................................................................................................... 2 为内部字段 定义字段符 号 ........................................................................................... 2 定义结构化 的字段符号 ................................................................................................ 4 定义局部字 段符号 ....................................................................................................... 5 将数据对象 分配给字段 符号 ............................................................................................ 6 ASSIGN 语句的基本 格式............................................................................................ 6 将字段符号 分配给其它 字段符号 ............................................................................ 10 分配字段串 组件 ....................................................................................................... 11 定义字段符 号的数据类 型 ....................................................................................... 12 更改小数位 ................................................................................................................ 14 分配全局字 段的局部副 本 ....................................................................................... 15 运行检查 ......................................................................................................................... 16

在 ABAP/4 程序中,字段符号是现有字段的占位符。字段符号本身不直接为字段保留空间,

而只是指向一个字段(该字段在程序运行前还未可知)。字段符号可以与程序语言 C 中的指针概念相比较(即,用内容操作符 * 表示的指针)。然而,在 ABAP/4 中,从变量的意义上说,与指针不是真正等价的,此处,变量包含内存地址,并且不用内容操作符即可使用。您只能使用字段符号指向的数据对象。 本节介绍

字段符号的概念

有时仅知道运行时要处理哪个字段和怎样处理它。

为此,可以在程序中创建字段符号。运行时,可以将实际字段分配给这种字段符号。 用字段符号编程的所有操作将用分配的字段来执行。成功地完成分配后,在 ABAP/4 中无论参考字段符号或参考字段本身,都没有任何区别。

在 ABAP/4 中字段符号能指向任何数据对象,也能指向 ABAP/4 字典中定义的结构。 不管是否有类型说明,都可以创建字段符号。如果没有说明,字段符号采用分配字段的所有属性。如果有说明,在分配过程中系统将检查被分配的字段是否与字段符号类型相匹配。无论哪一种应用,在程序中使用字段符号之前,必须首先分配一个字段给字段符号。 字段符号提供了一些特性,使得它们具有很大的灵活性:

_ 可以将所分配字段的偏移量和长度指定为变量。

2_ 可以将字段符号分配给其它字段符号,甚至指定其偏移量和长度。

_ 对字段符号的分配可以扩展到字段边界之外。这允许对规则存储的数据

进行有效的访问。

_ 可以强制字段符号具有不同于分配字段的类型和小数位。

_ 字段符号可有一个结构用来指向结构的单个组件。

尽管字段符号的这些灵活性使您找到一些问题的完美解答,但使用起来要十分小心。由于可以将直到运行时才可知的数据对象分配给字段符号,所以对涉及到字段符号的操作,语法和安全性检查的有效性是非常有限的。这可能导致运行错误或不正确的数据分配。 运行错误指明明显的问题,而不正确的数据分配是很危险的,因为它们很难被检测出来。因此,只有在绝对确信所做事情,或者没有其它 ABAP/4 语句能解决问题时才使用。 例如,如果正在处理字符串,您可能只想处理一个字符串的一部分,其位置和长度取决于字符串内容。可以使用字段符号做到这一点。然而,自从 R/3 系统的 3.0 版本后,您也可以使用具有变量偏移量和长度说明的 MOVE 语句(参见 用指定偏移 量赋值 (页 6–3) )。使用 MOVE 语句(可能与一些辅助变量结合使用)比使用字段符号更安全。字段符号优点在于某些情况下能提高响应时间。

定义字段符号

可以为任何内部数据对象定义字段符号

可以为内部和外部结构定义结构化的字段符号 可以在子程序和功能模块中局部地使用字段符号

为内部字段定义字段符号

要为内部数据对象定义字段符号,请如下使用 FIELD-SYMBOLS 语句:

语法

FIELD-SYMBOLS [].

该语句定义字段符号

对字段符号,角括弧是语法部分。它们标识程序代码中的字段符号。 不管是否有类型说明,都可以定义字段符号。

没有类型说明的字段符号

要定义没有类型说明的字段符号,不能使用 FIELD-SYMBOLS 语句中的 选项:

语法

FIELD-SYMBOLS

3字段符号 没有任何属性。可以在运行时将任何数据对象分配给 (参见将数据对象 分配给字段 符号 (页 6) )。分配过程中,字段符号继承数据对象的所有属性。分配的数据对象的数据类型成为字段符号的实际数据类型。

键入字段符 号

可以使用 FIELD-SYMBOLS 语句中 选项键入字段符号:

语法

FIELD-SYMBOLS .

,可以输入 TYPE 或 LIKE (参见DATA 语句的基本 格式 (页 3–14) )。 当将数据对象分配到没有类型说明但已键入类型的字段符号 时,系统将检查分配的数据对象的类型是否与字段符号的键入类型相兼容。兼容性规则由下表给出。如果类型不兼容,可能的话,系统在语法检查期间输出错误信息,或以运行错误响应。

另一方面,如果不管分配数据对象,而要字段符号保持它指定的类型,则不会出错。这里,必须将带类型说明的数据对象分配给已键入类型的字段符号。分配期间指定的类型必须与字段符号的键入类型相匹配(参见 定义字段符 号的数据类 型 (页 12) )。 下列兼容规则应用于字段符号的键入类型:

键入字段分配语法检查 无类型说明, TYPE ANY TYPE TABLE TYPE C、N、P 或 X TYPE D、F、I、或 T LIKE , TYPE 系统接受任何字段类型。字段的所有属性分配给字段符号。 系统检查字段是否为内表。该表的所有属性和结构分配给字段符号。 系统检查字段是否属于类型 C、N、P 或 X。字段符号继承字段长度及其 DECIMALS 说明(对于类型 P)。 这些类型完全指定。系统检查字段数据类型是否完全与字段符号类型一致。 ( 是用户定义的)

与对子程序形式参数的检查一样,用选项 < type > 来执行检查。(参见键入形式参 数 (页 9–18) )。

DATA DAT(8) VALUE '09161995'. FIELD-SYMBOLS TYPE D. ASSIGN DAT TO . WRITE . 因为 DAT 与字段符号 的键入类型不兼容,该程序在语法检查时导致错误。 DATA DAT(8) VALUE '19951609'. FIELD-SYMBOLS TYPE D. ASSIGN DAT TO TYPE 'D'. 4WRITE . 在该程序中,ASSIGN 语句指定了与 中键入类型相同的类型。因此,程序是可执行的,并产生如下结果: 09161995 关于 ASSIGN 语句的详细信息,参见 将数据对象 分配给字段 符号 (页 Error! Not a valid link.) 。

定义结构化的字段符号

可以用 FIELD-SYMBOLS 语句定义结构化的字段符号,如下所示:

语法

FIELD-SYMBOLS STRUCTURE DEFAULT .

该语句定义了初始指向字段 的结构化字段符号 。必须将初始字段分配给结构化字段符号 ,但是以后可以更改这种分配(参见将数据对象 分配给字段 符号 (页 6) )。字段符号 继承了 的结构。结构 可以是任何字符串或 ABAP/4 字典中定义的结构。不必用 TABLES 语句声明字典结构。必须通过输入不带引号的名称指定结构 。说明在运行时不允许。

如果 不包含类型 I 或类型 F 的组件, 可以是至少与结构 的长度相等。如果 短,则语法检查时会出错。如果在后面的程序中将另一个字段分配给 ,系统还将检查被分配的字段是否足够长。如果在运行时动态分配较短字段,(参见 动态ASSIGN (页 8) ),则发生运行错误。

如果 包含类型 I 或类型 F 组件,请注意该结构是对齐的(参见 对齐数据对象 (页 6–43) )。如果将数据对象分配给具有这种对齐结构的字段符号,则数据对象也必须相应地对齐。否则发生运行错误。在这种情况下,建议将数据对象只分配给结构化字段符号,该结构化字段符号至少在结构长度上保持与字段符号同样的结构。

定义结构化字段后,可以用符号给结构的单个组件加上参考数目。为此,可用由连字符分隔的字段符号名称作为组件字段名称的前缀。

例如,要为不同结构创建一个工作区或为同一结构创建几个工作区,可以使用结构化字段符号。

DATA: WA(100) VALUE '001LH 123419950627'. DATA: BEGIN OF LINE1, COL1(6), COL2(4), COL3(8), END OF LINE1. DATA: BEGIN OF LINE2, COL1 TYPE I VALUE 1, COL2 TYPE I VALUE 2, END OF LINE2. 5DATA LINE3 LIKE LINE2. DATA ITAB LIKE LINE2 OCCURS 10 WITH HEADER LINE. LINE3-COL1 = 11. LINE3-COL2 = 22. FIELD-SYMBOLS: STRUCTURE SBOOK DEFAULT WA, STRUCTURE LINE1 DEFAULT WA, STRUCTURE ITAB DEFAULT LINE3. WRITE: / -MANDT, -CARRID, -CONNID, -FLDATE, / -COL1, -COL2, -COL3. / -COL1, -COL2. 输出显示如下: 001 LH 1234 27.06.1995 001LH 1234 19950627 11 22 该示例定义三个字段串 LINE1、 LINE2 和 LINE3 以及内表 ITAB(具有表头行)。然后,定义三个字段符号 如下: _ 与 ABAP/4 字典结构 SBOOK 有同样的结构并指向字符串 WA。 _ 与 LINE1 有同样的结构,并且也指向 WA。 _ 与表头行 ITAB 有同样的结构,且指向 LINE3。 不能指向 WA,因为 ITAB 是对齐的。 当将字段符号输出到屏幕时,所分配字段的内容按照字段符号类型格式化。例如,注意 -FLDATE 具有数据类型 D。 定义局部字段符号

可用与局部数据类型和对象相似的方式在子程序和功能模块中定义局部字段符号(参见在子程序中 ㄒ寰植渴_ 据类型和_ 象 (页 9–25) )。

在子程序或功能模块中声明的任何字段符号都是局部的。对于局部字段符号,可应用下列规则:

_ 在子程序或功能模块外部,不能引用局部字段符号。

_ 每次调用子程序或功能模块,即使前一次执行过 ASSIGN,也没有字段

分配给局部字段符号。

_ 局部字段符号可以与全局定义的字段符号或其它子程序、功能模块中的

局部字段符号同名。局部字段符号隐藏全局字段符号。

_ 结构化字段符号也能成为局部的。它们可以具有局部(内部)结构,可

以分配局部字段给它们。

6将数据对象分配给字段符号

在使用字段符号之前必须先分配数据对象给它。对于结构化字段符号,必须在定义中包括

这个分配(参见定义结构化 的字段符号 (页 4))。对于非结构化字段符号,可以自由决定何时何地首次分配数据对象。在程序中,不管字段符号是否结构化,都可以将不同的数据对象分配给同样的字段符号。

要给字段符号分配数据对象,可以使用 ASSIGN 语句。ASSIGN 语句有几个变量和参数。下列主题说明:

ASSIGN 语句的基本格式

ASSIGN 语句的基本格式包含两个静态变量和两个动态变量。

静态 ASSIGN

如果运行之前知道想要分配给字段符号的数据对象的名称,则如下使用 ASSIGN 语句:

语法

ASSIGN TO .

分配之后,字段符号 具有数据对象 的属性,并指向相同的内存区。 FIELD-SYMBOLS: , 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 . ASSIGN NUM TO . DESCRIBE FIELD LENGTH . WRITE: / , 'has length', NUM. ASSIGN LINE1 TO . ASSIGN LINE2-COL2 TO . MOVE TO LINE2. ASSIGN 'LINE2-COL2 =' TO . WRITE: / , . 输出如下: Hello, how are you? has length 20 LINE-COL2 = 1,234 示例定义两个字段符号 。因为 的类型指定为 I,它只能指向 I 类型字段。在示例教程中 指向几个不同的数据对象。 7 具有偏移量说明的静态 ASSIGN

通过使用下列 ASSIGN 语句,可以指定要分配给字段符号的字段的偏移值:

语法:

ASSIGN [+][()] TO .

正如在用指定偏移 量赋值 (页 6–3) 中所描述的,具有偏移量 和长度 部分被分配给字段符号 。在 ASSIGN 语句中,偏移量的说明有下列特殊特征:

_ 可以是变量

_ 系统不检查所选部分是否位于字段 内部。偏移量 和 长度

都可以比 的长度大。写地址时,可以超出 的,但不能超出所定义内存区(参见 运行检查 (页 16) )。

_ 如果没有指定长度 ,系统自动输入字段 的长度。如果

于零, 总是指向超出 的区域。

_ 如果小于 的长度,可以为 指定一个星号 (*) 来阻止

参照 之外的区域。

FIELD-SYMBOLS . DATA: BEGIN OF LINE, STRING1(10) VALUE '01234567', STRING2(10) VALUE 'abcdefghij', END OF LINE. WRITE / LINE-STRING1+5. ASSIGN LINE-STRING1+5 TO . WRITE / . ASSIGN LINE-STRING1+5(*) TO . WRITE / . 输出如下: 567 567abcde 567 该示例中,可以看到 WRITE 语句和 ASSIGN 语句中的偏移量说明的区别。对于 WRITE,在 LINE-STRING1 端部截短了输出。如果指定偏移量大于 9,将导致语法检查时出错。在第一个 ASSIGN 语句中,将 LINE-STRING1中以偏移量 5开头长度为 10 的内存区域分配给字段符号 。因为程序中明确定义了 LINE-STRING1 后面的内存区,所以这将导致很有意义的输出结果。在第二个 ASSIGN语句中,避免了 LINE-STRING1 边界后面的内存分配。 8 FIELD-SYMBOLS . 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 . = 'XX'. ENDDO. DO 8 TIMES. OFF = SY-INDEX - 1. ASSIGN LINE-A+OFF(1) TO . WRITE . ENDDO. 输出如下: 1 2 3 X X 6 X X 该示例中,可以看到字段符号是如何方便访问和规则字段串的处理的。然而,请注意,这种处理字段范围之外内存内容的灵活方法也有其危险性,可能导致运行错误。 动态ASSIGN

如果仅在运行时才知道要分配给字段符号的数据对象名称,请使用下列 ASSIGN 语句:

语法

ASSIGN () TO .

这个语句将名称包含在 中的字段分配给字段符号 。对()不能指定偏移量。 运行时,系统按下列顺序搜索给定的字段:

1. 如果分配是在子程序或功能模块中执行的,系统将在局部数据的子程序

或功能模块中搜索字段。

2. 如果分配是在子程序或功能模块之外执行的,或者在其中未找到字段,

则系统将在程序的全局数据中搜索字段。

93. 如果在全局数据中未发现此字段,系统将在表工作区中搜索,该表工作

区是指当前程序组的主程序中 TABLES 语句声明的表工作区。程序组由主程序和包含外部子程序的定义的所有程序组成,这些外部子程序被主程序调用(包括被嵌套的程序)。 由于这种搜索对响应时间有负面效应,只有绝对必要时,才可使用动态 ASSIGN。如果在运行之前知道只分配表工作区,则可以使用在 表工作区的 动态分配 (页 10) 中所描述的 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 . ASSIGN (NAME) TO . IF SY-SUBRC EQ 0. WRITE / . ENDIF. ENDFORM. 执行 SAPMZTST 之后,输出显示如下: 08.02.1995 该示例中,程序组由 SAPMZTST、MYFORMS1 和 MYFORMS2 组成。在 MYFORMS2 中定义字段符号 。动态 ASSIGN 语句之后,指向主程序 SAPMZTST 中声明的表工作区的组件 FLDATE。用静态 ASSIGN 语句,这是不可能的。换句话说,不能用 SBOOK-FLDATE 替代 (NAME),因为语法检查时将导致错误。 10表工作区的动态分配

如果运行之前知道要将表工作区分配给字段符号,但不知道表区的名称,请使用动态

ASSIGN 语句的下列变量:

语法

ASSIGN TABLE FIELD () TO .

系统仅在表工作区中搜索要分配给字段符号的数据对象,该表工作区是由当前程序组的主程序中 TABLES 语句声明的。即,系统仅执行在 动态ASSIGN (页 8) 所描述的搜索的第三步。

如果搜索成功,并且可以分配字段给字段符号,则 SY-SUBRC 设为 0。否则返回 4。

TABLES SBOOK. DATA: NAME1(20) VALUE 'SBOOK-FLDATE', NAME2(20) VALUE 'NAME1'. FIELD-SYMBOLS . ASSIGN TABLE FIELD (NAME1) TO . WRITE: / 'SY-SUBRC:', SY-SUBRC. ASSIGN TABLE FIELD (NAME2) TO . WRITE: / 'SY-SUBRC:', SY-SUBRC. 输出如下: SY-SUBRC: 0 SY-SUBRC: 4 在第一个 ASSIGN 语句中,系统发现表工作区 SBOOK 和 SY-SUBRC 的组件 FLDATE 被设为 0。第二个 ASSIGN 语句中,系统没有发现字段 NAME1,因为它只被 DATA 语句声明,而不是被 TABLES 语句声明。在这种情形,SY-SUBRC 返回 4。 将字段符号分配给其它字段符号

除了使用数据对象的名称外,还可以将字段符号分配给 ASSIGN 语句的所有变量中的字段符

号。为此,编码静态 ASSIGN 如下:

语法

ASSIGN [+][()] TO .

可按下列方式编码动态 ASSIGN:

语法

ASSIGN [TABLE FIELD] () TO . 字段 包含字段符号 的名称。

可以相同。

11 DATA: BEGIN OF S, 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 S. DATA OFF TYPE I. FIELD-SYMBOLS . ASSIGN S-A TO . DO 4 TIMES. OFF = SY-INDEX - 1. ASSIGN +OFF(1) TO . WRITE . ENDDO. 输出如下: 1 2 4 7 该示例中,创建八个字段作为字符串 S 的组件 S-A 到 S-H,并用“1”到“8”填充。这些字符串在内存中有规律的存储。组件 S-A 初始分配给字段符号 。循环语句中有下列结果: 循环途径 1: 指向 S-A,OFF 为 0,并且 S-A 被分配给 循环途径 2: 指向 S-A,OFF 为 1,并且 S-B 被分配给 循环途径 3: 指向 S-B,OFF 为 2,并且 S-D 被分配到 循环途径 4: 指向 S-D,OFF 为 3,并且 S-G 被分配给 分配字段串组件

可以用 ASSIGN 语句将字段串的特殊组件分配给字段符号,过程如下:

语法

ASSIGN COMPONENT OF STRUCTURE TO .

系统将字符串 的组件 分配给字段符号 。可以指定 为文字或变量。如果 属于类型 C 或字段串(象组件一样没有内表),它指定组件的名称。

12如果 有任何其它基本数据类型,将被转化为类型 I(参见 类型转换 (页 6–36) ),

并且指定组件号。

如果分配成功,SY-SUBRC 设为 0。否则,返回 4。

DATA: BEGIN OF LINE, COL1 TYPE I VALUE '11', COL2 TYPE I VALUE '22', COL3 TYPE I VALUE '33', END OF LINE. DATA COMP(5) VALUE 'COL3'. FIELD-SYMBOLS: , , . ASSIGN LINE TO . ASSIGN COMP TO . DO 3 TIMES. ASSIGN COMPONENT SY-INDEX OF STRUCTURE TO . WRITE . ENDDO. ASSIGN COMPONENT OF STRUCTURE TO . WRITE / . 输出如下: 11 22 33 33 该示例中, 指向字段串 LINE, 指向字段 COMP。循环中,LINE 的组件由其号码指定,并且一个接一个地被分配到 。 循环之后,LINE 的组件 COL3 由其名称指定,并被分配到 。 定义字段符号的数据类型

可以使用 ASSIGN 语句的 TYPE 选项定义字段符号的数据类型,过程如下:

语法

ASSIGN ..... TO TYPE .

可以用 ASSIGN 语句的所有变量使用 TYPE 选项。

分配数据对象给带类型说明的字段符号时,必须区分下列符号:

_ 未定义类型的字段符号

对于 TYPE,未定义类型的字段符号 不继承所分配数据对象的数据类型和输出长度,但继承在 中指定的数据类型。对于 ,可以使用任何预定义的数据类型(参见基本数据类 型 - 预ㄒ宓_ (页

133–3) )。关于预定义基本数据类型输出长度的详细信息,参见 WRITE

语句 (页 4–1) 。类型 可以是文字或变量。

_ 定义类型的字段符号

如果要分配的数据对象的数据类型与字段符号的键入类型不兼容,使用具有定义类型的字段符号的 TYPE 选项很有意义,但要避免结果错误消息。在这种情况下,所指定的类型 和字段符号的键入类型必须兼容。不管分配的数据对象怎样,字段符号保持它的数据类型。详细信息和示例,参见 键入字段符 号 (页 3) 。

如果程序中分配之后使用字段符号,则分配的数据对象不被转化为指定类型 。因此,数据对象内容应该解释为类型 的字段。 如果

_ 指定的数据类型未知

_ 指定数据类型的长度与分配的字段类型不匹配

_ 有对齐错误(参见对齐数据对象 (页 6–42))

则系统反应为运行错误。

DATA TXT(8) VALUE '19950606'. DATA MYTYPE(1) VALUE 'X'. FIELD-SYMBOLS . ASSIGN TXT TO . WRITE / . ASSIGN TXT TO TYPE 'D'. WRITE / . ASSIGN TXT TO TYPE MYTYPE. WRITE / . 输出如下: 19950606 06061995 3139393530363036 该示例中,三次将字符串 TXT 分配给 。第一次 的类型保持不变,第二次 的类型变为类型 D,第三次 的类型变为类型 X。请注意,当成对考虑时,最后输出行的数字表示 TXT 中字符的十六进制代码。第二个输出行的格式取决于用户的主记录,而在第三行中则取决于由操作系统使用(在这种情形为 ASCII码)的字符表示法。 14更改小数位

可以更改字段符号的小数位,该字段符号在分配时指向类型 P 字段。为此,请如下使用

ASSIGN 语句中 DECIMALS 选项:

语法

ASSIGN ..... TO DECIMALS .

可以使用 DECIMALS 选项,该选项具有 ASSIGN 语句的所有变量。用 DECIMALS 选项,字段符号 的小数位变为 。一般地,这会导致字段符号和分配的字段有不同的数值。

可以是文字或变量。如果 没有位于 0 到 14 之间,或者分配的字段不属类型 P,则会出现运行错误。

DATA: PACK1 TYPE P DECIMALS 2 VALUE '400', PACK2 TYPE P DECIMALS 2, PACK3 TYPE P DECIMALS 2. FIELD-SYMBOLS: , . WRITE: / 'PACK1', PACK1. ASSIGN PACK1 TO DECIMALS 1. WRITE: / ' ', . PACK2 = . WRITE: / 'PACK2', PACK2. ASSIGN PACK2 TO DECIMALS 4. WRITE: / ' ', . PACK3 = + . WRITE: / 'PACK3', PACK3. = '1234.567'. WRITE: / ' ', . WRITE: / 'PACK2', PACK2. 输出如下: PACK1 400.00 4,000.0 PACK2 4,000.00 40.0000 PACK3 4,040.00 1,234.5679 PACK2 123,456.79 15在该示例中,所有类型 P 字段有两个小数位。字段符号 分别有一个和四个小数位。请注意,对于字段符号及其分配字段,数值是不同的。

分配全局字段的局部副本

使用子程序时(参见 子程序 (页 9–5) ),可以在数据堆栈创建全局数据的局部副本。为此,请如下使用 ASSIGN 语句:

语法

ASSIGN LOCAL COPY OF ........ TO .

系统在堆栈上放置指定全局数据的副本。在子程序中,不必通过写字段符号 地址更改全局数据,就能访问和更改该副本。

可以与 ASSIGN 语句中所有变量(在 分配字段串 组件 (页 11) 中描述的除外)一起使用该选项。

假设主程序 SAPMZTST 如下: PROGRAM SAPMZTST. DATA: BEGIN OF COMMON PART, TEXT(5) VALUE 'Text1', END OF COMMON PART. PERFORM ROUTINE(FORMPOOL). WRITE TEXT. 假设包含子程序 ROUTINE 的主程序 FORMPOOL 如下: PROGRAM FORMPOOL. DATA: BEGIN OF COMMON PART, TEXT(5) VALUE 'Text1', END OF COMMON PART. FORM ROUTINE. FIELD-SYMBOLS . ASSIGN LOCAL COPY OF TEXT TO . WRITE . = 'Text2'. WRITE . ASSIGN TEXT TO . WRITE . = 'Text3'. ENDFORM. 启动 SAPMZTST 之后,输出如下: 16Text1 Text2 Text1 Text3 示例中,字段 TEXT 被声明为主程序 SAPMZTST 和程序 FORMPOOL 的共用数据区。通过在程序 FORMPOOL 的子程序 ROUTINE中将 TEXT 分配给 ,将字段 TEXT 的副本放置到局部数据堆栈上。通过写 地址,可以读取和更改该副本。全局字段 TEXT 不受局部字段操作的影响。 运行检查

运行时,系统执行某些检查,以避免由在定义数据区之外的错误分配引起的内存数据的非控制丢失。

定义如下的数据区:

_ 内表的表存储区。存储区的大小取决于表行数,这种表行数未固定,而

运行时,经常动态扩展(参见创建和处理 内表 (页 8–1) )。

_ 其它数据对象的 DATA 存储区。该存储区的大小在数据声明期间是固

定的(参见 声明数据 (页 3–1) )。

字段符号不能指向这些区域之外的地址。如果系统在运行时遇到这类问题,将停止处理程序。

某些系统信息,诸如内表的控制块,也存储在 DATA 存储区中。因此,尽管有运行检查,还是有可能无意地覆盖一些字段,并引起后续错误(如表头损坏)。 PROGRAM SAPMZTST. DATA: TEXT1(10), TEXT2(10), TEXT3(5). FIELD-SYMBOLS . DO 25 TIMES. ASSIGN TEXT1+SY-INDEX(1) TO . ENDDO. 启动 SAPMZTST 之后,发生运行错误。系统反应如下: DATA 存储区宽度为 25。最后的循环途径试图分配该范围之外的地址,因为偏移量是 25。直到第 24 循环途径,未发生错误。如果试图在 ASSIGN 语句中用 TEXT2 替换 TEXT1,将在第 15 循环中发生错误。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- sceh.cn 版权所有 湘ICP备2023017654号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务