第三次课-数据字典,内表和数据库的定义和操作_第1页
第三次课-数据字典,内表和数据库的定义和操作_第2页
第三次课-数据字典,内表和数据库的定义和操作_第3页
第三次课-数据字典,内表和数据库的定义和操作_第4页
第三次课-数据字典,内表和数据库的定义和操作_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

福富软件(ABAP)培训福建富士通通信软件有限公司2009年2月数据结构,内表和数据库的定义和操作目录ABAP数据字典内表的定义和操作数据库的定义和操作数据字典描述ABAP/4数据字典是和ABAP/4工作台密切结合在一起的一个活动组件数据字典的修改将立刻影响到相关的程序和屏幕R/3系统是一个解释执行的系统,程序或是屏幕并不直接读取源代码,而是执行内部经过“生成”的描述对于ABAP/4字典的修改将触发内部描述的重新生成数据字典对象数据字典中包括:数据库表(Databasetable)视图(View)数据类型(Datatype)数据元素(DataElement)结构(Structure)表类型(Tabletype)域(Domain)搜索帮助(Searchhelp)锁对象(Lockobject)……DataModeling数据字典对象关系不同的dataelements可能指定给同一domain不同的fields可能指定给同一dataelementDomain定义独立存在于ABAPDictionary设定资料类型及长度,以描述一field的valuerange控制fields外观:outputlength、 uppercase/lowercaselettersDomain创建T-CODE:SE11选择Domain,输入欲定义的Domain名称(例如z**_domain。)点create按钮,即可进入编辑画面(见下页)Shorttext:简短叙述(如z**_domaindomain)Datatype:选择数据类型(如char)No.characters:长度DecimalPlace:小数点位置点Save,选Localobject(本地对象)记得Save后,一定要按Activate,才会存到底层DBDomain编辑画面一Domain编辑画面二DataElement定义Tablefields的语义定义描述在一特定企业背景下,一domain所代表的意义CreateaDataElementT-CODE:SE11选择Datatype,输入欲定义的Data Element名称(如z**_id1)按create按扭,即可进入编辑画面(见下页)Shorttext:简短描述(如z**_id1dataelement)Datatype选Elementarytype(基本类型)若要參考先前定义的Domain,选Domain再输入Domain名称若要自行定义,择选择Built-intype按Save,再ActivateTable定义T-CODE:SE11选择Databasetable,输入欲定义的Table名称(例如z**_table1)按create按钮,即可进入编辑画面(见下页)Shortdescription:简短描述(如z**_table1table)在DeliveryClass按F4,选Applicationtable (masterandtransactiondata)将Tablemaintenanceallowed打勾,表示允许使用者 直接直接输入记录(通常不勾,而由程式维护)Save后,再按ActivateTable定义aaFieldsFieldsTableFieldsForeignKeysTechnicalSettingsIndexesTable定义目录ABAP数据字典内表的定义和操作数据库的定义和操作结构类型的定义TYPES:BEGINOF<fstring>,<componentdeclaration>,..............ENDOF<fstring>.结构类型的定义*引用预定义类型的用户定义的类型:TYPES:SURNAME(20)TYPEC,STREET(30)TYPEC,ZIP_CODE(10)TYPEN,CITY(30)TYPEC,PHONE(20)TYPEN,DATELIKESY-DATUM.*User-definedstructuredtypereferringtoabovetypes:TYPES:BEGINOFADDRESS,NAMETYPESURNAME,CODETYPEZIP_CODE,TOWNTYPECITY,STRTYPESTREET,ENDOFADDRESS.使用结构类型DATA:ADTYPEADDRESS.WRITE:AD-CODE.结构化定义的嵌套*User-definednestedstructuretypereferringtoabovetypes:TYPES:BEGINOFPHONE_LIST,ADRTYPEADDRESS,TELTYPEPHONE,ENDOFPHONE_LIST.DATAPLTYPEPHONE_LIST.........WRITEPL-ADR-NAME.内表的目的在ABAP/4中,主要使用表格。表格是R/3系统中的关键数据结构。长期使用的数据存储在关系数据库表格中。关于如何读取和处理数据库表格的详细信息,参见读取并处理数据库表。除了数据库表格,还可以创建仅在程序运行时间内存在的内表。ABAP/4提供了针对内表的不同操作。例如,可以搜索、附加、插入或删除行。内表中的行数并不固定。根据需求,系统可实时增加内表的大小。例如,如果想将某个数据库表格读入内表,不必事先知道数据库表格的大小。该特征项使得内表使用起来十分方便,同时还支持动态编程。可以使用内表在数据库表格的子集上执行表格计算。例如,可以将数据库表格的某个部分读入内表(参见将数据读到内表中)。然后可以从内表中计算总和或生成次序表。内表的另一种用处是根据程序需要重新组织数据库表格的内容。例如,可以从一个或多个大客户表格特定的数据中将与创建电话清单有关的数据读入内表中。然后可在程序运行期间直接访问该清单,而不用每次调用时都执行耗时的数据库查询。除了在使用来自数据库表格的数据时使用内表外,内表还是ABAP/4中用于在程序中实现许多复杂数据结构的重要特征项(参见结构化数据类型)。创建内表数据类型TYPES<t><type>OCCURS<n>.TYPESVECTORTYPEIOCCURS10.TYPES:BEGINOFLINE,COLUMN1TYPEI,COLUMN2TYPEI,COLUMN3TYPEI,ENDOFLINE.TYPESITABTYPELINEOCCURS10.创建内表数据对象通过引用另一个表格来创建内表DATA<f><type>[WITHHEADERLINE].通过使用TYPE或LIKE,可以使用<type>选项来引用表格数据类型或表格数据对象通过引用结构来创建内表DATA<f><type>OCCURS<n>[WITHHEADERLINE].该语句通过使用DATA语句的OCCURS选项创建内表<f>。内表中行的数据类型在<type>中指定。要指定数据类型,可以使用TYPE或LIKE参数创建带新结构的内表DATA:BEGINOF<f>OCCURS<n>,

<componentdeclaration>,

..............

ENDOF<f>.这定义内表<f>并在<componentdeclaration>中说明其行组件。创建内表数据对象通过引用类型和结构创建内表DATA<f>STANDARDTABLEOF<type>.DATAitab{{TYPEtabkindOF[REFTO]type}|{LIKEtabkindOFdobj}}[WITHkey][INITIALSIZEn][WITHHEADERLINE][VALUEISINITIAL][READ-ONLY].其中tabkind表示如下:...{{[STANDARD]TABLE}|{SORTEDTABLE}|{HASHEDTABLE}|{ANYTABLE}|{INDEXTABLE}}....InternalTable&WorkAreaWithHeaderLine的作用.....OCCURS0WITHHEADERLINE.如果使用WITHHEADERLINE选项,则创建的内表带工作区域(跟踪调试演示)填充内表附加行APPEND[<wa>TO|INITIALLINETO]<itab>.该语句将新行附加到内表<itab>中。通过使用<wa>TO选项,指定要附加的源区域<wa>。对于带表头行的表格,可以忽略TO选项。这样,表格工作区域就成了源区域。可以使用INITIALLINETO选项替代<wa>TO,将用其类型的正确值初始化的行添加到表格中。APPEND不考虑是否存在标准关键字相同的行(参见标识表格行(页98))。这样,可能会出现相同条目。填充内表根据标准关键字附加行COLLECT[<wa>INTO]<itab>.该语句通过使用INTO选项指定想附加的源区域<wa>。如果表格有表头行,则可以忽略INTO选项。这样,表格工作区域就成了源区域。如果仅使用COLLECT语句填充内表,则不会出现重复条目。因此要填充没有重复条目的内表,应该使用COLLECT而不是APPEND或INSERT。COLLECT语句无法用于带深层结构的内表填充内表插入行INSERT[<wa>INTO|INITIALLINEINTO]<itab>[INDEX<idx>].该语句通过使用INTO选项指定想插入的源区域<wa>。如果表格有表头行,则可以忽略INTO选项。这样,表格工作区域就成了源区域。可以使用INITIALLINETO选项替代<wa>TO,将用其类型的正确值初始化的行添至表格中。如果使用INDEX选项,则将新行插入到有索引<idx>的行之前。插入之后,新条目索引为<idx>,下行索引加1。如果表格包含<idx>-1条目,系统将新条目附加到最后的现有表格行之后。如果表格的条目小于<idx>-1,系统无法插入条目并将SY-SUBRC设置为4填充内表附加内表行APPENDLINESOF<itab1>[FROM<n1>][TO<n2>]TO<itab2>.如果没有FROM和TO选项,该语句将整个表格ITAB1附加到ITAB2中。如果使用这些选项,则可通过索引<n1>或<n2>指定ITAB1中要附加的第一或最后一行。填充内表插入内表INSERTLINESOF<itab1>[FROM<n1>][TO<n2>]

INTO<itab2>[INDEX<idx>].如果没有FROM和TO选项,该语句将整个表格ITAB1附加到ITAB2中。如果使用这些选项,则可通过索引

<n1>或<n2>指定ITAB1中要附加的第一或最后一行。如果使用INDEX选项,将<itab1>的行插入到<itab2>中索引为<idx>的行之前。如果不使用INDEX选项,系统只能在LOOP-ENDLOOP块中通过在当前行(例如,其索引在SY-TABIX中返回的行)之前插入新条目来处理它。填充内表复制内表MOVE<itab1>TO<itab2>.该语句等价于:<itab2>=<itab1>.也可进行多重赋值,例如,<itab4>=<itab3>=<itab2>=<itab1>.读取内表逐行读取内表LOOPAT<itab>[INTO<wa>][FROM<n1>][TO<n2>][WHERE<condition>]......ENDLOOP.用

INTO选项指定目标区域<wa>。如果表格有表头行,则可以忽略

INTO选项。这样,表格工作区域就成了目标区域。逐行将内表<itab>读入<wa>或表格工作区域<itab>。对于读取的每一行,系统都处理以LOOP开始,以ENDLOOP结束的语句块。在语句块内,系统字段SY-TABIX包含当前行的索引。在ENDLOOP语句之后,如果至少读取了一行,则将系统字段SY-SUBRC设置为0。否则,将其设置为4。读取内表用索引读取单行READTABLE<itab>[INTO<wa>]INDEX<idx>.用INTO选项指定目标区域<wa>。如果表格有表头行,可以忽略INTO选项。这样,表格工作区域就成了目标区域。系统用索引<idx>从表格<itab>中读取行。如果找到有指定索引的条目,则将系统字段SY-SUBRC设置为0,而且SY-TABIX包含该行的索引。否则,SY-SUBRC包含非0值。读取内表用自定义关键字读取单行READTABLE<itab>[INTO<wa>]WITHKEY<key>[BINARYSEARCH].用INTO选项可以指定目标区域。如果表格有表头行,则可以忽略INTO选项。这样,表格工作区域就成了目标区域。系统读取<itab>中匹配<key>中所定义的关键字的第一个条目。如果找到有适当关键字的条目,则将系统字段SY-SUBRC设置为0,并且SY-TABIX包含该行的索引。否则,将SY-SUBRC设置为非0值。读取内表读取有标准关键字的单行READTABLE<itab>[INTO<wa>][BINARYSEARCH].用户必须指定要从<itab>的表格工作区域中读取行的关键字。系统在表格中搜索第一个条目以匹配表格工作区域中的所有标准关键字段并将该行读入表格工作区域。如果使用INTO选项,则将该行读入工作区域<wa>。如果找到有匹配关键字的条目,则将系统字段SY-SUBRC设置为0并且SY-TABIX包含该行的索引。否则,将SY-SUBRC设置为4。读取内表二分法搜索READTABLE<itab>.....BINARYSEARCH.如果使用二分法搜索选项,则必须按关键字中指定的次序对内表进行排序。如果系统找到匹配指定关键字的多行,则读取索引最低的行。二分法搜索比线性搜索要快。因此,应尽可能将内表排序并且使用二分法搜索选项。读取内表比较单行的内容READTABLE<itab>[INTO<wa>]<key-option>COMPARING<fields>.系统读取由关键字或<keyoption>中的索引指定的单行。读取行之后,将<fields>中指定的组件与目标区域中的相应组件进行比较。可以用INTO选项指定目标区域<wa>。如果表格有表头,则可以忽略INTO选项。这样,表格工作区域就成了目标区域。如果系统找到包含指定<key-option>的条目,且进行比较的字段内容相同,则将SY-SUBRC设置为0。如果进行比较的字段内容不同,则返回值2。如果系统找不到条目,则包含4。如果系统找到条目,则无论比较结果如何,都将其读入目标区域。读取内表例子: LOOPATITABINTOLINEFROM10TO25WHERECOL2>400.

WRITE:/SY-TABIX,LINE-COL2.

ENDLOOP. READTABLEITABINDEX7. READTABLEITABINTOLINEWITHKEYCOL3=9COL4=36. READTABLEITABINTOLINEINDEX4COMPARINGCOL1COL2.确定内表属性DESCRIBETABLE<itab>[LINES<lin>][OCCURS<occ>].如果使用LINES参数,则将填充行的数量写入变量<lin>。如果使用OCCURS参数,则将行的初始号写入变量<occ>。更改内表行用MODIFY更改行MODIFY<itab>[FROM<wa>][INDEX<idx>].FROM选项中指定的工作区域<wa>代替<itab>中的行。如果表格有表头行,可以忽略FROM选项。这样,表格工作区域就代替行。如果使用INDEX选项,则新行代替索引为<idx>的现有行。如果替换成功,则将SY-SUBRC设置为0。如果内表包含的行少于<idx>,则不更改任何行并且SY-SUBRC包含4。如果使用没有INDEX选项的MODIFY语句,则系统只能在LOOP-ENDLOOP块中通过更改当前行更改内表行用WRITETO更改行WRITE<f>[+<o1>][(<l1>)]TO<itab>[+<o2>][(<l2>)]INDEX<idx>.将字段<f>中偏移量为<o1>,长度为<l1>部分的内容复制到索引为<idx>的表格行中,覆盖偏移量为<o2>,长度为<l2>的部分。请注意,即使对于有表头行的表格,带INDEX选项的WRITETO语句也不访问表格工作区域,而是访问表格的某一行。例如:WRITE'nice.'TOCODE+31INDEX2.删除内表行在循环中删除行DELETE<itab>.系统只能在LOOP-ENDLOOP块中处理该语句例如: LOOPATITABINTOLINE.

IFLINE-COL1<28.

DELETEITAB.

ENDIF.

ENDLOOP删除内表行删除邻近的重复条目DELETEADJACENTDUPLICATEENTRIESFROM<itab>[COMPARING<comp>].系统从内表<itab>中删除所有邻近重复条目。完成以下比较标准之后,条目就会重复:如果没有COMPARING选项,则标准关键字段的内容必须相同如果有COMPARING选项....COMPARING<F1><F2>...,指定字段<F1><F2>...的内容必须相同。如果有COMPARING选项....COMPARINGALLFIELDS,所有字段的内容必须相同。如果系统找到并删除至少一个重复条目,则将SY-SUBRC设置为0。否则,将其设置为4。如果表格根据指定的比较标准进行过排序,则可使用该语句从内表中删除所有重复条目。删除内表行删除选定行DELETE<itab>[FROM<n1>][TO<n2>][WHERE<condition>].用户必须至少指定三个选项之一。如果使用没有WHERE选项的该语句,则系统从<itab>中删除所有索引在<n1>和<n2>之间的行。如果不使用FROM选项,则系统从第一行开始删除。如果不使用TO选项,则系统删除所有行直到最后一行。如果使用WHERE选项,则系统仅从<itab>中删除满足条件<condition>的行。对于<condition>,可指定任何逻辑表达式如果系统至少删除一行,则将SY-SUBRC设置为0。否则,将其设置为4。初始化内表REFRESH<itab>.该语句将内表重置为填充它以前的状态。这意味着表格将不包含任何行。如果使用没有表格工作区域的内表,可以使用CLEAR语句代替REFRESH语句CLEAR<itab>.如果使用有表头行的内表,CLEAR语句如重置缺省值

(页6–10)中所述,仅清除表格工作区域。要重置整个内表而不清除表格工作区域,使用REFRESH语句或CLEAR语句

CLEAR<itab>[].内表名称之后的方括号指内表体。使用REFRESH或CLEAR初始化内表后,系统保持在内存中保留的空间。FREE<itab>.也可以使用

FREE语句重置内

表并直接释

放其内存,而不必先使

REFRESH或

CLEAR。

...<itab>ISINITIAL...检查内表是否为空从数据库表读取数据子句说明SELECT<result>SELECT子句定义选择的结果是单行还是一个表、选择的是哪些列、以及是否将排除相同的行。FROM<source>FROM子句指定即将从中选取数据的数据库表或视图<source>。INTO<target>INTO子句确定即将读入选定数据的目标区<target>。该子句也可以放在FROM子句之前。如果没有指定INTO子句,系统将使用表工作区。表工作区是由TANLES语句自动创建的表头行。WHERE<condition>WHERE子句指定将按照指定的条件读取哪些行来作为选择。GROUPBY<fields>GROUP-BY子句从几行组成的组中产生了作为结果的单行。一个组是在<fields>中列出的列中有相同值的行的集合。ORDERBY<sort_order>ORDER-BY子句为选定的行定义顺序<sort_order>。目录ABAP数据字典内表的定义和操作数据库的定义和操作读取数据库表SELECT[DISTINCT]*............

....

ENDSELECT.必须用ENDSELECT语句结束该循环。该循环依次读取所选行,并为每个读取的行执行循环中的ABAP/4语句。SELECT循环的结果是与被读取的数据库表的格式完全相同的表。DISTINCT选项将自动的去掉重复的行。如果至少读取了一行,系统字段SY-SUBRC就返回0。如果没有读取,系统字段SY-SUBRC就返回4。系统字段SY-DBCNT给读取的行计数。每执行一次SELECT语句,SY-DBCNT都加1。

例: TABLESSPFLI. SELECT*FROMSPFLIWHERECITYFROMEQ'FRANKFURT'.

...

WRITE:/SPFLI-CARRID,SPFLI-CONNID,

SPFLI-CITYFROM,SPFLI-CITYTO.

...

ENDSELECT.读取数据库表选择单行中的所有数据SELECTSINGLE*.......WHERE<condition>......该语句的结

果是一个单

行。为了保

证清楚地指

定了一行,就必须在

WHERE子句的条件

<condition>中用

AND链接形成数据库表主码

主码的所有字段。如果系统没有找到具有指定关键字的行,系统字段SY-SUBRC将设置为4。如果系统找到了一个完全符合指定条件的行,SY-SUBRC就返回0。读取数据库表选择并处理指定列中数据SELECT[SINGLE][DISTINCT]<s1><s2>.....每个<si>都具有下列形式之一<ai> <ai>是数据库表的字段或表单的总计表达式:<ai>AS<bi> <bi>是结构化目标区的第i个组件的可选名称。<aggregate>([DISTINCT]<a>) 总计表达式的说明,参见下列内容。MAX:返回列<a>的最大值MIN:返回列<a>的最小值AVG:返回列<a>的平均值SUM:返回列<a>的总计COUNT:按下列方式给值或行计数: COUNT(DISTINCT<a>)返回列<a>的不同值的个数。 COUNT(*)返回选定行的总数。 在括号和参数之间必须包含空格。为选定数据指定目标区将数据读到工作区中SELECT...INTO<wa>...........必须为工作区<wa>声明一个至少与将读取的行一样大的数据对象。将数据读到内表中SELECT.....INTOTABLE<itab>.在该情况下,SELECT并不启动循

环,并且不

允许使用

ENDSELECT语句。例:SELECT*FROMSPFLIINTOTABLEITAB

WHERECARRID='LH'.

逐个组件地读取数据对于将数据读到工作区中:SELECT...INTOCORRESPONDINGFIELDSOF<wa>........对于将数据读到内表中:SELECT...INTOCORRESPONDINGFIELDSOFTABLE<itab>........对于将数据附加到内表中:SELECT...APPENDINGCORRESPONDINGFIELDSOFTABLE<itab>.......指定将读取的数据库表在程序中指定数据库表名......FROM<dbtab>[CLIENTSPECIFIED][BYPASSINGBUFFER][UPTO<n>ROWS].........

数据库表或视图<dbtab>必须对ABAP/4词典有效,并且必须在ABAP/4程序中包含相应的TRABLES语句。要关闭自动集团处理,请使用CLIENTSPECIFIED选项。BYPASSINGBUFFER选项使得不用读取SAP表缓冲区就可直接读取数据库。在ABAP/4词典中定义一个表时,可以指定SAP必须将自己的本地缓冲区用于该表。该缓冲区被异步更新。由于SELECT语句通常使用该缓冲区,所以没有必要使用数据库的最新版本。要保证使用的是最新版本,请使用BYPASSINGBUFFER选项。如果最多只需从数据库表<dbtab>中读取<n>行,请使用可选规范UPTO<n>ROWS。如果<n>=0,系统将读取所有行,如果<n>小于0,将产生运行时间错误。如果将UPTO<n>ROWS选项与ORDERBY子句组合起来,系统将首先给这些行排序,然后再处理前<n>行指定将读取的数据库表在运行时指定数据库表的名称 ......FROM(<dbtabname>)[CLIENTSPECIFIED][BYPASSINGBUFFER][UPTO<n>ROWS]..INTO<target>.....例:NAME='SPFLI'.SELECT*FROM(NAME)INTOWA.WRITE:/WA-LINE.ENDSELECT.在程序中为行选择指定条件如果希望指定几个必须同时满足的条件,可按照下列方法用AND组合它们:....WHERE<condition1>AND<condition2>AND<condition3>AND...如果需要指定几个条件,至少要满足其中的一个条件,就可按照下列方法用OR组合它们:....WHERE<condition1>OR<condition2>OR<condition3>OR...如果只希望选择那些不符合指定条件的表条目,就可用NOT转化条件,如下所示:....WHERENOT<condition>NOT的优先级比AND高,AND的优先级比OR高。但是,可使用括号来定义处理的顺序。这些括号都必须加空格。<operator>含义EQ等于

=等于NE不等于<>不等于><不等于LT小于<小于LE小

于或等于<=小

于或等于GT大于>大于GE大于或等于>=大于或等于运行时指定行选择的条件SELECT......WHERE(<itab>).......只能在仅包

含一个类型

C且最大长度

72的字段的内

<itab>中指定条件

。表名称必须在括号中指定,但在括号和名称之间没有空格。内表也可保持为空。例:CONCATENATE'CITYFROM='''CITY1''''INTOITAB.APPENDITAB.CONCATENATE'ORCITYFROM='''CITY2''''INTOITAB.APPENDITAB.CONCATENATE'ORCITYFROM=''''BERLIN'''''INTOITAB.APPENDITAB...ORDERBY<F1>[ASCENDING|DESCENDING]<F2>[ASCENDING|DESCENDING]..按指定的表字段<F1>,<F2>,....给所选行排序。可以在每个字段名后指定选项ASCENDING或DESCENDING为每个表字段明确地指定排序顺序。标准的排序顺序是升序。如果指定了多个字段,那么系统首先按<F1>给所选行排序,然后是<F2>,依此类推。..ORDERBY(<itab>)如果内表包含列表<F1>[ASCENDING|DESCENDING]<F2>...,那么该语句的功能与前面说明的语句一样。这里,<itab>的行必须是C类且最大长度为72。更改数据库表的内容操作ABAP/4关键字添加行INSERT可使用INSERT语句添加新行,即添加主码在数据库表中尚不存在的行。更改行UPDATE可使用UPDATE语句更改已经在数据库表中存在的行,即更改主码已在数据库中存在的行。添加或更改行MODIFY如果不存在带有即将添加的主码的行,请使用MODIFY语句添加新行。否则,更改现存的行。删除行DELETE可使用DELETE语句从数据库表中删除行。向数据库表添加行添加一单行INSERTINTO<dbtab>[CLIENTSPECIFIED]VALUES<wa>.工作区<wa>中的内容将写进数据库表<dbtab>中。必须在程序中使用TABLES语句声明该数据库表。工作区<wa>的长度至少要等于数据库表的表工作区长度。为了保证工作区具有与数据库表相同的结构,可通过DATA或TYPES语句用LIKE<dbtab>选项来定义从内表中添加几行 INSERT<dbtab>[CLIENTSPECIFIED]FROMTABLE<itab>

[ACCEPTINGDUPLICATEKEYS].如果需要在运行时间指定数据库表名,请使用下列语法: INSERT(<dbtabname>)[CLIENTSPECIFIED]FROMTABLE<itab>

[ACCEPTINGDUPLICATEKEYS].此语句在单个操作中将内表<itab>中的所有行添加到数据库表中。内表<itab>中的行长度至少要等于数据库表的长度。如果操作成功完成,就将SY-SUBRC设置为0。如果因为至少有一具有相同的主码的行已在<dbtab>中存在,从而使得部分行不能插入,那么,系统将返回一个运行时间错误。要避免该运行时间错误,请使用ACCEPTINGDUPLICATEKEYS选项,它将跳过这些行而不插入,并将SY-SUBRC设置为4。如果需要更改现存的行而不是跳过它们,请使用MODIFY语句系统字段SY-DBCNT的值始终都为已插入行的数目,而不考虑SY-SUBRC中的值。在数据库表中更改行更改单行UPDATE<dbtab>[CLIENTSPECIFIED]FROM<wa>.UPDATE<dbtab>[CLIENTSPECIFIED].在第一个语句中,工作区<wa>中的内容将覆盖数据库表<dbtab>的行,该数据库表与<wa>具有相同的主码。必须在程序中用TABLES声明该数据库表。在第二个语句中,没有指定工作区<wa>。但表工作区<dbtab>中的内容将覆盖具有相同主码的数据库表的行。在运行时间指定数据库表的名称: UPDATE(<dbtabname>)[CLIENTSPECIFIED]FROM<wa>.在数据库表中更改行更改多行UPDATE<dbtab>[CLIENTSPECIFIED]SET<S1>..<Sn>[WHERE<condition>].可在SY-DBCNT中找到已更改行的数目。如果至少更改了一行,SY-SUBRC就返回0。如果没有更改任何行,就返回4。如果使用SET子句更改数据库表中的行,就不能在运行时间指定数据库表的名称,而必须在程序中指定。

在数据库表中更改行使用内表更改多行UPDATE<dbtab>[CLIENTSPECIFIED]FROMTABLE<itab>.如果需要在运行时间指定数据库表的名称,就要使用下列语法:UPDATE(<dbtabname>)[CLIENTSPECIFIED]FROMTABLE<itab>.添加或更改行插入单行MODIFY<dbtab>[CLIENTSPECIFIED][FROM<wa>].MODIFY(<dbtabname>)[CLIENTSPECIFIED][FROM<wa>].插入多行MODIFY<dbtab>[CLIENTSPECIFIED]FROMTABLE<itab>.MODIFY(<dbtabname>)[CLIENTSPECIFIED]FROMTABLE<itab>.从数据库表中删除行删除单行DELETE<dbtab>[CLIENTSPECIFIED]FROM<wa>.DELETE<dbtab>[CLIENTSPECIFIED].DELETE(<dbtabname>)[CLIENTSPECIFIED]FROM<wa>.删除多行DELETEFROM<dbtab>[CLIENTSPECIFIED]WHE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论