第十章使用字段符号
概览
内容
字段符号的概念............................................................................................................1
定义字段符号 ...............................................................................................................2为内部字段定义字段符号 .......................................................................................2
定义结构化的字段符号.............................................................................................4wa字符串是什么
定义局部字段符号 ...................................................................................................5
将数据对象分配给字段符号.........................................................................................6ASSIGN 语句的基本格式........................................................................................6
将字段符号分配给其它字段符号......................................................................... 10
分配字段串组件................................................................................................... 11
定义字段符号的数据类型 ................................................................................... 12
更改小数位............................................................................................................ 14
分配全局字段的局部副本 ................................................................................... 15
运行检查.................................................................................................................... 16在ABAP/4 程序中,字段符号是现有字段的占位符。字段符号本身不直接为字段保留空间,
而只是指向一个字段(该字段在程序运行前还未可知)。字段符号可以与程序语言 C 中的
指针概念相比较(即,用内容操作符* 表示的指针)。然而,在ABAP/4 中,从变量的意
义上说,与指针不是真正等价的,此处,变量包含内存地址,并且不用内容操作符即可使
用。您只能使用字段符号指向的数据对象。
本节介绍
字段符号的概念
有时仅知道运行时要处理哪个字段和怎样处理它。
为此,可以在程序中创建字段符号。运行时,可以将实际字段分配给这种字段符号。用字
段符号编程的所有操作将用分配的字段来执行。成功地完成分配后,在ABAP/4 中无论参
考字段符号或参考字段本身,都没有任何区别。
在ABAP/4 中字段符号能指向任何数据对象,也能指向ABAP/4 字典中定义的结构。
不管是否有类型说明,都可以创建字段符号。如果没有说明,字段符号采用分配字段的所
有属性。如果有说明,在分配过程中系统将检查被分配的字段是否与字段符号类型相匹配。
无论哪一种应用,在程序中使用字段符号之前,必须首先分配一个字段给字段符号。
字段符号提供了一些特性,使得它们具有很大的灵活性:
_ 可以将所分配字段的偏移量和长度指定为变量。
_ 可以将字段符号分配给其它字段符号,甚至指定其偏移量和长度。
_ 对字段符号的分配可以扩展到字段边界之外。这允许对规则存储的数据进行有效的访问。
_ 可以强制字段符号具有不同于分配字段的类型和小数位。
_ 字段符号可有一个结构用来指向结构的单个组件。
尽管字段符号的这些灵活性使您到一些问题的完美解答,但使用起来要十分小心。由于可以将直到运行时才可知的数据对象分配给字段符号,所以对涉及到字段符号的操作,语法和安全性检查的有效性是非常有限的。这可能导致运行错误或不正确的数据分配。
运行错误指明明显的问题,而不正确的数据分配是很危险的,因为它们很难被检测出来。因此,只有在绝对确信所做事情,或者没有其它ABAP/4 语句能解决问题时才使用。
例如,如果正在处理字符串,您可能只想处理一个字符串的一部分,其位置和长度取决于字符串内容。可以使用字段符号做到这一点。然而,自从R/3 系统的3.0 版本后,您也可以使用具有变量偏移量和长度说明的MOVE 语句(参见用指定偏移量赋值(页6–3) )。使用MOVE 语句(可能与一些辅助变量结合使用)比使用字段符号更安全。字段符号优点在于某些情况下能提高响应时间。
定义字段符号
可以为任何内部数据对象定义字段符号
可以为内部和外部结构定义结构化的字段符号
可以在子程序和功能模块中局部地使用字段符号
为内部字段定义字段符号
要为内部数据对象定义字段符号,请如下使用FIELD-SYMBOLS 语句:
语法
FIELD-SYMBOLS <FS> [<type>].
该语句定义字段符号<FS>。
对字段符号,角括弧是语法部分。它们标识程序代码中的字段符号。
不管是否有类型说明,都可以定义字段符号。
没有类型说明的字段符号
要定义没有类型说明的字段符号,不能使用FIELD-SYMBOLS 语句中的<type> 选项:
语法
FIELD-SYMBOLS <FS>。
字段符号<FS> 没有任何属性。可以在运行时将任何数据对象分配给<FS> (参见将数据对象分配给字段符号(页6) )。分配过程中,字段符号继承数据对象的所有属性。分配的数据对象的数据类型成为字段符号的实际数据类型。
键入字段符号
可以使用FIELD-SYMBOLS 语句中<type> 选项键入字段符号:
语法
FIELD-SYMBOLS <FS> <type>.
对<type>,可以输入TYPE <t> 或LIKE <f> (参见DATA 语句的基本格式(页3–14) )。当将数据对象分配到没有类型说明但已键入类型的字段符号<FS> 时,系统将检查分配的数据对象的类型是否与字段符号的键入类型相兼容。兼容性规则由下表给出。如果类型不兼容,可能的话,系统在语法检查期间输出错误信息,或以运行错误响应。
另一方面,如果不管分配数据对象,而要字段符号保持它指定的类型,则不会出错。这里,必须将带类
型说明的数据对象分配给已键入类型的字段符号。分配期间指定的类型必须与字段符号的键入类型相匹配(参见定义字段符号的数据类型(页12) )。
下列兼容规则应用于字段符号的键入类型:
键入字段分配语法检查
无类型说明,TYPE ANY 系统接受任何字段类型。字段的所有属性分配给字段符号。
TYPE TABLE 系统检查字段是否为内表。该表的所有属性和结构分配给
字段符号。
TYPE C、N、P 或X 系统检查字段是否属于类型C、N、P 或X。字段符号继
承字段长度及其DECIMALS 说明(对于类型P)。
TYPE D、F、I、或T LIKE <f>,
TYPE <ud> 这些类型完全指定。系统检查字段数据类型是否完全与字段符号类型一致。
(<ud> 是用户定义的)
与对子程序形式参数的检查一样,用选项< type> 来执行检查。(参见键入形式参数(页9–18) )。
DATA DAT(8) VALUE '09161995'.
FIELD-SYMBOLS <FS> TYPE D.
ASSIGN DAT TO <FS>.
WRITE <FS>.
因为DAT 与字段符号<FS> 的键入类型不兼容,该程序在语法检查时
导致错误。
DATA DAT(8) VALUE '19951609'.
FIELD-SYMBOLS <FS> TYPE D.
ASSIGN DAT TO <FS> TYPE 'D'.
WRITE <FS>.
在该程序中,ASSIGN 语句指定了与<FS> 中键入类型相同的类型。因
此,程序是可执行的,并产生如下结果:
09161995
关于ASSIGN 语句的详细信息,参见将数据对象分配给字段符号(页Error! Not a valid link.) 。
定义结构化的字段符号
可以用FIELD-SYMBOLS 语句定义结构化的字段符号,如下所示:
语法
FIELD-SYMBOLS <FS> STRUCTURE <s> DEFAULT <f>.
该语句定义了初始指向字段<f> 的结构化字段符号<FS>。必须将初始字段分配给结构化字段符号<FS>,但是以后可以更改这种分配(参见将数据对象分配给字段符号(页6) )。字段符号<FS> 继承了<S> 的结构。结构<S> 可以是任何字符串或ABAP/4 字典中定义的结构。不必用TABLES 语句声明字典结构。必须通过输入不带引号的名称指定结构<s>。说明在运行时不允许。
如果<s> 不包含类型I 或类型 F 的组件,<f> 可以是至少与结构<s>的长度相等。如果<f> 比<s> 短,则语法检查时会出错。如果在后面的程序中将另一个字段分配给<FS>,系统还将检查被分配的字段是否足够长。如果在运行时动态分配较短字段,(参见动态ASSIGN (页8) ),则发生运行错误。
如果<s> 包含类型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.
DATA LINE3 LIKE LINE2.
DATA ITAB LIKE LINE2 OCCURS 10 WITH HEADER LINE.
LINE3-COL1 = 11. LINE3-COL2 = 22.
FIELD-SYMBOLS: <F1> STRUCTURE SBOOK DEFAULT WA,
<F2> STRUCTURE LINE1 DEFAULT WA,
<F3> STRUCTURE ITAB DEFAULT LINE3.
WRITE: / <F1>-MANDT, <F1>-CARRID, <F1>-CONNID,
<F1>-FLDATE,
/ <F2>-COL1, <F2>-COL2, <F2>-COL3.
/ <F3>-COL1, <F3>-COL2.
输出显示如下:
001 LH 1234 27.06.1995
001LH 1234 19950627
11 22
该示例定义三个字段串LINE1、LINE2 和LINE3 以及内表ITAB(具
有表头行)。然后,定义三个字段符号<F1>、<F2> 和<F3> 如下:
_ <F1> 与ABAP/4 字典结构SBOOK 有同样的结构并指向字符串WA。
_ <F2> 与LINE1 有同样的结构,并且也指向WA。
_ <F3> 与表头行ITAB 有同样的结构,且指向LINE3。<F3> 不能指向WA,因为ITAB 是对齐的。
当将字段符号输出到屏幕时,所分配字段的内容按照字段符号类型格式
化。例如,注意<F1>-FLDATE 具有数据类型D。
定义局部字段符号
可用与局部数据类型和对象相似的方式在子程序和功能模块中定义局部字段符号(参见在子程序中ㄒ寰植渴_ 据类型和_ 象(页9–25) )。
在子程序或功能模块中声明的任何字段符号都是局部的。对于局部字段符号,可应用下列规则:
_ 在子程序或功能模块外部,不能引用局部字段符号。
_ 每次调用子程序或功能模块,即使前一次执行过ASSIGN,也没有字段分配给局部字段符号。
_ 局部字段符号可以与全局定义的字段符号或其它子程序、功能模块中的局部字段符号同名。局部字段符号隐藏全局字段符号。
_ 结构化字段符号也能成为局部的。它们可以具有局部(内部)结构,可以分配局部字段给它们。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论