SAP ABAP 动态语句详解

上传人:油** 文档编号:111872058 上传时间:2022-06-21 格式:DOC 页数:46 大小:175.50KB
返回 下载 相关 举报
SAP ABAP 动态语句详解_第1页
第1页 / 共46页
SAP ABAP 动态语句详解_第2页
第2页 / 共46页
SAP ABAP 动态语句详解_第3页
第3页 / 共46页
点击查看更多>>
资源描述
.将数据对象分配给字段符号在使用字段符号之前必须先分配数据对象给它。对于结构化字段符号,必须在定义中包括这个分配(参见定义结构化字段符号)。对于非结构化字段符号,可以自由决定何时何地首次分配数据对象。在程序中,不管字段符号是否结构化,都可以将不同的数据对象分配给同样的字段符号。要给字段符号分配数据对象,可以使用ASSIGN语句。ASSIGN语句有几个变量和参数。下列主题说明:ASSIGN语句的基本格式将字段符号分配给其它字段符号分配字段串组件定义字段符号的数据类型更改小数位分配全局字段的局部副本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.正如在指定数据对象的偏移量中所描述的,具有偏移量和长度的部分被分配给字段符号。在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),因为语法检查时将导致错误。createdwithHelptoRTFfileformatconverter表工作区的动态分配如果运行之前知道要将表工作区分配给字段符号,但不知道表区的名称,请使用动态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(参见类型转换),并且指定组件号。如果分配成功,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,未定义类型的字段符号不继承所分配数据对象的数据类型和输出长度,但继承在中指定的数据类型。对于,可以使用任何预定义的数据类型(参见基本数据类型-预定义的)。关于预定义基本数据类型输出长度的详细信息,参见WRITE语句。类型可以是文字或变量。定义类型的字段符号如果要分配的数据对象的数据类型与字段符号的键入类型不兼容,使用具有定义类型的字段符号的TYPE选项很有意义,但要避免结果错误消息。在这种情况下,所指定的类型和字段符号的键入类型必须兼容。不管分配的数据对象怎样,字段符号保持它的数据类型。详细信息和示例,参见键入字段符号。如果程序中分配之后使用字段符号,则分配的数据对象不被转化为指定类型。因此,数据对象内容应该解释为类型的字段。如果指定的数据类型未知指定数据类型的长度与分配的字段类型不匹配有对齐错误(参见对齐数据对象)则系统反应为运行错误。DATATXT(8)VALUE19950606.DATAMYTYPE(1)VALUEX.FIELD-SYMBOLS.ASSIGNTXTTO.WRITE/.ASSIGNTXTTOTYPED.WRITE/.ASSIGNTXTTOTYPEMYTYPE.WRITE/.输出如下:19950606060619953139393530363036该示例中,三次将字符串TXT分配给。第一次的类型保持不变,第二次的类型变为类型D,第三次的类型变为类型X。请注意,当成对考虑时,最后输出行的数字表示TXT中字符的十六进制代码。第二个输出行的格式取决于用户的主记录,而在第三行中则取决于由操作系统使用(在这种情形为ASCII码)的字符表示法。更改小数位可以更改字段符号的小数位,该字段符号在分配时指向类型P字段。为此,请如下使用ASSIGN语句中DECIMALS选项:语法ASSIGN.TODECIMALS.可以使用DECIMALS选项,该选项具有ASSIGN语句的所有变量。用DECIMALS选项,字段符号的小数位变为。一般地,这会导致字段符号和分配的字段有不同的数值。可以是文字或变量。如果没有位于0到14之间,或者分配的字段不属类型P,则会出现运行错误。DATA:PACK1TYPEPDECIMALS2VALUE400,PACK2TYPEPDECIMALS2,PACK3TYPEPDECIMALS2.FIELD-SYMBOLS:,.WRITE:/PACK1,PACK1.ASSIGNPACK1TODECIMALS1.WRITE:/,.PACK2=.WRITE:/PACK2,PACK2.ASSIGNPACK2TODECIMALS4.WRITE:/,.PACK3=+.WRITE:/PACK3,PACK3.=1234.56789.WRITE:/,.WRITE:/PACK2,PACK2.输出如下:PACK1400.004,000.0PACK24,000.0040.0000PACK34,040.001,234.5679PACK2123,456.79在该示例中,所有类型P字段有两个小数位。字段符号和分别有一个和四个小数位。请注意,对于字段符号及其分配字段,数值是不同的。分配全局字段的局部副本使用子程序时(参见子程序),可以在数据堆栈创建全局数据的局部副本。为此,请如下使用ASSIGN语句:语法ASSIGNLOCALCOPYOF.TO.系统在堆栈上放置指定全局数据的副本。在子程序中,不必通过写字段符号地址更改全局数据,就能访问和更改该副本。可以与ASSIGN语句中所有变量(在分配字段串组件中描述的除外)一起使用该选项。假设主程序SAPMZTST如下:PROGRAMSAPMZTST.DATA:BEGINOFCOMMONPART,TEXT(5)VALUEText1,ENDOFCOMMONPART.PERFORMROUTINE(FORMPOOL).WRITETEXT.假设包含子程序ROUTINE的主程序FORMPOOL如下:PROGRAMFORMPOOL.DATA:BEGINOFCOMMONPART,TEXT(5)VALUEText1,ENDOFCOMMONPART.FORMROUTINE.FIELD-SYMBOLS.ASSIGNLOCALCOPYOFTEXTTO.WRITE.=Text2.WRITE.ASSIGNTEXTTO.WRITE.=Text3.ENDFORM.启动SAPMZTST之后,输出如下:Text1Text2Text1Text3示例中,字段TEXT被声明为主程序SAPMZTST和程序FORMPOOL的共用数据区。通过在程序FORMPOOL的子程序ROUTINE中将TEXT分配给,将字段TEXT的副本放置到局部数据堆栈上。通过写地址,可以读取和更改该副本。全局字段TEXT不受局部字段操作的影响。运行检查运行时,系统执行某些检查,以避免由在定义数据区之外的错误分配引起的内存数据的非控制丢失。定义如下的数据区:内表的表存储区。存储区的大小取决于表行数,这种表行数未固定,而运行时,经常动态扩展(参见创建和处理内表)。其它数据对象的DATA存储区。该存储区的大小在数据声明期间是固定的(参见声明数据)。字段符号不能指向这些区域之外的地址。如果系统在运行时遇到这类问题,将停止处理程序。某些系统信息,诸如内表的控制块,也存储在DATA存储区中。因此,尽管有运行检查,还是有可能无意地覆盖一些字段,并引起后续错误(如表头损坏)。PROGRAMSAPMZTST.DATA:TEXT1(10),TEXT2(10),TEXT3(5).FIELD-SYMBOLS.DO25TIMES.ASSIGNTEXT1+SY-INDEX(1)TO.ENDDO.启动SAPMZTST之后,发生运行错误。系统反应如下:DATA存储区宽度为25。最后的循环途径试图分配该范围之外的地址,因为偏移量是25。直到第24循环途径,未发生错误。如果试图在ASSIGN语句中用TEXT2替换TEXT1,将在第15循环中发生错误。以簇方式存储数据对象可以用数据簇方式对ABAP/4程序的任何复杂内部数据对象进行分组保存,并将其临时存储在ABAP/4内存中,或长时间存储在数据库中。在下列主题中,您将学到更多有关在内存和数据库中存储数据簇的知识ABAP/4内存中的数据簇数据库中的数据簇ABAP/4内存中的数据簇可以在ABAP/4内存中存储数据簇。ABAP/4内存是分配给特定事务的存储区,任何模块都是用关键词CALL或SUBMIT从中进行调用的。关于事务流的详细信息,参见编写ABAP/4事务。ABAP/4内存与在事务期间生成该内存的ABAP/4程序或程序模块无关。这意味着在同一事务中,存储在ABAP/4内存中的对象可由任何ABAP/4程序重新读取。但本节所说的ABAP/4内存与不受事务限制的全局SAP内存不同(对于示例,参见调用报表)。ABAP/4内存允许跨越多个程序层次,在不同模块化单元之间进行数据传递。例如,可以在下列单元之间传递数据:报表和其他SUBMIT调用的报表事务和报表不同对话模块程序和功能模块等等。离开事务后,就释放该内存。使用EXPORTTOMEMORY语句在内存中存储数据对象。在ABAP/4内存中存储数据对象使用IMPORTFROMMEMORY语句从内存中读取数据对象。从内存中读取数据对象使用FREEMEMORY语句从内存中删除数据簇。删除内存中的数据簇在ABAP/4内存中存储数据对象要将数据对象从ABAP/4程序写入ABAP/4内存,请使用下列语句:语法EXPORTFROMFROM.TOMEMORYID.此语句将列表中指定的数据对象存储为ABAP/4内存中的数据簇。如果忽略选项FROM,则将数据对象存储到自己的名称之下。如果使用该选项,则将数据对象存储到下面。ID用于标识内存数据,不得超过32个字符。EXPORT语句总是完全改写ID相同的任何现有数据簇的内容。对于有表头行的内表,只可以存储表本身,而不能存储表头行。在EXPORT语句中,将表名解释为表。这是例外。通常情况下,语句将表名解释为表工作区(参见访问内表)。PROGRAMSAPMZTS1.DATATEXT1(10)VALUEExporting.DATAITABLIKESBOOKOCCURS10WITHHEADERLINE.DO5TIMES.ITAB-BOOKID=100+SY-INDEX.APPENDITAB.ENDDO.EXPORTTEXT1TEXT2FROMLiteralTOMEMORYIDtext.EXPORTITABTOMEMORYIDtable.在此示例中,文本字段TEXT1和TEXT2存储到程序SAPMZTS1的ABAP/4内存的ID“文本”之下,内表ITAB则存储到ID“表”中。createdwithHelptoRTFfileformatconverter从内存中读取数据对象要将ABAP/4内存中的数据对象读到ABAP/4程序中,请使用下列语句:语法IMPORTTOTO.FROMMEMORYID.此语句从ABAP/4内存的数据簇中读取列表中指定的数据对象。如果忽略选项TO,则将内存中的数据对象赋给程序中的同名数据对象。如果使用此选项,则将内存中的数据对象写入字段中。ID用于标识内存数据,不得超过32个字符。不必读取存储在特定ID下的所有对象。相反,可以从名称中进行选择。如果内存中不包含指定ID下的对象,则将SY-SUBRC设置为4。但是,如果内存中存在带此ID的数据簇,无论数据对象是否也存在,SY-SUBRC之值总是为0。如果簇中不存在数据对象,则目标字段保持不变。此语句不进行这种检查:即内存中的对象结构与要写入的结构是否匹配。因为数据是按位进行传送的,所以不匹配的结构可能会引起不一致。PROGRAMSAPMZTS1.DATATEXT1(10)VALUEExporting.DATAITABLIKESBOOKOCCURS10WITHHEADERLINE.DO5TIMES.ITAB-BOOKID=100+SY-INDEX.APPENDITAB.ENDDO.EXPORTTEXT1TEXT2FROMLiteralTOMEMORYIDtext.EXPORTITABTOMEMORYIDtable.SUBMITSAPMZTS2ANDRETURN.SUBMITSAPMZTS3.程序的第一部分对应于在ABAP/4内存中存储数据对象中的示例。当前示例也以SUBMIT调用程序SAPMZTS1和SAPMZTS2。通过在ABAP/4编辑器中双击程序名生成和维护SUBMIT后面指定的程序。关于SUBMIT的详细信息,参见调用报表。SAPMZTS2的示例:PROGRAMSAPMZTS2.DATA:TEXT1(10),TEXT3LIKETEXT1VALUEInitial.IMPORTTEXT3FROMMEMORYIDtext.WRITE:/SY-SUBRC,TEXT3.IMPORTTEXT2TOTEXT1FROMMEMORYIDtext.WRITE:/SY-SUBRC,TEXT1.SAPMZTS3的示例:PROGRAMSAPMZTS3.DATAJTABLIKESBOOKOCCURS10WITHHEADERLINE.IMPORTITABTOJTABFROMMEMORYIDtable.LOOPATJTAB.WRITE/JTAB-BOOKID.ENDLOOP.输出位于两个连续的屏幕上,如下所示:和SAPMZTS2试图从数据簇“文本”中读取不存在的数据对象TEXT3。因此,目标字段TEXT3保持不变。现有数据对象TEXT2被放到TEXT1之后。两种情况中,因为簇“文本”包含数据,SY-SUBRC都被设置为0。SAPMZTS3将内表ITAB从簇“表”中写入内表JTAB。两个表结构一样,同为ABAP/4词典表SBOOK结构。删除内存中的数据簇要删除ABAP/4内存中的数据对象,请使用下列语句:语法FREEMEMORYID.如果不附加ID,则此语句删除整个内存,包括此前用EXPORT存储到ABAP/4内存中的所有数据簇。附加ID之后,该语句只删除用此名称命名的数据簇。因为删除整个内存会导致任何系统例程内存内容的丢失,所以只应使用附加有ID的FREEMEMORY语句。PROGRAMSAPMZTST.DATA:TEXT(10)VALUE0123456789,IDEN(3)VALUEXYZ.EXPORTTEXTTOMEMORYIDIDEN.TEXT=xxxxxxxxxx.IMPORTTEXTFROMMEMORYIDIDEN.WRITE:/SY-SUBRC,TEXT.FREEMEMORY.TEXT=xxxxxxxxxx.IMPORTTEXTFROMMEMORYIDIDEN.WRITE:/SY-SUBRC,TEXT.此示例的输出为:001234567894xxxxxxxxxxFREEMEMORY语句删除数据簇“XYZ”。因此,在下一个IMPORT语句之后,系统字段SY-SUBRC被设置为4,而目标字段保持不变。数据库中的数据簇可以将数据簇存储到ABAP/4词典的特定数据库中。就是所谓的ABAP/4簇数据库,其预定义结构为:簇数据库该方法允许单步存储任何具有深结构的复杂数据对象,而不必将其调整为关系数据库的平面结构。这样,在整个系统中都可使用该数据对象,并且每个用户都可对其进行访问。要使访问成功,必须知道存储对象的数据类型。在簇数据库中存储数据,对于支持有关关系数据库信息的分析结果十分有用。例如,如果要从所有分支机构的人员数据中生成销售额最高的客户清单或者完整的通讯录,就可以编写ABAP/4程序,让程序来解决此类问题,并将结果存储为数据簇。如果需要刷新存储的数据簇,可以在后台定期运行这些程序。要使用该结果,可以使用只访问该数据簇的其他程序。因为不必在每次使用结果时都访问关系数据库中的分布式数据,并且也不必每次都重新生成结果,所以,此方法可以很大程度上减少系统的响应时间。存储数据簇是专就ABAP/4而言。尽管也可以使用SQL语句访问簇数据库,但是,只有ABAP/4语句能够对已存储的数据簇结构进行解码。使用EXPORTTODATABASE语句将数据对象存储到簇数据库中。在簇数据库中存储数据对象使用IMPORTFROMDATABASE语句为数据簇生成目录表,并从簇数据库中读取数据对象。创建数据簇目录表从簇数据库中读取数据对象使用DELETEFROMDATABASE语句从簇数据库中删除数据簇。从簇数据库中删除数据簇关于使用开放式SQL语句访问簇数据库的信息,参见用开放式SQL语句访问簇数据库簇数据库簇数据库是ABAP/4词典中的特殊数据库。用于存储数据簇。其行结构被划分为部分标准化的开始区(由多个字段组成)和一个用于存储数据的大的区域。下列主题介绍建立簇数据库的规则,同时还就系统定义的簇数据库INDX进行讨论。簇数据库的结构簇数据库的示例簇数据库的结构簇数据库的结构如下所示:建立簇数据库的规则如下所述。必须创建第一点到第四点中列出的关键字段。上述数据类型都是ABAP/4词典类型。1.如果该表是针对客户的,第一个字段必须这样定义:名称为MANDT,类型为CHAR,长度为3字节,用于存储客户ID。存储数据簇时,系统既可自动使用当前客户填写字段MANDT,还可使用EXPORT语句中显式指定的客户进行填写。2.下一字段(对于与客户无关的表,这是第一个字段)必须这样定义:名称为RELID,类型为CHAR,长度为2字节。该字段包含区域ID。簇数据库被分成不同的区域。存储数据簇时,系统用EXPORT语句中指定的区域ID填写字段RELID。3.下一字段类型为CHAR,长度可变。它包含簇的名称,存储数据簇时,在程序中用EXPORT语句的附加ID指定了该簇。因为后面的字段要对齐,所以系统应最多使用3个未用字节填充在字段RELID的结尾。如果创建自己的簇数据库,应该相应地定义此字段的长度。4.下一字段必须名称为SRTF2,类型为INT4,长度为4。单个数据簇可以扩展到数据库表的好几行中。在理论上,每个簇可能有2*31行。字段SRTF2包含存储的数据簇内行的顺序号码,可以是0和2*31-1之间的任何值。存储数据簇时,系统自动填写此字段(参见第7点)。5.SRTF2的后面可以是任何数目的数据字段,这些字段名称和类型可任意交换。存储数据簇时,系统并不自动填写这些字段。必须在程序中的EXPORT语句之前将值显式分配到这些字段。通常包含诸如程序名、用户ID等控制信息。6.行上的倒数第二个字段名称必须为CLUSTR,类型为INT2,并且长度必须为2。它包含后面的字段CLUSTD中的数据长度。存储数据簇时,系统自动填写此字段。7.行上的最后一个字段必须名称为CLUSTD,类型为VARC。其长度可以任意,但通常为1000个字节左右。存储数据簇时,系统按压缩格式用实际数据填写此字段。如果CLUSTD的长度不足以存储簇数据,则数据就被分布到多行上。这些行在字段SRTF2中进行编号(参见上面的第4点)。既可以按照上述规则创建自己的簇数据库(此时参见文档ABAP/4词典!JumpContents(BCDWBDIC.HLP)),也可以使用系统定义的簇数据库INDX:簇数据库的示例簇数据库的示例数据库INDX是簇数据库的示例,是系统中所包含的标准安装的一部分。从用户应用的角度考虑,由于没有必要先创建新的簇数据库,所以,比较实用。而且,所有用户都可以访问存储在这里的数据,并且还可更改或删除。要在ABAP/4编辑器中查看数据库INDX的结构,请选择“编辑-详细功能-命令条目”,然后输入SHOWINDX,或者双击INDX,例如在TABLES语句中。对于每个字段,都将看到ABAP/4词典数据类型和相应的ABAP/4编程语言的数据类型(也就是TABLES生成的表工作区中的组件数据类型)。头四个字段是表INDX的关键字段,并且与簇数据库的结构中介绍的完全相同。此处簇名的第三个字段的名称是SRTFD,长度为22字节,也就是说,对于INDX,ABAP/4程序中以EXPORT语句的附加ID指定的名称最多可以有22个字符。后七个字段是非标准字段,用于用户输入,例如:AEDAT:最后修改的日期USERA:用户名PGMID:程序名最后两个字段也是预定义的。在表INDX中,存储实际数据簇的字段CLUSTD的长度为2886个字节。有关表INDX用法的示例,参见在簇数据库中存储数据对象创建数据簇目录表从簇数据库中读取数据对象从簇数据库中删除数据簇在簇数据库中存储数据对象要在簇数据库中存储ABAP/4程序的数据对象,请使用下列语句:语法EXPORTFROMFROM.TODATABASE()CLIENTID.此语句将列表中指定的数据对象存储为簇数据库中的簇。必须用TABLES语句对加以声明。如果不附加FROM,则将数据对象存储在自己的名称之下。如果有附件项,则将数据对象存储到名称之下。是存储数据库的簇的两字符区域ID。(参见簇数据库的结构下的第2点)。标识数据库中的数据,其最大长度取决于中名称字段的长度。(参见簇数据库的结构下面的第3点)。在处理特定客户的簇数据库时可以使用选项CLIENT关闭自动客户处理,然后自己指定客户。必须在指定数据库名称之后立即指定此选项。(参见簇数据库的结构下面的第1点)。EXPORT语句也将表工作区的用户字段内容传输到数据库表。根据需要,可以预先填写这些字段。(参见簇数据库的结构下面的第5点)。在具有相同名称的相同工作区和相同客户系统中,EXPORT语句总是完全改写任何现有数据簇的内容。对于含有表头行的内表,只可以存储表本身,而不能存储表头行。在EXPORT语句中,将表名解释为表。这是例外。通常将表名解释为表工作区(参见访问内表)。PROGRAMSAPMZTS1.TABLESINDX.DATA:BEGINOFITABOCCURS100,COL1TYPEI,COL2TYPEI,ENDOFITAB.DO3000TIMES.ITAB-COL1=SY-INDEX.ITAB-COL2=SY-INDEX*2.APPENDITAB.ENDDO.INDX-AEDAT=SY-DATUM.INDX-USERA=SY-UNAME.INDX-PGMID=SY-REPID.EXPORTITABTODATABASEINDX(HK)IDTable.WRITE:SRTF2,AT20AEDAT,AT35USERA,AT50PGMID.ULINE.SELECT*FROMINDXWHERERELID=HKANDSRTFD=Table.WRITE:/INDX-SRTF2UNDERSRTF2,INDX-AEDATUNDERAEDAT,INDX-USERAUNDERUSERA,INDX-PGMIDUNDERPGMID.ENDSELECT.使用3000行填写了内表ITAB,并且,在给INDX的某些用户字段赋值之后,ITAB被输出到INDX。因为INDX是关系数据库,所以可以使用开放式SQL语句定位单独行。使用SELECT语句,辅以适当的WHERE条件就可选择用EXPORT存储的行。数据库字段的输出如下所示:其中,输出表明用户字段AEDAT、USERA和PGMID由EXPORT传送,并且包含ITAB的数据簇扩展了6行。如果在DO语句中更改数目3000,则此数据簇占用的行数也会发生变化。创建数据簇目录表要从ABAP/4簇数据库中创建数据簇目录表,请使用下列语句:语法IMPORTDIRECTORYINTOFROMDATABASE()CLIENTID.此语句在存储于数据库中的数据簇中创建一系列数据对象,并将其放到表中。必须使用TABLES语句声明。要将数据簇存储到数据库中,通常使用EXPORTTODATABASE语句(参见在簇数据库中存储数据对象)。关于数据库表结构的详细信息,参见簇数据库的结构。是即将存储数据库的簇的两字符ID。标识数据库中的数据,其最大长度取决于中名称字段的长度。在处理特定客户的簇数据库时,可以使用选项CLIENT关闭自动客户处理,然后自己指定客户。必须在指定数据库名称之后立即指定此选项。IMPORT语句也自动从数据库表中读取表工作区的用户字段内容。如果可以创建某个目录表,则把SY-SUBRC设置为0。否则,设置为4。必须按照ABAP/4词典结构CDIR建立内表。为此,请使用DATA语句的附件LIKE(参见DATA语句的基本格式)。结构CDIR包含下列组件:字段名类型说明NAMECHAR在簇中存储的对象名称OTYPECHAR对象类型:F表示基本字段R表示字段串T表示内表FTYPECHAR对象的数据类型。结构化的数据类型是类型C。TFILLINT4已填写行的数目(针对内表)。FLENGINT2字段或结构的长度。PROGRAMSAPMZTS2.TABLESINDX.DATADIRTABLIKECDIROCCURS10WITHHEADERLINE.IMPORTDIRECTORYINTODIRTABFROMDATABASEINDX(HK)IDTable.IFSY-SUBRC=0.WRITE:/AEDAT:,INDX-AEDAT,/USERA:,INDX-USERA,/PGMID:,INDX-PGMID.WRITE/Directory:.LOOPATDIRTAB.WRITE:/DIRTAB-NAME,DIRTAB-OTYPE,DIRTAB-FTYPE,DIRTAB-TFILL,DIRTAB-FLENG.ENDLOOP.ELSE.WRITENotfound.ENDIF.此程序创建数据簇的目录表,该数据簇是用在簇数据库中存储数据对象中的示例程序存储的。其输出如下所示:内容DIRTAB的表含有一行,该行表明数据簇包含名为ITAB的内表,表具有3000个长度为8个字节的已填写行。从簇数据库中读取数据对象要将数据对象从ABAP/4簇数据库读入ABAP/4程序中,请使用下列语句:语法IMPORTTOTO.FROMDATABASE()CLIENTID|MAJOR-IDMINOR-ID.此语句从数据库中的数据簇中读取列表中指定的数据对象。必须用TABLES语句声明。如果不附加TO,则将数据库的数据对象分配给程序中的同名数据对象。如果不附加此选项,则将数据库的数据对象写入字段。要将数据簇存储到数据库中,通常使用EXPORTTODATABASE语句(参见在簇数据库中存储数据对象)。关于数据库表结构的详细信息,参见簇数据库的结构。是即将存储数据库的簇的两字符区域ID。标识数据库中的数据,其最大长度取决于中名称字段的长度。可以用MAJOR-ID代替附加ID。然后,就选定名称的第一部分与相符的数据簇。如果指定具有MAJOR-ID的附加MINOR-ID,则选择名称的第二部分(也就是长度之后的位置)大于或等于的数据簇。在处理特定客户簇数据库时,可以使用选项CLIENT关闭自动客户处理,然后自己指定客户。必须在输入数据库名之后立即指定此选项。IMPORT语句也自动从数据库表中读取表工作区的用户字段内容。不必读取存储在特殊名称之下的所有对象,但可以使用名称作出选择。如果数据库不包含具有指定关键字、和的对象,则将SY-SUBRC设置为4。但是,如果数据库中存在具有这些关键字的数据簇,那么,无论是否存在数据对象,SY-SUBRC之值总是为0。如果簇中没有数据对象,则目标字段保持不变。运行时,系统检查此语句以查看数据库中对象的结构是否与要写入的结构相符。如果不符合,将出现运行时间错误。类型C字段是此规则的例外,也可显示在结构数据字段结尾。可以加长、缩短、附加或忽略。PROGRAMSAPMZTS3.TABLESINDX.DATA:BEGINOFJTABOCCURS100,COL1TYPEI,COL2TYPEI,ENDOFJTAB.IMPORTITABTOJTABFROMDATABASEINDX(HK)IDTable.WRITE:/AEDAT:,INDX-AEDAT,/USERA:,INDX-USERA,/PGMID:,INDX-PGMID.SKIP.WRITEJTAB:.LOOPATJTABFROM1TO5.WRITE:/JTAB-COL1,JTAB-COL2.ENDLOOP.此程序将内表JTAB(用在簇数据库中存储数据对象中的示例程序存储)从簇数据库INDX读入内表JTAB。INDX的某些用户字段输出和JTAB的头五行如下所示:createdwithHelptoRTFfileformatconverter从簇数据库中删除数据簇要从簇数据库中删除数据簇,请使用下列语句:语法DELETEFROMDATABASE()CLIENTID.此语句删除数据库表中区域为和名称为的整个数据簇。必须用TABLES语句对进行声明。在处理特定客户簇数据库时,可以使用选项CLIENT关闭自动客户处理,然后自己指定客户。必须在输入数据库名称之后立即指定此选项。要将数据簇存储到数据库中,通常使用EXPORTTODATABASE语句(参见在簇数据库中存储数据对象)。关于数据库表结构的详细信息,参见簇数据库的结构。此DELETE语句从簇数据库中删除被指定数据簇覆盖的所有行。如果可以删除具有指定关键字的数据簇,则把SY-SUBRC设置为0。否则,其值为4。PROGRAMSAPMZTS4.TABLESINDX.DATADIRTABLIKECDIROCCURS10.IMPORTDIRECTORYINTODIRTABFROMDATABASEINDX(HK)IDTable.WRITE:/SY-SUBRC,IMPORT:,SY-SUBRC.DELETEFROMDATABASEINDX(HK)IDTable.WRITE:/SY-SUBRC,DELETE:,SY-SUBRC.IMPORTDIRECTORYINTODIRTABFROMDATABASEINDX(HK)IDTable.WRITE:/SY-SUBRC,IMPORT:,SY-SUBRC.此程序删除用在簇数据库中存储数据对象中的示例程序存储的数据簇。如果启动程序时存在数据簇,则输出如下所示:SY-SUBRC,IMPORT:0SY-SUBRC,DELETE:0SY-SUBRC,IMPORT:4在第一个IMPORT语句中,数据簇依然存在。然后成功地执行DELETE语句。在第二个IMPORT语句中,数据簇不再存在。用开放式SQL语句访问簇数据库簇数据库是在ABAP/4词典中定义的关系数据库,ABAP/4以特殊方法使用该词典。因此,原则上说,也可以使用读取并处理数据库表中介绍的开放式SQL语句对其进行访问。对簇数据库表,为了有意义地使用开放式SQL语句,必须清楚数据库表的特殊结构(参见簇数据库的结构)。例如,用SELECT语句读取字段CLUSTR和CLUSTID,或用UPDATE语句对其进行更改,都毫无意义。这些字段包含由系统进行编码的数据簇,要对其进行正确的处理,只能使用EXPORTTODATABASE和IMPORTFROMDATABASE语句。如果数据簇语句的特定组合导致超时运行,则只应使用开放式SQL语句UPDATE、MODIFY和DELETE。一定不要在数据簇中使用开放式SQL语句INSERT。可以使用开放式SQL语句维护簇数据库。例如,SELECT语句允许从簇数据库表中查看特定数据簇。其中,也可以使用用户数据字段中的信息(参见在簇数据库中存储数据对象中的示例)。IMPORTFROMDATABASE语句不适合此目的。PROGRAMSAPMZTS5.DATACOUNTTYPEIVALUE0.TABLESINDX.SELECT*FROMINDXWHERERELID=HKANDSRTF2=0ANDUSERA=SY-UNAME.DELETEFROMDATABASEINDX(HK)IDINDX-SRTFD.IFSY-SUBRC=0.COUNT=COUNT+1.ENDIF.ENDSELECT.WRITE:/COUNT,Cluster(s)deleted.此示例程序从表INDX中删除区域“HK”(其中的字段USERA包含当前程序用户名称)中的所有数据簇。用SELECT语句填写表工作区INDX的字段SRTFD,并在DELETE语句中使用。在WHERE子句中指定SRTF2=0,可以保证只对每个数据簇进行一次处理。请不要混淆开放式SQL命令集中的DELETE语句(参见从数据库表中删除行)和数据簇的DELETE语句(参见从簇数据库中删除数据簇)。删除数据簇中的数据时,应该始终是删除所有行,而不仅仅指特定行。下例说明如何使用开放式SQL语句UPDATE更改数据库表中的数据簇名称和区域。用簇语句EXPORT、IMPORT和DELETE来解决此问题显得太繁琐。PROGRAMSAPMZTS5.TA
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!