第十章使用字段符 号.docx

上传人:b****6 文档编号:7119761 上传时间:2023-01-20 格式:DOCX 页数:17 大小:28.77KB
下载 相关 举报
第十章使用字段符 号.docx_第1页
第1页 / 共17页
第十章使用字段符 号.docx_第2页
第2页 / 共17页
第十章使用字段符 号.docx_第3页
第3页 / 共17页
第十章使用字段符 号.docx_第4页
第4页 / 共17页
第十章使用字段符 号.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

第十章使用字段符 号.docx

《第十章使用字段符 号.docx》由会员分享,可在线阅读,更多相关《第十章使用字段符 号.docx(17页珍藏版)》请在冰豆网上搜索。

第十章使用字段符 号.docx

第十章使用字段符第十章使用字段符号号第一十章第一十章使用字段符使用字段符号号概览内容字段符号的概念定义字段符号为内部字段定义字段符号定义结构化的字段符号定义局部字段符号将数据对象分配给字段符号ASSIGN语句的基本格式将字段符号分配给其它字段符号分配字段串组件定义字段符号的数据类型更改小数位分配全局字段的局部副本运行检查在ABAP/4程序中,字段符号是现有字段的占位符。

字段符号本身不直接为字段保留空间,而只是指向一个字段(该字段在程序运行前还未可知)。

字段符号可以与程序语言C中的指针概念相比较(即,用内容操作符*表示的指针)。

然而,在ABAP/4中,从变量的意义上说,与指针不是真正等价的,此处,变量包含内存地址,并且不用内容操作符即可使用。

您只能使用字段符号指向的数据对象。

本节介绍字段符号的字段符号的概念概念有时仅知道运行时要处理哪个字段和怎样处理它。

为此,可以在程序中创建字段符号。

运行时,可以将实际字段分配给这种字段符号。

用字段符号编程的所有操作将用分配的字段来执行。

成功地完成分配后,在ABAP/4中无论参考字段符号或参考字段本身,都没有任何区别。

在ABAP/4中字段符号能指向任何数据对象,也能指向ABAP/4字典中定义的结构。

不管是否有类型说明,都可以创建字段符号。

如果没有说明,字段符号采用分配字段的所有属性。

如果有说明,在分配过程中系统将检查被分配的字段是否与字段符号类型相匹配。

无论哪一种应用,在程序中使用字段符号之前,必须首先分配一个字段给字段符号。

字段符号提供了一些特性,使得它们具有很大的灵活性:

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

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

_对字段符号的分配可以扩展到字段边界之外。

这允许对规则存储的数据进行有效的访问。

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

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

尽管字段符号的这些灵活性使您找到一些问题的完美解答,但使用起来要十分小心。

由于可以将直到运行时才可知的数据对象分配给字段符号,所以对涉及到字段符号的操作,语法和安全性检查的有效性是非常有限的。

这可能导致运行错误或不正确的数据分配。

运行错误指明明显的问题,而不正确的数据分配是很危险的,因为它们很难被检测出来。

因此,只有在绝对确信所做事情,或者没有其它ABAP/4语句能解决问题时才使用。

例如,如果正在处理字符串,您可能只想处理一个字符串的一部分,其位置和长度取决于字符串内容。

可以使用字段符号做到这一点。

然而,自从R/3系统的3.0版本后,您也可以使用具有变量偏移量和长度说明的MOVE语句(参见用指定偏移量赋值(页63))。

使用MOVE语句(可能与一些辅助变量结合使用)比使用字段符号更安全。

字段符号优点在于某些情况下能提高响应时间。

定义字段符定义字段符号号可以为任何内部数据对象定义字段符号可以为内部和外部结构定义结构化的字段符号可以在子程序和功能模块中局部地使用字段符号为内部字段为内部字段定义字段符定义字段符号号要为内部数据对象定义字段符号,请如下使用FIELD-SYMBOLS语句:

语法语法FIELD-SYMBOLS.该语句定义字段符号。

对字段符号,角括弧是语法部分。

它们标识程序代码中的字段符号。

不管是否有类型说明,都可以定义字段符号。

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

语法语法FIELD-SYMBOLS。

字段符号没有任何属性。

可以在运行时将任何数据对象分配给(参见将数据对象分配给字段符号(页))。

分配过程中,字段符号继承数据对象的所有属性。

分配的数据对象的数据类型成为字段符号的实际数据类型。

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

语法语法FIELD-SYMBOLS.对,可以输入TYPE或LIKE(参见DATA语句的基本格式(页314)。

当将数据对象分配到没有类型说明但已键入类型的字段符号时,系统将检查分配的数据对象的类型是否与字段符号的键入类型相兼容。

兼容性规则由下表给出。

如果类型不兼容,可能的话,系统在语法检查期间输出错误信息,或以运行错误响应。

另一方面,如果不管分配数据对象,而要字段符号保持它指定的类型,则不会出错。

这里,必须将带类型说明的数据对象分配给已键入类型的字段符号。

分配期间指定的类型必须与字段符号的键入类型相匹配(参见定义字段符号的数据类型(页))。

下列兼容规则应用于字段符号的键入类型:

键入字段分配语法检查无类型说明,TYPEANY系统接受任何字段类型。

字段的所有属性分配给字段符号。

TYPETABLE系统检查字段是否为内表。

该表的所有属性和结构分配给字段符号。

TYPEC、N、P或X系统检查字段是否属于类型C、N、P或X。

字段符号继承字段长度及其DECIMALS说明(对于类型P)。

TYPED、F、I、或TLIKE,TYPE这些类型完全指定。

系统检查字段数据类型是否完全与字段符号类型一致。

(是用户定义的)与对子程序形式参数的检查一样,用选项来执行检查。

(参见键入形式参数(页918)。

DATADAT(8)VALUE09161995.FIELD-SYMBOLSTYPED.ASSIGNDATTO.WRITE.因为DAT与字段符号的键入类型不兼容,该程序在语法检查时导致错误。

DATADAT(8)VALUE19951609.FIELD-SYMBOLSTYPED.ASSIGNDATTOTYPED.WRITE.在该程序中,ASSIGN语句指定了与中键入类型相同的类型。

因此,程序是可执行的,并产生如下结果:

09161995关于ASSIGN语句的详细信息,参见将数据对象分配给字段符号(页Error!

Notavalidlink.)。

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

语法语法FIELD-SYMBOLSSTRUCTUREDEFAULT.该语句定义了初始指向字段的结构化字段符号。

必须将初始字段分配给结构化字段符号,但是以后可以更改这种分配(参见将数据对象分配给字段符号(页)。

字段符号继承了的结构。

结构可以是任何字符串或ABAP/4字典中定义的结构。

不必用TABLES语句声明字典结构。

必须通过输入不带引号的名称指定结构。

说明在运行时不允许。

如果不包含类型I或类型F的组件,可以是至少与结构的长度相等。

如果比短,则语法检查时会出错。

如果在后面的程序中将另一个字段分配给,系统还将检查被分配的字段是否足够长。

如果在运行时动态分配较短字段,(参见动态ASSIGN(页)),则发生运行错误。

如果包含类型I或类型F组件,请注意该结构是对齐的(参见对齐数据对象(页643))。

如果将数据对象分配给具有这种对齐结构的字段符号,则数据对象也必须相应地对齐。

否则发生运行错误。

在这种情况下,建议将数据对象只分配给结构化字段符号,该结构化字段符号至少在结构长度上保持与字段符号同样的结构。

定义结构化字段后,可以用符号给结构的单个组件加上参考数目。

为此,可用由连字符分隔的字段符号名称作为组件字段名称的前缀。

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

DATA:

WA(100)VALUE001LH123419950627.DATA:

BEGINOFLINE1,COL1(6),COL2(4),COL3(8),ENDOFLINE1.DATA:

BEGINOFLINE2,COL1TYPEIVALUE1,COL2TYPEIVALUE2,ENDOFLINE2.DATALINE3LIKELINE2.DATAITABLIKELINE2OCCURS10WITHHEADERLINE.LINE3-COL1=11.LINE3-COL2=22.FIELD-SYMBOLS:

STRUCTURESBOOKDEFAULTWA,STRUCTURELINE1DEFAULTWA,STRUCTUREITABDEFAULTLINE3.WRITE:

/-MANDT,-CARRID,-CONNID,-FLDATE,/-COL1,-COL2,-COL3./-COL1,-COL2.输出显示如下:

001LH123427.06.1995001LH1234199506271122该示例定义三个字段串LINE1、LINE2和LINE3以及内表ITAB(具有表头行)。

然后,定义三个字段符号、和如下:

_与ABAP/4字典结构SBOOK有同样的结构并指向字符串WA。

_与LINE1有同样的结构,并且也指向WA。

_与表头行ITAB有同样的结构,且指向LINE3。

不能指向WA,因为ITAB是对齐的。

当将字段符号输出到屏幕时,所分配字段的内容按照字段符号类型格式化。

例如,注意-FLDATE具有数据类型D。

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

在子程序或功能模块中声明的任何字段符号都是局部的。

对于局部字段符号,可应用下列规则:

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

_每次调用子程序或功能模块,即使前一次执行过ASSIGN,也没有字段分配给局部字段符号。

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

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

_结构化字段符号也能成为局部的。

它们可以具有局部(内部)结构,可以分配局部字段给它们。

将数据对象将数据对象分配给字段分配给字段符号符号在使用字段符号之前必须先分配数据对象给它。

对于结构化字段符号,必须在定义中包括这个分配(参见定义结构化的字段符号(页)。

对于非结构化字段符号,可以自由决定何时何地首次分配数据对象。

在程序中,不管字段符号是否结构化,都可以将不同的数据对象分配给同样的字段符号。

要给字段符号分配数据对象,可以使用ASSIGN语句。

ASSIGN语句有几个变量和参数。

下列主题说明:

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

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

语法语法ASSIGNTO.分配之后,字段符号具有数据对象的属性,并指向相同的内存区。

FIELD-SYMBOLS:

TYPEI.DATA:

TEXT(20)TYPECVALUEHello,howareyou?

NUMTYPEIVALUE5,BEGINOFLINE1,COL1TYPEFVALUE1.1e+10,COL2TYPEIVALUE1234,ENDOFLINE1,LINE2LIKELINE1.ASSIGNTEXTTO.ASSIGNNUMTO.DESCRIBEFIELDLENGTH.WRITE:

/,haslength,NUM.ASSIGNLINE1TO.ASSIGNLINE2-COL2TO.MOVETOLINE2.ASSIGNLINE2-COL2=TO.WRITE:

/,.输出如下:

Hello,howareyou?

haslength20LINE-COL2=1,234示例定义两个字段符号和。

因为的类型指定为I,它只能指向I类型字段。

在示例教程中和指向几个不同的数据对象。

具有偏移量具有偏移量说明的静态说明的静态ASSIGN通过使用下列ASSIGN语句,可以指定要分配给字段符号的字段的偏移值:

语法:

语法:

ASSIGN+()TO.正如在用指定偏移量赋值(页63)中所描述的,具有偏移量和长度的部分被分配给字段符号。

在ASSIGN语句中,偏移量的说明有下列特殊特征:

_和可以是变量_系统不检查所选部分是否位于字段内部。

偏移量和长度都可以比的长度大。

写地址时,可以超出的限制,但不能超出所定义内存区(参见运行检查(页))。

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

如果大于零,总是指向超出限制的区域。

_如果小于的长度,可以为指定一个星号(*)来阻止参照限制之外的区域。

FIELD-SYMBOLS.DATA:

BEGINOFLINE,STRING1(10)VALUE0123456789,STRING2(10)VALUEabcdefghij,ENDOFLINE.WRITE/LINE-STRING1+5.ASSIGNLINE-STRING1+5TO.WRITE/.ASSIGNLINE-STRING1+5(*)TO.WRITE/.输出如下:

5678956789abcde56789该示例中,可以看到WRITE语句和ASSIGN语句中的偏移量说明的区别。

对于WRITE,在LINE-STRING1端部截短了输出。

如果指定偏移量大于9,将导致语法检查时出错。

在第一个ASSIGN语句中,将LINE-STRING1中以偏移量5开头长度为10的内存区域分配给字段符号。

因为程序中明确定义了LINE-STRING1后面的内存区,所以这将导致很有意义的输出结果。

在第二个ASSIGN语句中,避免了LINE-STRING1边界后面的内存分配。

FIELD-SYMBOLS.DATA:

BEGINOFLINE,AVALUE1,BVALUE2,CVALUE3,DVALUE4,EVALUE5,FVALUE6,GVALUE7,HVALUE8,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.ENDDO.输出如下:

123XX6XX该示例中,可以看到字段符号是如何方便访问和规则字段串的处理的。

然而,请注意,这种处理字段限制范围之外内存内容的灵活方法也有其危险性,可能导致运行错误。

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

语法语法ASSIGN()TO.这个语句将名称包含在中的字段分配给字段符号。

对()不能指定偏移量。

运行时,系统按下列顺序搜索给定的字段:

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

2.如果分配是在子程序或功能模块之外执行的,或者在其中未找到字段,则系统将在程序的全局数据中搜索字段。

3.如果在全局数据中未发现此字段,系统将在表工作区中搜索,该表工作区是指当前程序组的主程序中TABLES语句声明的表工作区。

程序组由主程序和包含外部子程序的定义的所有程序组成,这些外部子程序被主程序调用(包括被嵌套的程序)。

由于这种搜索对响应时间有负面效应,只有绝对必要时,才可使用动态ASSIGN。

如果在运行之前知道只分配表工作区,则可以使用在表工作区的动态分配(页)中所描述的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)VALUESBOOK-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),因为语法检查时将导致错误。

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

语法语法ASSIGNTABLEFIELD()TO.系统仅在表工作区中搜索要分配给字段符号的数据对象,该表工作区是由当前程序组的主程序中TABLES语句声明的。

即,系统仅执行在动态ASSIGN(页)所描述的搜索的第三步。

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

否则返回4。

TABLESSBOOK.DATA:

NAME1(20)VALUESBOOK-FLDATE,NAME2(20)VALUENAME1.FIELD-SYMBOLS.ASSIGNTABLEFIELD(NAME1)TO.WRITE:

/SY-SUBRC:

SY-SUBRC.ASSIGNTABLEFIELD(NAME2)TO.WRITE:

/SY-SUBRC:

SY-SUBRC.输出如下:

SY-SUBRC:

0SY-SUBRC:

4在第一个ASSIGN语句中,系统发现表工作区SBOOK和SY-SUBRC的组件FLDATE被设为0。

第二个ASSIGN语句中,系统没有发现字段NAME1,因为它只被DATA语句声明,而不是被TABLES语句声明。

在这种情形,SY-SUBRC返回4。

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

为此,编码静态ASSIGN如下:

语法语法ASSIGN+()TO.可按下列方式编码动态ASSIGN:

语法语法ASSIGNTABLEFIELD()TO.字段包含字段符号的名称。

和可以相同。

DATA:

BEGINOFS,AVALUE1,BVALUE2,CVALUE3,DVALUE4,EVALUE5,FVALUE6,GVALUE7,HVALUE8,ENDOFS.DATAOFFTYPEI.FIELD-SYMBOLS.ASSIGNS-ATO.DO4TIMES.OFF=SY-INDEX-1.ASSIGN+OFF

(1)TO.WRITE.ENDDO.输出如下:

1247该示例中,创建八个字段作为字符串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语句将字段串的特殊组件分配给字段符号,过程如下:

语法语法ASSIGNCOMPONENTOFSTRUCTURETO.系统将字符串的组件分配给字段符号。

可以指定为文字或变量。

如果属于类型C或字段串(象组件一样没有内表),它指定组件的名称。

如果有任何其它基本数据类型,将被转化为类型I(参见类型转换(页636)),并且指定组件号。

如果分配成功,SY-SUBRC设为0。

否则,返回4。

DATA:

BEGINOFLINE,COL1TYPEIVALUE11,COL2TYPEIVALUE22,COL3TYPEIVALUE33,ENDOFLINE.DATACOMP(5)VALUECOL3.FIELD-SYMBOLS:

.ASSIGNLINETO.ASSIGNCOMPTO.DO3TIMES.ASSIGNCOMPONENTSY-INDEXOFSTRUCTURETO.WRITE.ENDDO.ASSIGNCOMPONENTOFSTRUCTURETO.WRITE/.输出如下:

11223333该示例中,指向字段串LINE,指向字段COMP。

循环中,LINE的组件由其号码指定,并且一个接一个地被分配到。

循环之后,LINE的组件COL3由其名称指定,并被分配到。

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

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

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

_未定义类型的字段符号对于TYPE,未定义类型的字段符号不继承所分配数据对象的数据类型和输出长度,但继承在中指定的数据类型。

对于,可以使用任何预定义的数据类型(参见基本数据类型-预宓_(页33))。

关于预定义基本数据类型输出长度的详细信息,参见WRITE语句(页41)。

类型可以是文字或变量。

_定义类型

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 哲学历史

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1