第010章+使用字段符号.docx
- 文档编号:8424677
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:17
- 大小:28.77KB
第010章+使用字段符号.docx
《第010章+使用字段符号.docx》由会员分享,可在线阅读,更多相关《第010章+使用字段符号.docx(17页珍藏版)》请在冰豆网上搜索。
第010章+使用字段符号
第一十章1使用字段符号
概览
内容
字段符号的概念
定义字段符号
为内部字段定义字段符号
定义结构化的字段符号
定义局部字段符号
将数据对象分配给字段符号
ASSIGN语句的基本格式
将字段符号分配给其它字段符号
分配字段串组件
定义字段符号的数据类型
更改小数位
分配全局字段的局部副本
运行检查
在ABAP/4程序中,字段符号是现有字段的占位符。
字段符号本身不直接为字段保留空间,而只是指向一个字段(该字段在程序运行前还未可知)。
字段符号可以与程序语言C中的指针概念相比较(即,用内容操作符*表示的指针)。
然而,在ABAP/4中,从变量的意义上说,与指针不是真正等价的,此处,变量包含内存地址,并且不用内容操作符即可使用。
您只能使用字段符号指向的数据对象。
本节介绍
1字段符号的概念
有时仅知道运行时要处理哪个字段和怎样处理它。
为此,可以在程序中创建字段符号。
运行时,可以将实际字段分配给这种字段符号。
用字段符号编程的所有操作将用分配的字段来执行。
成功地完成分配后,在ABAP/4中无论参考字段符号或参考字段本身,都没有任何区别。
在ABAP/4中字段符号能指向任何数据对象,也能指向ABAP/4字典中定义的结构。
不管是否有类型说明,都可以创建字段符号。
如果没有说明,字段符号采用分配字段的所有属性。
如果有说明,在分配过程中系统将检查被分配的字段是否与字段符号类型相匹配。
无论哪一种应用,在程序中使用字段符号之前,必须首先分配一个字段给字段符号。
字段符号提供了一些特性,使得它们具有很大的灵活性:
_可以将所分配字段的偏移量和长度指定为变量。
_可以将字段符号分配给其它字段符号,甚至指定其偏移量和长度。
_对字段符号的分配可以扩展到字段边界之外。
这允许对规则存储的数据进行有效的访问。
_可以强制字段符号具有不同于分配字段的类型和小数位。
_字段符号可有一个结构用来指向结构的单个组件。
尽管字段符号的这些灵活性使您找到一些问题的完美解答,但使用起来要十分小心。
由于可以将直到运行时才可知的数据对象分配给字段符号,所以对涉及到字段符号的操作,语法和安全性检查的有效性是非常有限的。
这可能导致运行错误或不正确的数据分配。
运行错误指明明显的问题,而不正确的数据分配是很危险的,因为它们很难被检测出来。
因此,只有在绝对确信所做事情,或者没有其它ABAP/4语句能解决问题时才使用。
例如,如果正在处理字符串,您可能只想处理一个字符串的一部分,其位置和长度取决于字符串内容。
可以使用字段符号做到这一点。
然而,自从R/3系统的3.0版本后,您也可以使用具有变量偏移量和长度说明的MOVE语句(参见用指定偏移量赋值(页6–3))。
使用MOVE语句(可能与一些辅助变量结合使用)比使用字段符号更安全。
字段符号优点在于某些情况下能提高响应时间。
2定义字段符号
可以为任何内部数据对象定义字段符号
可以为内部和外部结构定义结构化的字段符号
可以在子程序和功能模块中局部地使用字段符号
2为内部字段定义字段符号
要为内部数据对象定义字段符号,请如下使用FIELD-SYMBOLS语句:
语法
FIELD-SYMBOLS
该语句定义字段符号
对字段符号,角括弧是语法部分。
它们标识程序代码中的字段符号。
不管是否有类型说明,都可以定义字段符号。
2没有类型说明的字段符号
要定义没有类型说明的字段符号,不能使用FIELD-SYMBOLS语句中的
语法
FIELD-SYMBOLS
字段符号
可以在运行时将任何数据对象分配给
分配过程中,字段符号继承数据对象的所有属性。
分配的数据对象的数据类型成为字段符号的实际数据类型。
3键入字段符号
可以使用FIELD-SYMBOLS语句中
语法
FIELD-SYMBOLS
对
当将数据对象分配到没有类型说明但已键入类型的字段符号
兼容性规则由下表给出。
如果类型不兼容,可能的话,系统在语法检查期间输出错误信息,或以运行错误响应。
另一方面,如果不管分配数据对象,而要字段符号保持它指定的类型,则不会出错。
这里,必须将带类型说明的数据对象分配给已键入类型的字段符号。
分配期间指定的类型必须与字段符号的键入类型相匹配(参见定义字段符号的数据类型(页12))。
下列兼容规则应用于字段符号的键入类型:
键入字段
分配语法检查
无类型说明,
TYPEANY
系统接受任何字段类型。
字段的所有属性分配给字段符号。
TYPETABLE
系统检查字段是否为内表。
该表的所有属性和结构分配给字段符号。
TYPEC、N、P或X
系统检查字段是否属于类型C、N、P或X。
字段符号继承字段长度及其DECIMALS说明(对于类型P)。
TYPED、F、I、或T
LIKE
TYPE
这些类型完全指定。
系统检查字段数据类型是否完全与字段符号类型一致。
(
与对子程序形式参数的检查一样,用选项
(参见键入形式参数(页9–18))。
DATADAT(8)VALUE'09161995'.
FIELD-SYMBOLS
ASSIGNDATTO
WRITE
因为DAT与字段符号
DATADAT(8)VALUE'19951609'.
FIELD-SYMBOLS
ASSIGNDATTO
WRITE
在该程序中,ASSIGN语句指定了与
因此,程序是可执行的,并产生如下结果:
09161995
关于ASSIGN语句的详细信息,参见将数据对象分配给字段符号(页Error!
Notavalidlink.)。
4定义结构化的字段符号
可以用FIELD-SYMBOLS语句定义结构化的字段符号,如下所示:
语法
FIELD-SYMBOLSDEFAULT
该语句定义了初始指向字段
必须将初始字段分配给结构化字段符号
字段符号的结构。
结构可以是任何字符串或ABAP/4字典中定义的结构。
不必用TABLES语句声明字典结构。
必须通过输入不带引号的名称指定结构。
说明在运行时不允许。
如果不包含类型I或类型F的组件,的长度相等。
如果短,则语法检查时会出错。
如果在后面的程序中将另一个字段分配给
如果在运行时动态分配较短字段,(参见动态ASSIGN(页8)),则发生运行错误。
如果包含类型I或类型F组件,请注意该结构是对齐的(参见对齐数据对象(页6–43))。
如果将数据对象分配给具有这种对齐结构的字段符号,则数据对象也必须相应地对齐。
否则发生运行错误。
在这种情况下,建议将数据对象只分配给结构化字段符号,该结构化字段符号至少在结构长度上保持与字段符号同样的结构。
定义结构化字段后,可以用符号给结构的单个组件加上参考数目。
为此,可用由连字符分隔的字段符号名称作为组件字段名称的前缀。
例如,要为不同结构创建一个工作区或为同一结构创建几个工作区,可以使用结构化字段符号。
DATA:
WA(100)VALUE'001LH123419950627'.
DATA:
BEGINOFLINE1,
COL1(6),
COL2(4),
COL3(8),
ENDOFLINE1.
DATA:
BEGINOFLINE2,
COL1TYPEIVALUE1,
COL2TYPEIVALUE2,
ENDOFLINE2.
DATALINE3LIKELINE2.
DATAITABLIKELINE2OCCURS10WITHHEADERLINE.
LINE3-COL1=11.LINE3-COL2=22.
FIELD-SYMBOLS:
WRITE:
/
/
/
输出显示如下:
001LH123427.06.1995
001LH123419950627
1122
该示例定义三个字段串LINE1、LINE2和LINE3以及内表ITAB(具有表头行)。
然后,定义三个字段符号
_
_
_
当将字段符号输出到屏幕时,所分配字段的内容按照字段符号类型格式化。
例如,注意
5定义局部字段符号
可用与局部数据类型和对象相似的方式在子程序和功能模块中定义局部字段符号(参见在子程序中ㄒ寰植渴_据类型和_象(页9–25))。
在子程序或功能模块中声明的任何字段符号都是局部的。
对于局部字段符号,可应用下列规则:
_在子程序或功能模块外部,不能引用局部字段符号。
_每次调用子程序或功能模块,即使前一次执行过ASSIGN,也没有字段分配给局部字段符号。
_局部字段符号可以与全局定义的字段符号或其它子程序、功能模块中的局部字段符号同名。
局部字段符号隐藏全局字段符号。
_结构化字段符号也能成为局部的。
它们可以具有局部(内部)结构,可以分配局部字段给它们。
6将数据对象分配给字段符号
在使用字段符号之前必须先分配数据对象给它。
对于结构化字段符号,必须在定义中包括这个分配(参见定义结构化的字段符号(页4))。
对于非结构化字段符号,可以自由决定何时何地首次分配数据对象。
在程序中,不管字段符号是否结构化,都可以将不同的数据对象分配给同样的字段符号。
要给字段符号分配数据对象,可以使用ASSIGN语句。
ASSIGN语句有几个变量和参数。
下列主题说明:
6ASSIGN语句的基本格式
ASSIGN语句的基本格式包含两个静态变量和两个动态变量。
6静态ASSIGN
如果运行之前知道想要分配给字段符号的数据对象的名称,则如下使用ASSIGN语句:
语法
ASSIGN
分配之后,字段符号
FIELD-SYMBOLS:
DATA:
TEXT(20)TYPECVALUE'Hello,howareyou?
',
NUMTYPEIVALUE5,
BEGINOFLINE1,
COL1TYPEFVALUE'1.1e+10',
COL2TYPEIVALUE'1234',
ENDOFLINE1,
LINE2LIKELINE1.
ASSIGNTEXTTO
ASSIGNNUMTO
DESCRIBEFIELD
WRITE:
/
ASSIGNLINE1TO
ASSIGNLINE2-COL2TO
MOVE
ASSIGN'LINE2-COL2='TO
WRITE:
/
输出如下:
Hello,howareyou?
haslength20
LINE-COL2=1,234
示例定义两个字段符号
因为
在示例教程中
7具有偏移量说明的静态ASSIGN
通过使用下列ASSIGN语句,可以指定要分配给字段符号的字段的偏移值:
语法:
ASSIGN
正如在用指定偏移量赋值(页6–3)中所描述的,具有偏移量
在ASSIGN语句中,偏移量的说明有下列特殊特征:
_
_系统不检查所选部分是否位于字段
偏移量
写地址时,可以超出
_如果没有指定长度
如果
_如果
FIELD-SYMBOLS
DATA:
BEGINOFLINE,
STRING1(10)VALUE'0123456789',
STRING2(10)VALUE'abcdefghij',
ENDOFLINE.
WRITE/LINE-STRING1+5.
ASSIGNLINE-STRING1+5TO
WRITE/
ASSIGNLINE-STRING1+5(*)TO
WRITE/
输出如下:
56789
56789abcde
56789
该示例中,可以看到WRITE语句和ASSIGN语句中的偏移量说明的区别。
对于WRITE,在LINE-STRING1端部截短了输出。
如果指定偏移量大于9,将导致语法检查时出错。
在第一个ASSIGN语句中,将LINE-STRING1中以偏移量5开头长度为10的内存区域分配给字段符号
因为程序中明确定义了LINE-STRING1后面的内存区,所以这将导致很有意义的输出结果。
在第二个ASSIGN语句中,避免了LINE-STRING1边界后面的内存分配。
FIELD-SYMBOLS
DATA:
BEGINOFLINE,
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
ENDDO.
DO8TIMES.
OFF=SY-INDEX-1.
ASSIGNLINE-A+OFF
(1)TO
WRITE
ENDDO.
输出如下:
123XX6XX
该示例中,可以看到字段符号是如何方便访问和规则字段串的处理的。
然而,请注意,这种处理字段限制范围之外内存内容的灵活方法也有其危险性,可能导致运行错误。
8动态ASSIGN
如果仅在运行时才知道要分配给字段符号的数据对象名称,请使用下列ASSIGN语句:
语法
ASSIGN(
这个语句将名称包含在
对(
运行时,系统按下列顺序搜索给定的字段:
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.
ENDFORM.
执行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。
TABLESSBOOK.
DATA:
NAME1(20)VALUE'SBOOK-FLDATE',
NAME2(20)VALUE'NAME1'.
FIELD-SYMBOLS
ASSIGNTABLEFIELD(NAME1)TO
WRITE:
/'SY-SUBRC:
',SY-SUBRC.
ASSIGNTABLEFIELD(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。
10将字段符号分配给其它字段符号
除了使用数据对象的名称外,还可以将字段符号分配给ASSIGN语句的所有变量中的字段符号。
为此,编码静态ASSIGN如下:
语法
ASSIGN
可按下列方式编码动态ASSIGN:
语法
ASSIGN[TABLEFIELD](
字段
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 010 使用 字段 符号
![提示](https://static.bdocx.com/images/bang_tan.gif)