版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、ABAP-内表操作2012年02月15日目录 TOC o 1-3 h z u HYPERLINK l _Toc317586745 1引言 PAGEREF _Toc317586745 h 4 HYPERLINK l _Toc317586746 1.1目的及范围 PAGEREF _Toc317586746 h 4 HYPERLINK l _Toc317586747 1.2参考资料 PAGEREF _Toc317586747 h 4 HYPERLINK l _Toc317586748 1.3定义 PAGEREF _Toc317586748 h 4 HYPERLINK l _Toc317586749
2、1.4文档结构 PAGEREF _Toc317586749 h 4 HYPERLINK l _Toc317586750 2内表介绍 PAGEREF _Toc317586750 h 4 HYPERLINK l _Toc317586751 2.1内表种类 PAGEREF _Toc317586751 h 4 HYPERLINK l _Toc317586752 2.2内表属性 PAGEREF _Toc317586752 h 5 HYPERLINK l _Toc317586753 2.3内表定义 PAGEREF _Toc317586753 h 5 HYPERLINK l _Toc317586754 2.
3、3.1参照数据类型定义内表 PAGEREF _Toc317586754 h 5 HYPERLINK l _Toc317586755 2.3.2参照数据对象定义内表 PAGEREF _Toc317586755 h 6 HYPERLINK l _Toc317586756 2.3.3其他定义形式 PAGEREF _Toc317586756 h 6 HYPERLINK l _Toc317586757 3内表操作 PAGEREF _Toc317586757 h 7 HYPERLINK l _Toc317586758 3.1操作内表行 PAGEREF _Toc317586758 h 7 HYPERLINK
4、 l _Toc317586759 3.1.1工作区 PAGEREF _Toc317586759 h 7 HYPERLINK l _Toc317586760 3.1.2INSERT语句 PAGEREF _Toc317586760 h 7 HYPERLINK l _Toc317586761 3.1.3APPEND语句 PAGEREF _Toc317586761 h 16 HYPERLINK l _Toc317586762 3.1.4COLLECT语句 PAGEREF _Toc317586762 h 18 HYPERLINK l _Toc317586763 3.1.5READ语句 PAGEREF _
5、Toc317586763 h 19 HYPERLINK l _Toc317586764 3.1.6MODIFY语句 PAGEREF _Toc317586764 h 22 HYPERLINK l _Toc317586765 3.1.7DELETE语句 PAGEREF _Toc317586765 h 25 HYPERLINK l _Toc317586766 3.1.8LOOP语句 PAGEREF _Toc317586766 h 30 HYPERLINK l _Toc317586767 3.2整个内表操作 PAGEREF _Toc317586767 h 30 HYPERLINK l _Toc3175
6、86768 3.2.1数据行排序 PAGEREF _Toc317586768 h 30 HYPERLINK l _Toc317586769 3.2.2初始化内表 PAGEREF _Toc317586769 h 34 HYPERLINK l _Toc317586770 3.2.3整体复制内表 PAGEREF _Toc317586770 h 37 HYPERLINK l _Toc317586771 3.2.4比较内表大小 PAGEREF _Toc317586771 h 38 HYPERLINK l _Toc317586772 3.2.5控制级操作 PAGEREF _Toc317586772 h 3
7、9引言内表是一种十分灵活的大批量数据管理形式,用于在程序运行期间存储多行结构相同的数据。内表的行结构可以是一个简单类型数据,也可以是复杂的结构体或内表。而内表的行数是动态的,添加数据后可以循环读取每行数据或者整体操作。目的及范围内表的使用在SAP程序中相当重要,因而ABAP中提供许多内表处理语句,可以说没有一个实际应用程序中不需要使用到内表,本文档主要介绍如何使用内表,可适用于ABAP开发人员,分析人员使用参考资料SAP程序设计 黄佳定义文档结构文档的各章节介绍的内容如下:第2节主要介绍内表定义第3节介绍如何操作内表 内表介绍以下将讲解在SAP中关于内表的相关概念:内表种类内表种类决定了系统内
8、部对内表的处理以及ABAP对内表行的访问方式。在程序中对内表种类的选择应取决于程序对内表的操作方式、内表大小以及访问该内表的频率,因为在寻址不同类型内表行的过程中,内表种类的不同会带来效率的差异。ABAP中有三种内表类型:内表类型表类型关键字访问方式UNIQUE|NON-UNIQUE标准表STANDARD TABLE主要通过索引访问, 可以通过关键字访问不能用UNIQUE关键字,且无需特别指定NON-UNIQUE关键字排序表SORTED TABLE主要通过关键字访问,也可以通过索引访问可以用NON-UNIQUE或者UNIQUE关键字哈希表HASHED TABLE只能通过关键字访问不能用NON-
9、UNIQUE关键字,且必须指定UNIQUE关键字内表属性属性描述行结构内表行可以由任意类型的ABAP数据类型组成。一般说来,内表的行类型大多是结构体,或者是引用数据字典中的结构形式,但由单个基本类型或者引用类型组成的数组也常常在程序中出现。如果内表的行结构中还包含有内表类型,则可以构造出十分复杂的数据结构表关键字内表的表关键字在访问内表和内表排序的过程中起着相当重要的作用,在内表定义语句中,使用WITH KEY指定关键字,该项为可选项,如果不指定,则系统会使用默认(标准)关键字。初始内存大小在内表数据的定义和声明过程中,可以分为内表分配初始内存大小:INITIAL SIZE n 扁平结构内表的
10、默认(标准)表关键字是非数字和非内表的组件字段。如果内表的行是单个基本类型组成,则默认关键字为整个行;如果内表行中包含有内表类型字段,则没有默认关键字。内表定义定义一个内表从本质上可以分为两种形式:参照数据类型定义内表 数据类型通过关键字TYPES声明:例如:声明一个结构类型typ_structTYPES:BEGINOFtyp_struct,name(20)TYPEc,ageTYPEi,ENDOFtyp_struct. 根据结构类型typ_struct声明一个内表类型typ_itabTYPES:typ_itabTYPETABLEOFtyp_struct.则参数数据类型来定义一个内表的语法如下表
11、格所示参照数据类型定义内表时,要使用关键字TYPE,里的内容表示可选DATA itabTYPEdata_itab(内表类型)WITH NON-UNIQUE | UNIQUE KEY INITIAL SIZE nWITH HEADER LINE表头TYPE TABLE OFdata_struct(结构类型)WITH NON-UNIQUE | UNIQUE KEY INITIAL SIZE nWITH HEADER LINE表头参照数据对象定义内表有时为了方便,也可以直接参照数据对象来定义一个新的内表,该内表与参数内表的行结构一致,数据对象通过关键字DATA来声明根据上面声明的结构类型来声明一个内
12、表对象和一个结构对象,语法如下:DATA:data_itabTYPETABLEOFtyp_struct,data_struTYPEtyp_struct.参数数据对象定义内表时,要使用关键字LIKEDATA itabLIKEdata_itab(内表对象)WITH NON-UNIQUE | UNIQUE KEY INITIAL SIZE nWITH HEADER LINELIKE TABLE OFdata_struct(结构对象)WITH NON-UNIQUE | UNIQUE KEY INITIAL SIZE nWITH HEADER LINE其他定义形式DATA:BEGIN OF itab_c
13、ompany OCCURS n, name(20) TYPE c, address(20) TYPE c, END OF itab_company.实际上这段语句也声明了一个标准内表,并分配初始内存大小为n行,OCCURS是ABAP 3.0之前声明内表的关键字选项,不建议使用,但由于有时系统维护时需要接触旧的ABAP代码,这里说明一下。内表操作操作内表行对内表的操作分为数据行操作和整个内表操作两大类,行操作可以通过关键字或索引两种途径进行,但哈希表不能通过索引操作。有时同样的操作关键字语句,针对不同各类的内表有不同的形式。行访问方式通过关键字访问行是所有类型内表的通用操作形式:而索引操作则是通
14、过内表内部系统索引进行的,因而不适用于哈希表,当一个行操作语句执行结束后,系统变量SY-TABIX将返回该行的索引。对于所有行操作,如果访问成功,系统变量SY-SUBR返回0值,否则返回非0值,有时该值和特定的错误原因相关。工作区程序对内表的行操作不能直接进行,必须通过一种接口来传输,这个接口就是工作区(Work Area)。比如某程序需要从关系数据库中提取数据到内表各行中,必须先将数据讲稿工作区,然后把工作区中的数据赋给内表的行。工作区必须具有和内表行一致或者可相互转换的数据结构(一般是与内表委类型相同的结构体)。因此在定义内表对象的同时,还需要定义一个与该内表行结构相同的工作区对象供程序使
15、用,将数据写入内表时,必须首先给工作区赋值,然后在工作区添加或者插入内表。从内表中读取数据时,需要用已定位的内表行内容覆盖工作区的内容,然后再从程序中使用工作区的内容表头行:ABAP为程序员提供了一种简单的方法:在创建内表对象的同时可以隐式地定义一个同名工作区,这个同名工作区就叫做表头行或标题行(Header Line),也称作内表工作区。因为表头与内表同名,很容易混淆,在实际程序中建议不要使用表头行(Header Line),而是应该总是声明结构相同的其他数据对象作为显示工作区进行内表行操作。INSERT语句将新行插入到内表中的指定位置,需要使用INSERT语句。对于索引表(标准表和排序表)
16、,可以指定某行的索引,则新行将插入该索引所代表的行之前;对于哈希表而言,不能指定行索引,系统会按照关键字将新行插入其特定位置。给内表插入行可以为单行,也可以多行,甚至可把整个内表的数据插入其它内表中。语法介绍INSERT wa INTO itab INDEX n通过索引插入单行(如果内表行数小于n-1,则操作失败),如果是排序表,插入的行不可以打乱按照关键字排序的顺序,否则插入不成功INSERT wa | INITIAL LINE INTO TABLE itab (用INITIAL LINE代替工作区,其效果是用行结构中各类型的初始值组成数据添加到内表中)一般性的插入单行的语法,注:此语句中增
17、加了TABLE关键字标准表:附加至表的最后一行,与APPEND语句效果完全一致;排序表:按照关键字升序排列后插入适当位置哈希表:插入过程中系统会按照关键字进行定位INSERT LINES OF itab1 FROM n1 TO n2INTO TABLE itab2 INDEX n如果不指定行数,则将整个内表itab1插入到itab2中,不指定行数时,itab1可以为任意表,itab2必须为索引表,如果指定行数,则两个表都必须是索引表。如果itab2前指定TABLE附加项,则itab2可以是任意类型内表。实例演示:创建内表,分别为标准表、排序表和哈希表,填充相同的数据,代码和显示结果如下:*&*
18、&ReportZCXT_ITAB_INSERT*&*&*&*&*&*REPORTzcxt_itab_insert.TYPES:BEGINOFtyp_struct,name(10)TYPEc,NUMBER(10)TYPEC,ENDOFtyp_struct.DATA:waTYPEtyp_struct,itabTYPESTANDARDTABLEOFtyp_structWITHKEYname,标准表itab_sTYPESORTEDTABLEOFtyp_structWITHNON-UNIQUEKEYname,排序表itab_hTYPEHASHEDTABLEOFtyp_structWITHUNIQUEKE
19、Yname.哈希表wa-name=A.wa-NUMBER=ONE.APPENDwaTOitab.APPENDwaTOitab_s.INSERTwaINTOTABLEitab_h.wa-name=C.wa-NUMBER=THREE.APPENDwaTOitab.APPENDwaTOitab_s.INSERTwaINTOTABLEitab_h.WRITE:/,NAME,NUMBER,LINES,/.ULINE.WRITE:标准表:.LOOPATitabINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.ULINE.WRITE:排序表:.LOOPATi
20、tab_sINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.ULINE.WRITE:哈希表:.LOOPATitab_hINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.三个内表的显示结果如下:NAME是主键NUMBER为数据编号LINES显示的是展示行在内表中行数,即索引,可以看出,哈希表是没有索引的(sy-tabix一直为0) 例:通过索引插入单行在标准表第二行插入数据:D FOUR代码如下:wa-name=D.wa-number=FOUR.INSERTwaINTOitabINDEX2.ULI
21、NE.WRITE:标准表:修改后.LOOPATitabINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.将此段代码,添加到前面创建三个内表的代码后,执行结果如下:数据插入成功,如果此处是把数据插入到排序表的第二行,则会出错,因为排序表是按关键字升序排列的,如果将数据插入到第二行,则顺序变成A、D、C,打乱了排序表按关键字排列的顺序(A,C,D),因此插入不成功,出错。将上面标准表itab换成排序表itab_s,INSERTwaINTOitab_sINDEX2.则运行结果为:另外,按索引向索引表插入数据时,如果索引n内表行数+1,则会操作失败,将
22、上面索引2修改为4,INSERTwaINTOitabINDEX4.则执行结果为:插入数据失败。例:一般性的插入单行分别向三种内表插入数据:B TWO代码如下:wa-name=B.wa-number=TWO.INSERTwaINTOTABLEitab.INSERTwaINTOTABLEitab_s.INSERTwaINTOTABLEitab_h.SKIP.WRITE:=,/.WRITE:标准表:修改后.LOOPATitabINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.ULINE.WRITE:排序表:修改后.LOOPATitab_sINTOwa
23、.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.ULINE.WRITE:哈希表:修改后.LOOPATitab_hINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.将上面代码添加到创建内表的代码后,执行结果如下:对于标准表,此种插入相当于APPEND附加到内表末尾对于排序表,插入到按关键字排序的适当位置对于哈希表,例:插入多条数据INSERT LINES OF itab1 INTO itab2 INDEX n:不指定行数,将内表itab1的所有行,插入到内表itab2的指定行之后,使用INDEX时,排序表很
24、容易出错,因此itab2以标准表为例:代码如下:将哈希表的所有行从标准表的第二行开始插入INSERTlinesofitab_hINTOitabINDEX2.SKIP.WRITE:=,/.WRITE:标准表:修改后.LOOPATitabINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.将此代码与内表创建的代码连接在一起,运行结果如下:图中标识的数据为从哈希表插入到标准表中的数据INSERT LINES OF itab1 FROM n1 TO n2 INTO itab2 INDEX n:将内表itab1的从n1(不指定的话从起始行)行到n2(不指定
25、的话到末尾行)行的数据从itab2的第n行开始插入,因为此时指定行数,要求itab1为索引表,不能使用哈希表。代码如下:INSERTlinesofitab_sTO2INTOitabINDEX1.SKIP.WRITE:=,/.WRITE:标准表:修改后.LOOPATitabINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.将代码与内表创建代码连接起来,运行结果如下:排序表的从开始行到第二行之间的数据从标准表的第一行开始插入,图中标示出的数据为插入数据。注:当n2大于内表行数时,不会报错,此时的n2相当于最大行数,但是如果n1取0,程序就会报错。I
26、NSERT LINES OF itab1 INTO TABLE itab2:当使用TABLE关键字时,不通用再使用INDEX关键字,此时内表itab2即可以是索引表,也可以是非索引表。因为哈希表中的关键字是唯一的,这里我们新建一个数据不同的内表itab_new分别向标准、排序和哈希表中插入数据代码如下:DATA:itab_newTYPETABLEOFtyp_struct.wa-name=B.wa-number=TWO.APPENDwaTOitab_new.wa-name=D.wa-number=FOUR.APPENDwaTOitab_new.INSERTlinesofitab_newINTOT
27、ABLEitab.INSERTlinesofitab_newINTOTABLEitab_s.INSERTlinesofitab_newINTOTABLEitab_h.SKIP.WRITE:=,/.WRITE:标准表:修改后.LOOPATitabINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.ULINE.WRITE:排序表:修改后.LOOPATitab_sINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.ULINE.WRITE:哈希表:修改后.LOOPATitab_hINTOwa.WRITE:/
28、,wa-name,wa-number,sy-tabix.ENDLOOP.将代码与内表创建部分连接起来,执行结果分别如下:标准表:插入数据相当于附加APPEND到内表后排序表:数据按关键字升序排列后,再插入到内表中哈希表:当使用TABLE关键字时,可以向哈希表中插入数据,不过要保证插入数据的关键字不与已存在数据重复,否则操作失败,程序会异常终止。APPEND语句附加行是在一个已对存在的索引表(该内表可以为空)中使用APPEND语句增添新行。该语句只能操作索引表,哈希表不是以索引作为行的寻址方式,没有系统索引,因而也就不能通过索引进行附加操作。语法介绍APPEND wa | INITIAL LIN
29、E TO itab添加工作区内空或默认行到内表itab中APPEND LINES OF itab1 FROM n1 TO n2 TO itab将内表itab1的所有行或者部分行添加到内表itab中例:附加单行数据代码如下:将一行数据通过APPEND添加到内表中,因为往排序表中添加数据时,如果打乱了按关键字排序的顺序,则会操作失败,此处以标准表为例:wa-name=B.wa-number=TWO.APPENDwaTOitab.SKIP.WRITE:=,/.WRITE:标准表:修改后.LOOPATitabINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLO
30、OP.将代码与内表创建的代码部分连接起来,执行结果如下:如果此处用的是排序表,因为按关键字顺序为A、C、B,不符合按关键字升序排列的要求,因此会报如下错误例:附加多行数据将排序表的多行数据添加到标准表中,同样,因为向排序有中添加数据很容易出现错误,此处仍以标准表为例,代码如下:APPENDlinesofitab_sTOitab.SKIP.WRITE:=,/.WRITE:标准表:修改后.LOOPATitabINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.将代码与内表创建部分连接起来,执行结果如下:注:APPEND语句中没有TABLE关键字,对于
31、标准表而言,APPEND语句和带TABLE关键字的INSERT语句效果是一致的。COLLECT语句由于索引表中行与行之间数据具有可重复性,如果使用APPEND语句附加行,则多个具有相同表关键字段值的数据行(甚至完全相同的数据行)可以同时存在于一个内表对象中。如果希望在内表中表关键字段能够唯一性确定数据行(即有相同关键字段值的数据行不能重复出现),应该使用COLLECT语句根据表关键字附加行,该操作可以应用于所有种类的内表,但是其效果与按照索引附加行是有区别的。语法:COLLECT wa INTO itab注:此处是用INTO关键字,APPEND语句中用的是TO适用范围:内表必须要扁平结构,工作
32、区怀内表行类型兼容,所有非表关键字段必须是数据类型作用:当使用COLLECT语句时,系统将检查工作区中的标准关键字段值与已经存在于内表中的数据行是否相同。如果不同,COLLECT语句的作用与APPEND语句相似,将新行附加至内表末尾。如果已存在相同表关键字的行,COLLECT语句不附加新行,而是将工作区中数据字段的内容累加到已有数据行中数据字段内容之上。例:COLLECT操作内表此案例需要新建一个特殊的内表,以标准表为例,代码如下:TYPES:BEGINOFtyp_struct,name(10)TYPEc,numberTYPEi,ENDOFtyp_struct.DATA:waTYPEtyp_s
33、truct,itabTYPESTANDARDTABLEOFtyp_structWITHKEYname.标准表wa-name=ONE.wa-number=1.APPENDwaTOitab.wa-name=THREE.wa-number=3.APPENDwaTOitab.WRITE:标准表:.LOOPATITABINTOWA.WRITE:/,wa-name,wa-number.ENDLOOP.wa-name=TWO.wa-number=2.COLLECTWAINTOITAB.ULINE.WRITE:标准表:修改后.LOOPATITABINTOWA.WRITE:/,wa-name,wa-number
34、.ENDLOOP.执行此段代码,结果如下:因为关键字不同,COLLECT语句相当于APPEND语句,附加一行数据如果将wa由TWO 2修改为ONE 2,则执行结果如下:非表关键字行累加到了第一行,数值由1变成了3(1+2)。READ语句语法介绍READ TABLE itab INTO wa | ASSIGNING | TRANSPORTINGNOFIELDS INDEX n对于索引表,可以通过该语句读取第n行数据,如果指定工作区,则将该行数据读取到工作区中,如果选择TRANSPORTINGNOFIELDS,将不读取内表到工作区,有利于提高执行效率READ TABLE itab FROM wa
35、INTO wa | ASSIGNING |TRANSPORTINGNOFIELDS此语法主要用于判断内表中是否包含工作区中的内容,后面部分通常省略,若读取成功,sy-subrc返回0,失败则返回4,此语句不仅适用于索引表,对哈希表也适用READ TABLE itab WITH TABLE KEY k1=f1 k2=f2 INTO wa | ASSIGNING | TRANSPORTINGNOFIELDS 使用READ该死中通过关键字内表行可以用于任何种类的内表,是比用索引读取更具普遍性的操作,该语句要指定内表中的所有表关键字字段的值READ TABLE itab WITH KEY k1=f1
36、k2=f2 INTO wa | ASSIGNING | TRANSPORTINGNOFIELDS 该语句中的KEY列表可以为任意内表字段,不一定是表关键字,读取符合条件的第一条数据例:根据索引读取内表行读取标准表的第二行数据到工作区并打印出来,代码如下:READTABLEitabINTOwaINDEX2.SKIP.WRITE:=,/.WRITE:标准表的第二条数据为:.WRITE:/,wa-name,wa-number,sy-tabix.将代码与内表创建部分代码连接在一起,执行结果如下:例:按工作区读取内表行判断内表中是否包含工作区内容,读取成功sy-subrc返回0,失败返回4。代码如下:w
37、a-name=A.wa-number=ONE.SKIP.WRITE:=,/.READTABLEitabFROMwaINTOwa.IFsy-subrc=0.WRITE:标准表中包含该工作区的数据:.WRITE:/,wa-name,wa-number,sy-subrc=,sy-subrc.ENDIF.将代码与创建内表的代码连接起来,执行结果如下:sy-subrc返回值为0,读取成功,表明准备表中包含工作区的数据。如果读取失败的话,sy-subrc则会返回值4。例:根据关键字读取内表行读取哈希表中name为A的数据到工作区,并打印,代码如下:SKIP.WRITE:=,/.READTABLEitab_
38、hWITHTABLEKEYname=AINTOwa.IFsy-subrc=0.WRITE:哈希表中包含name为A的数据:.WRITE:/,wa-name,wa-number,sy-tabix.ELSE.WRITE:/,sy-subrc.ENDIF.将代码与内表定义部分连接起来,执行结果如下:例:根据任意字段读取内表行读取标准表中,number 为THREE的数据行,代码如下:SKIP.WRITE:=,/.READTABLEitabWITHKEYnumber=THREEINTOwa.IFsy-subrc=0.WRITE:标准表中包含number为THREE的数据:.WRITE:/,wa-nam
39、e,wa-number,sy-tabix.ELSE.WRITE:/,sy-subrc.ENDIF.将代码与内表定义部分连接起来,执行结果如下:MODIFY语句使用MODIFY语句更改内表的数据行可以通过索引或者关键字进行语法介绍MODIFY itab RROM wa INDEX n TRANSPORTING f1 f2.该语句使用FROM选项中指定的工作区wa代替itab中索引为n的现在行,如果内表行数少于n,则不更改任何行,如果指定TRANSPORTING选项,则只修改指定字段的值MODIFY TABLE itab FROM wa TRANSPORTING f1 f2.使用表关键字来更改内表
40、行可以应用于所有类型的内表,该语句中itab之前需要添加TABLE关键字,修改的是关键字以外的字段值。MODIFY itab FROM wa TRANSPORTING f1 f2WHERE condition该语句中没有TABLE关键字,另外就是TRANSPORTING选项是必须的,指明要修改的字段,然而对于哈希表和排序表,只能修改非关键字段的值,即只有非关键字段才可以出现在f1中,标准表所有字段都可以修改。例:根据索引修改内表行根据索引修改内表数据,如果是排序表,很可能因为修改数据时无法保证数据按关键字升序排列而导致操作失败,这里采用标准表为例,根据工作区内容修改标准表的第一行数据,代码如下
41、:SKIP.WRITE:=,/.wa-name=D.wa-number=FOUR.MODIFYitabFROMwaINDEX1.IFsy-subrc=0.WRITE:标准表:修改后:.LOOPATitabINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.ELSE.WRITE:/,sy-subrc.ENDIF.将代码与内表定义部分连接起来,执行结果如下:两个字段的值都根据工作区修改了(如果修改的是排序表,则此操作会出错,因为D、C不是按升序排列的)如果在MODIFY语句中指定TRANSPORTING选项,指定修改字段为number:MODIFYi
42、tabFROMwaINDEX1TRANSPORTINGnumber.则执行结果如下:只有number字段的值被修改了。例:根据关键字修改内表行根据关键字把工作区中的非关键字字段值更新到该关键字所在行(因为不修改关键字段值,不会影响数据排序),以排序表为例,代码如下:SKIP.WRITE:=,/.wa-name=C.wa-number=FOUR.MODIFYTABLEitab_sFROMwa.IFsy-subrc=0.WRITE:排序表:修改后:.LOOPATitab_sINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.ELSE.WRITE:/,
43、sy-subrc.ENDIF.将代码与内表创建部分连接起来,执行结果如下:字段number值由THREE被修改为 FOUR例:根据条件修改多行数据把哈希表中name小于X的数据行的number修改为工作区中内容(哈希表不允许修改关键字段),代码如下:SKIP.WRITE:=,/.wa-name=D.wa-number=FOUR.MODIFYitab_hFROMwaTRANSPORTINGnumberWHEREnameX.IFsy-subrc=0.WRITE:哈希表:修改后:.LOOPATitab_hINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOO
44、P.ELSE.WRITE:/,sy-subrc.ENDIF.将代码与内表定义部分连接起来,执行结果如下:哈希表中两行数据的number值都被修改为FOUR了。DELETE语句语法介绍DELETE itab INDEX n对于索引表,可以使用该语句通过索引删除行,该语句从内表itab中删除索引为n的行,删除成功后,下面所有行的索引减1,操作成功,sy-subrc返回0,失败则返回4.DELETE TABLE itab FROM wa根据关键字删除单行,需要指明TABLE关键字DELETE TABLE itab WITH TABLE KEY k1=f1 ki=fi根据关键字删除单行,需要指明TAB
45、LE关键字DELETE itab FROM n1 TO n2根据索引值删除索引为n1到n2之间的多行数据,如果不指定FROM和TO选项,则删除内表所有数据。DELETE itab WHERE condition根据WHERE条件删除满足条件的多行数据,若不指定WHERE选项,则删除内表所有数据。DELETEADJACENTDUPLICATESFROMitab删除内表中的重复行,使用该语句之前,操作内表必须要先排序例:根据索引删除单行删除标准表的第一行数据,代码如下:SKIP.WRITE:=,/.DELETEitabINDEX1.IFsy-subrc=0.WRITE:标准表:修改后.LOOPAT
46、itabINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.ELSE.WRITE:/,sy-subrc.ENDIF.将代码与内表定义部分连接起来,执行结果如下:操作前:操作后例:根据关键字删除单行分别用两种语法根据关键字删除标准表和排序表中name 为C的数据行,代码如下:SKIP.WRITE:=,/.wa-name=C.DELETETABLEitabFROMwa.DELETETABLEitab_sWITHTABLEKEYname=C.IFsy-subrc=0.WRITE:标准表:修改后.LOOPATitabINTOwa.WRITE:/,wa-n
47、ame,wa-number,sy-tabix.ENDLOOP.ULINE.WRITE:排序表:修改后.LOOPATitab_sINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.ELSE.WRITE:/,sy-subrc.ENDIF.将代码与内表定义部分连接起来,执行结果如下:删除成功,两种方法都能够实现根据关键字删除指定关键字所在的行(第一个满足条件的)。例:根据索引删除多行删除标准表中的索引值在1-2的所有数据,代码如下:SKIP.WRITE:=,/.DELETEitabFROM1TO2.IFsy-subrc=0.WRITE:标准表:修改后.
48、LOOPATitabINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.ELSE.WRITE:/,sy-subrc.ENDIF.将代码与内表定义部分连接起来,执行结果如下:标准表中索引为1和2的数据都被删除了。例:根据条件删除多行删除哈希表中,满足name小于X的数据行,代码如下:SKIP.WRITE:=,/.DELETEitab_hWHEREnameX.IFsy-subrc=0.WRITE:哈希表:修改后.LOOPATitab_hINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.ELSE.WRI
49、TE:/,sy-subrc.ENDIF.将代码与内表定义部分连接起来,执行结果如下:哈希表中name小于X的两行数据都被删除了。例:删除内表重复行向标准表中添加多条重复数据,排序(默认升)后,删除重复数据,代码如下:ULINE.wa-name=A.wa-number=ONE.INSERTwaINTOTABLEitab.wa-name=C.wa-number=THREE.INSERTwaINTOTABLEitab.WRITE:排序前:.LOOPATitabINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.SORTITAB.WRITE:/,排序后:
50、.LOOPATitabINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.DELETEADJACENTDUPLICATESFROMitab.WRITE:/,去重后:.LOOPATitabINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.将代码与内表定义部分连接起来,执行结果如下:LOOP语句LOOP语句可以逐行读取内表内容,其循环顺序为内表中数据行的排列次序。语法介绍LOOP AT itabINTO waFROM n1TO n2n1和n2是索引,有时候使用该选项可以避免遍历内表,对提高性能有着很重
51、要的意义将内表内容读取到目标工作区ASSIGNING WHERE condition将该内表数据行分配给字段符号TRANSPORTING NO FIELDS循环时不进行任何数据读取操作,一般只用于计算内表大小或满足特定条件的行数END LOOP循环打印内表行数据:在内表定义中有关于内表输入的语句,就用到了LOOP循环语句,代码如下:LOOPATitabINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.带FROM n1 TO n2的循环语句,代码如下:LOOPATitabINTOwa FROM 1 TO 2.WRITE:/,wa-name,wa-
52、number,sy-tabix.ENDLOOP.该语句不会遍历内表所有行,只打印内表从1至2行。整个内表操作内表的整体操作包括内表之间的赋值、内表数据行排序、整体清空等操作。数据行排序语法介绍SORT itabASCENDING|DESCENDINGBY f1 ASCENDING|DESCENDING fn ASCENDING|DESCENDINGAS TEXTSTABLE(无效)如果不使用BY选项,则根据表关键字对内表进行排序(默认为升序排序)【可选】:该选项指定升序或降序排列,如果不指定,默认为所有字段升序排列。该选项的作用范围是整个语句【可选】: 该选项指定组件字段对数据行进行排序,如果
53、指定多个字段,则系统按照其次序f1、f2对数据条目进行排序。关键字越少,排序效率越高。如果在该选项中指定ASCENDING|DESCENDING选项,则作用范围是该字段,并可能覆盖选项在BY之前的指定【可选】:该选项将影响字符字段的排序方式。如果没有该选项,则系统按字符平台相关内部编码进行排序:反之系统根据当前语言按字母顺序排序字符字段。例:指定升序与降序按降序对标准表进行排序并打印排序结果,代码如下:SKIP.WRITE:=,/.SORTitabDESCENDING.IFsy-subrc=0.WRITE:标准表:降序排列.LOOPATitabINTOwa.WRITE:/,wa-name,wa
54、-number,sy-tabix.ENDLOOP.ELSE.WRITE:/,sy-subrc.ENDIF.将代码与内表定义部分连接,执行程序,结果如下图所示:默认按关键字进行降序排序C、A例:指定BY选项为标准表添加一行新数据 D FOUR,按字段number进行降序排序,代码如下:wa-name=D.wa-number=FOUR.ULINE.WRITE:标准表:排序前.APPENDwaTOitab.LOOPATitabINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.SKIP.WRITE:=,/.SORTitabASCENDINGBYnumb
55、er.IFsy-subrc=0.WRITE:标准表:排序后.LOOPATitabINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.ELSE.WRITE:/,sy-subrc.ENDIF.将代码与内表定义部分连接起来,执行程序,结果如下:相似的,也可以在BY number后指定ASCENDING|DESCENDING关键字,此时降序与升序只影响该字段,而在BY之前指定ASCENDING|DESCENDING选项的话,则BY后的字段都受影响,但是如果BY后面的字段也附加ASCENDING|DESCENDING选项的话,可能覆盖选项在BY之前的指定。
56、将排序语句修改为SORTitabASCENDINGBYnumberDESCENDING. 升序排列 降序排序执行结果为:虽然BY之前指定了升序排序,但nunber之后的指定会覆盖前面的指定,实际则是按降序排序的。例:指定AS TEXT选项给标准表添加一行新数据b TWO,按name进行升序排序,代码如下:wa-name=b.wa-number=TWO.ULINE.WRITE:标准表:排序前.APPENDwaTOitab.LOOPATitabINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.SKIP.WRITE:=,/.SORTitabASCEN
57、DINGBYname.IFsy-subrc=0.WRITE:标准表:排序后.LOOPATitabINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.ELSE.WRITE:/,sy-subrc.ENDIF.将代码与内表定义部分连接起来,执行结果如下:在字母编码中,小写字母是在大写字母之后的,因此b是按在C后面的,但如果指定选项AS TEXT,将排序语句修改为SORTitabASCENDINGBYnameASTEXT.则执行结果如下:由结果可以看出,当指定选项AS TEXT后,排序时是按字母顺序排的,不按内部编码顺序。初始化内表 初始化内表的作用是清
58、空内表所有的数据行,将内表恢复到填充或赋值之前的状态。初始化内表过程中需要注意之处仍然是初始化无表头行内表和有表头行内表的区别,以及初始化内表和表头行的区别。CLEAR语句CLEAR itab.该语句将内表重置为填充前的状态,这意味着该内表将不包含任何行。然而如果内表有表头行,会同时清空内表数据行和表头行的内容。如果希望只初始化内表本身,保留表头行的内容,应该使用如下形式:CLEAR itab.因为在实际应用中,带表头的内表很容易与表头混淆,一般要求定义工作区,不使用表头,初始化标准表,代码如下:SKIP.WRITE:=,/.CLEARitab.IFsy-subrc=0.WRITE:标准表:初
59、始化后.LOOPATitabINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.ELSE.WRITE:/,sy-subrc.ENDIF.将代码与数据定义部分连接起来,执行结果如下:数据被清空了。注:在BAPI(FM)中,处理TABLES参数时,如果使用CLEAR对TABLES参数进行初始化,只能清空其表头内容,并没有对整个表进行初始化,这个操作是与本地的内表完成不一样的,要格外注意,所以要初始化这样的内表要加。REFRESH语句REFRESH语句只初始化内表本身,不会将表头行中的内容清空,从结果上看,REFRESH itab相当于CLEAR it
60、ab.初始化排序表,代码如下:SKIP.WRITE:=,/.REFRESHitab_s.IFsy-subrc=0.WRITE:排序表:初始化后.LOOPATitab_sINTOwa.WRITE:/,wa-name,wa-number,sy-tabix.ENDLOOP.ELSE.WRITE:/,sy-subrc.ENDIF.将代码与内表定义部分连接起来,执行结果如下:FREE语句使用REFRESH或CLEAR初始化内表后,系统仍保持在内存中为内表预留的空间,或以用FREE语句释放该内存,语法如下:FREE itab.使用FREE语句可以重置内表并同时释放其内存,而不必先使用REFRESH或CLE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 石河子大学《运动生理学》2021-2022学年第一学期期末试卷
- million的用法和搭配
- 石河子大学《田径教学训练理论与实践》2021-2022学年第一学期期末试卷
- 石河子大学《葡萄酒工艺学》2022-2023学年第一学期期末试卷
- 石河子大学《果蔬加工贮运学》2022-2023学年第一学期期末试卷
- 石河子大学《村镇规划》2023-2024学年第一学期期末试卷
- 沈阳理工大学《永磁电机》2023-2024学年期末试卷
- 沈阳理工大学《体育》2023-2024学年第一学期期末试卷
- 沈阳理工大学《内部控制》2023-2024学年期末试卷
- 沈阳理工大学《机械制造技术基础》2022-2023学年第一学期期末试卷
- 体育室内课《篮球ppt课件》
- 安装培训方案
- 2023边缘物联代理技术要求
- 航空航天类专业大学生职业生涯规划书
- 餐厅小票打印模板
- 腹胀护理课件
- 水稻栽培技术-水稻常规栽培技术
- 常见营养相关慢性疾病的营养指导
- 标准报价单模板(二)
- 《mc入门教程》课件
- 物理化学实验B智慧树知到课后章节答案2023年下北京科技大学
评论
0/150
提交评论