第010章+使用字段符号文档格式.docx
《第010章+使用字段符号文档格式.docx》由会员分享,可在线阅读,更多相关《第010章+使用字段符号文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
运行错误指明明显的问题,而不正确的数据分配是很危险的,因为它们很难被检测出来。
因此,只有在绝对确信所做事情,或者没有其它ABAP/4语句能解决问题时才使用。
例如,如果正在处理字符串,您可能只想处理一个字符串的一部分,其位置和长度取决于字符串内容。
可以使用字段符号做到这一点。
然而,自从R/3系统的3.0版本后,您也可以使用具有变量偏移量和长度说明的MOVE语句(参见用指定偏移量赋值(页6–3))。
使用MOVE语句(可能与一些辅助变量结合使用)比使用字段符号更安全。
字段符号优点在于某些情况下能提高响应时间。
2定义字段符号
可以为任何内部数据对象定义字段符号
可以为内部和外部结构定义结构化的字段符号
可以在子程序和功能模块中局部地使用字段符号
2为内部字段定义字段符号
要为内部数据对象定义字段符号,请如下使用FIELD-SYMBOLS语句:
语法
FIELD-SYMBOLS<
FS>
[<
type>
].
该语句定义字段符号<
。
对字段符号,角括弧是语法部分。
它们标识程序代码中的字段符号。
不管是否有类型说明,都可以定义字段符号。
2没有类型说明的字段符号
要定义没有类型说明的字段符号,不能使用FIELD-SYMBOLS语句中的<
选项:
字段符号<
没有任何属性。
可以在运行时将任何数据对象分配给<
(参见将数据对象分配给字段符号(页6))。
分配过程中,字段符号继承数据对象的所有属性。
分配的数据对象的数据类型成为字段符号的实际数据类型。
3键入字段符号
可以使用FIELD-SYMBOLS语句中<
选项键入字段符号:
<
.
对<
,可以输入TYPE<
t>
或LIKE<
f>
(参见DATA语句的基本格式(页3–14))。
当将数据对象分配到没有类型说明但已键入类型的字段符号<
时,系统将检查分配的数据对象的类型是否与字段符号的键入类型相兼容。
兼容性规则由下表给出。
如果类型不兼容,可能的话,系统在语法检查期间输出错误信息,或以运行错误响应。
另一方面,如果不管分配数据对象,而要字段符号保持它指定的类型,则不会出错。
这里,必须将带类型说明的数据对象分配给已键入类型的字段符号。
分配期间指定的类型必须与字段符号的键入类型相匹配(参见定义字段符号的数据类型(页12))。
下列兼容规则应用于字段符号的键入类型:
键入字段
分配语法检查
无类型说明,
TYPEANY
系统接受任何字段类型。
字段的所有属性分配给字段符号。
TYPETABLE
系统检查字段是否为内表。
该表的所有属性和结构分配给字段符号。
TYPEC、N、P或X
系统检查字段是否属于类型C、N、P或X。
字段符号继承字段长度及其DECIMALS说明(对于类型P)。
TYPED、F、I、或T
LIKE<
TYPE<
ud>
这些类型完全指定。
系统检查字段数据类型是否完全与字段符号类型一致。
(<
是用户定义的)
与对子程序形式参数的检查一样,用选项<
type>
来执行检查。
(参见键入形式参数(页9–18))。
DATADAT(8)VALUE'
09161995'
TYPED.
ASSIGNDATTO<
WRITE<
因为DAT与字段符号<
的键入类型不兼容,该程序在语法检查时导致错误。
19951609'
TYPE'
D'
在该程序中,ASSIGN语句指定了与<
中键入类型相同的类型。
因此,程序是可执行的,并产生如下结果:
09161995
关于ASSIGN语句的详细信息,参见将数据对象分配给字段符号(页Error!
Notavalidlink.)。
4定义结构化的字段符号
可以用FIELD-SYMBOLS语句定义结构化的字段符号,如下所示:
STRUCTURE<
s>
DEFAULT<
该语句定义了初始指向字段<
的结构化字段符号<
必须将初始字段分配给结构化字段符号<
,但是以后可以更改这种分配(参见将数据对象分配给字段符号(页6))。
字段符号<
继承了<
S>
的结构。
结构<
可以是任何字符串或ABAP/4字典中定义的结构。
不必用TABLES语句声明字典结构。
必须通过输入不带引号的名称指定结构<
说明在运行时不允许。
如果<
不包含类型I或类型F的组件,<
可以是至少与结构<
的长度相等。
比<
短,则语法检查时会出错。
如果在后面的程序中将另一个字段分配给<
,系统还将检查被分配的字段是否足够长。
如果在运行时动态分配较短字段,(参见动态ASSIGN(页8)),则发生运行错误。
包含类型I或类型F组件,请注意该结构是对齐的(参见对齐数据对象(页6–43))。
如果将数据对象分配给具有这种对齐结构的字段符号,则数据对象也必须相应地对齐。
否则发生运行错误。
在这种情况下,建议将数据对象只分配给结构化字段符号,该结构化字段符号至少在结构长度上保持与字段符号同样的结构。
定义结构化字段后,可以用符号给结构的单个组件加上参考数目。
为此,可用由连字符分隔的字段符号名称作为组件字段名称的前缀。
例如,要为不同结构创建一个工作区或为同一结构创建几个工作区,可以使用结构化字段符号。
DATA:
WA(100)VALUE'
001LH123419950627'
BEGINOFLINE1,
COL1(6),
COL2(4),
COL3(8),
ENDOFLINE1.
BEGINOFLINE2,
COL1TYPEIVALUE1,
COL2TYPEIVALUE2,
ENDOFLINE2.
DATALINE3LIKELINE2.
DATAITABLIKELINE2OCCURS10WITHHEADERLINE.
LINE3-COL1=11.LINE3-COL2=22.
FIELD-SYMBOLS:
F1>
STRUCTURESBOOKDEFAULTWA,
F2>
STRUCTURELINE1DEFAULTWA,
F3>
STRUCTUREITABDEFAULTLINE3.
WRITE:
/<
-MANDT,<
-CARRID,<
-CONNID,<
-FLDATE,
-COL1,<
-COL2,<
-COL3.
-COL2.
输出显示如下:
001LH123427.06.1995
001LH123419950627
1122
该示例定义三个字段串LINE1、LINE2和LINE3以及内表ITAB(具有表头行)。
然后,定义三个字段符号<
、<
和<
如下:
_<
与ABAP/4字典结构SBOOK有同样的结构并指向字符串WA。
与LINE1有同样的结构,并且也指向WA。
与表头行ITAB有同样的结构,且指向LINE3。
不能指向WA,因为ITAB是对齐的。
当将字段符号输出到屏幕时,所分配字段的内容按照字段符号类型格式化。
例如,注意<
-FLDATE具有数据类型D。
5定义局部字段符号
可用与局部数据类型和对象相似的方式在子程序和功能模块中定义局部字段符号(参见在子程序中ㄒ寰植渴_据类型和_象(页9–25))。
在子程序或功能模块中声明的任何字段符号都是局部的。
对于局部字段符号,可应用下列规则:
_在子程序或功能模块外部,不能引用局部字段符号。
_每次调用子程序或功能模块,即使前一次执行过ASSIGN,也没有字段分配给局部字段符号。
_局部字段符号可以与全局定义的字段符号或其它子程序、功能模块中的局部字段符号同名。
局部字段符号隐藏全局字段符号。
_结构化字段符号也能成为局部的。
它们可以具有局部(内部)结构,可以分配局部字段给它们。
6将数据对象分配给字段符号
在使用字段符号之前必须先分配数据对象给它。
对于结构化字段符号,必须在定义中包括这个分配(参见定义结构化的字段符号(页4))。
对于非结构化字段符号,可以自由决定何时何地首次分配数据对象。
在程序中,不管字段符号是否结构化,都可以将不同的数据对象分配给同样的字段符号。
要给字段符号分配数据对象,可以使用ASSIGN语句。
ASSIGN语句有几个变量和参数。
下列主题说明:
6ASSIGN语句的基本格式
ASSIGN语句的基本格式包含两个静态变量和两个动态变量。
6静态ASSIGN
如果运行之前知道想要分配给字段符号的数据对象的名称,则如下使用ASSIGN语句:
ASSIGN<
TO<
分配之后,字段符号<
具有数据对象<
的属性,并指向相同的内存区。
<
TYPEI.
TEXT(20)TYPECVALUE'
Hello,howareyou?
'
NUMTYPEIVALUE5,
COL1TYPEFVALUE'
1.1e+10'
COL2TYPEIVALUE'
1234'
ENDOFLINE1,
LINE2LIKELINE1.
ASSIGNTEXTTO<
ASSIGNNUMTO<
DESCRIBEFIELD<
LENGTH<
'
haslength'
NUM.
ASSIGNLINE1TO<
ASSIGNLINE2-COL2TO<
MOVE<
TOLINE2.
ASSIGN'
LINE2-COL2='
输出如下:
haslength20
LINE-COL2=1,234
示例定义两个字段符号<
因为<
的类型指定为I,它只能指向I类型字段。
在示例教程中<
指向几个不同的数据对象。
7具有偏移量说明的静态ASSIGN
通过使用下列ASSIGN语句,可以指定要分配给字段符号的字段的偏移值:
语法:
[+<
o>
][(<
l>
)]TO<
正如在用指定偏移量赋值(页6–3)中所描述的,具有偏移量<
和长度<
的<
部分被分配给字段符号<
在ASSIGN语句中,偏移量的说明有下列特殊特征:
可以是变量
_系统不检查所选部分是否位于字段<
内部。
偏移量<
和长度<
都可以比<
的长度大。
写地址时,可以超出<
的限制,但不能超出所定义内存区(参见运行检查(页16))。
_如果没有指定长度<
,系统自动输入字段<
的长度。
如果<
大于零,<
总是指向超出<
限制的区域。
_如果<
小于<
的长度,可以为<
指定一个星号(*)来阻止<
参照<
限制之外的区域。
BEGINOFLINE,
STRING1(10)VALUE'
0123456789'
STRING2(10)VALUE'
abcdefghij'
ENDOFLINE.
WRITE/LINE-STRING1+5.
ASSIGNLINE-STRING1+5TO<
WRITE/<
ASSIGNLINE-STRING1+5(*)TO<
56789
56789abcde
该示例中,可以看到WRITE语句和ASSIGN语句中的偏移量说明的区别。
对于WRITE,在LINE-STRING1端部截短了输出。
如果指定偏移量大于9,将导致语法检查时出错。
在第一个ASSIGN语句中,将LINE-STRING1中以偏移量5开头长度为10的内存区域分配给字段符号<
因为程序中明确定义了LINE-STRING1后面的内存区,所以这将导致很有意义的输出结果。
在第二个ASSIGN语句中,避免了LINE-STRING1边界后面的内存分配。
AVALUE'
1'
BVALUE'
2'
CVALUE'
3'
DVALUE'
4'
EVALUE'
5'
FVALUE'
6'
GVALUE'
7'
HVALUE'
8'
ENDOFLINE,
OFFTYPEI,
LENTYPEIVALUE2.
DO2TIMES.
OFF=SY-INDEX*3.
ASSIGNLINE-A+OFF(LEN)TO<
='
XX'
ENDDO.
DO8TIMES.
OFF=SY-INDEX-1.
ASSIGNLINE-A+OFF
(1)TO<
WRITE<
123XX6XX
该示例中,可以看到字段符号是如何方便访问和规则字段串的处理的。
然而,请注意,这种处理字段限制范围之外内存内容的灵活方法也有其危险性,可能导致运行错误。
8动态ASSIGN
如果仅在运行时才知道要分配给字段符号的数据对象名称,请使用下列ASSIGN语句:
ASSIGN(<
)TO<
这个语句将名称包含在<
中的字段分配给字段符号<
对(<
)不能指定偏移量。
运行时,系统按下列顺序搜索给定的字段:
1.如果分配是在子程序或功能模块中执行的,系统将在局部数据的子程序或功能模块中搜索字段。
2.如果分配是在子程序或功能模块之外执行的,或者在其中未找到字段,则系统将在程序的全局数据中搜索字段。
3.如果在全局数据中未发现此字段,系统将在表工作区中搜索,该表工作区是指当前程序组的主程序中TABLES语句声明的表工作区。
程序组由主程序和包含外部子程序的定义的所有程序组成,这些外部子程序被主程序调用(包括被嵌套的程序)。
由于这种搜索对响应时间有负面效应,只有绝对必要时,才可使用动态ASSIGN。
如果在运行之前知道只分配表工作区,则可以使用在表工作区的动态分配(页10)中所描述的ASSIGN语句的变量。
如果搜索成功并且字段可分配给字段符号,则SY-SUBRC设为0。
否则,返回4。
为安全起见,动态ASSIGN之后总要检查SY-SUBRC的值,以避免字段符号指向未定义区域。
假设主程序SAPMZTST如下:
PROGRAMSAPMZTST.
TABLESSBOOK.
SBOOK-FLDATE=SY-DATUM.
PERFORMFORM1(MYFORMS1).
假设还调用两个程序MYFORMS1和MYFORMS2:
PROGRAMMYFORMS1.
FORMFORM1.
PERFORMFORM2(MYFORMS2).
ENDFORM.
和
PROGRAMMYFORMS2.
FORMFORM2.
DATANAME(20)VALUE'
SBOOK-FLDATE'
FIELD-SYMBOLS<
ASSIGN(NAME)TO<
IFSY-SUBRCEQ0.
WRITE/<
ENDIF.
执行SAPMZTST之后,输出显示如下:
08.02.1995
该示例中,程序组由SAPMZTST、MYFORMS1和MYFORMS2组成。
在MYFORMS2中定义字段符号<
动态ASSIGN语句之后,指向主程序SAPMZTST中声明的表工作区的组件FLDATE。
用静态ASSIGN语句,这是不可能的。
换句话说,不能用SBOOK-FLDATE替代(NAME),因为语法检查时将导致错误。
10表工作区的动态分配
如果运行之前知道要将表工作区分配给字段符号,但不知道表区的名称,请使用动态ASSIGN语句的下列变量:
ASSIGNTABLEFIELD(<
系统仅在表工作区中搜索要分配给字段符号的数据对象,该表工作区是由当前程序组的主程序中TABLES语句声明的。
即,系统仅执行在动态ASSIGN(页8)所描述的搜索的第三步。
如果搜索成功,并且可以分配字段给字段符号,则SY-SUBRC设为0。
否则返回4。
NAME1(20)VALUE'
NAME2(20)VALUE'
NAME1'
ASSIGNTABLEFIELD(NAME1)TO<
/'
SY-SUBRC:
SY-SUBRC.
ASSIGNTABLEFIELD(NAME2)TO<
0
4
在第一个ASSIGN语句中,系统发现表工作区SBOOK和SY-SUBRC的组件FLDATE被设为0。
第二个ASSIGN语句中,系统没有发现字段NAME1,因为它只被DATA语句声明,而不是被TABLES语句声明。
在这种情形,SY-SUBRC返回4。
10将字段符号分配给其它字段符号
除了使用数据对象的名称外,还可以将字段符号分配给ASSIGN语句的所有变量中的字段符号。
为此,编码静态ASSIGN如下:
FS1>
FS2>
可按下列方式编码动态ASSIGN:
ASSIGN[TABLEFIELD](<
字段<
包含字段符号<
的名称。
<