内表的种类:
1. 标准表(STANDARDTABLE).系统为该表的每一行数据生成一行数据生成一个逻辑索引.填充标准表时,可以将数据附加在现有行之后,也可以插入到指定的位置,程序对内表行的寻址操作可通过关键字或索引进行.在对表进行插入,删除等操作时,各数据行在内在中的位置不变,系统仅重新排列各数据行的索引值.
2. 排序表(SORTEDTABLE).与标准表相同,也具有一个逻辑索引,但其按关键字升序排序后再进行存储,其访问方式与标准表相同.
3. 哈希表(HASHEDTABLE).没有索引,只能通过关键字来访问.系统用哈希算法管理表中的数据,因而其寻址一个数据行的时间与表的行数无关.
1. 工作区.程序对内表的操作不能直接进行,必须通过一种接口来传输,这个接口就是工作区(WorkArea).如果程序需要从关系数据库中撮数据到内表各行中,必须先将数据读入工作区,然后把工作区中的数据赋给内表的行.工作区必须具有和内表的行一致或者可相互转换的数据结构.
2. 表行头.在创建内表对象的同时可以隐式地定义一个同名工作区.创建了带表头的内表之后,可以认为程序中存在两个数据对象,一个是内表,另一个与内表结构相同的结构体.如果一个语句中,该名称同时代表内表或同名表的工作区,则需要在内表名称之后加“[]”。
3. 插入行.(INSERT语句)语法: INSERT line INTO itab INDEXidx.”通过索引插入单行. INSERT [line INTO|INITIAL LINE INTO] TABLEitab.”一般性插入语句.对于标准表,不指定索引值,附加至表最后一行,与APPEND语句效果完全一致.对于排序表,插入的行不可以打乱按照关键字排序的顺序,否则插入不成功.对于哈希表,插入过程中系统按照关键字对行进行定位.INSERTwa_company INTO TABLE itab_company.”将一个内表中的所有行插入到另一个内表中.
4. 附加行.(APPEND语句)附加行是在一个已经存在的索引表中使用APPEND语句增添新行.可以对单行或多行进行操作.语法:APPEND [lineTO|INITIAL LINE TO ]itab.”单行APPEND LINES OF Itab1 [FROM n1][TO n2]TO itab2.”多行.
5. 聚集附加.(COLLECT语句)COLLECT line INTOitab.要求:内表必需为扁平结构,行要与工作区兼容,而且除关键字以外的字段必须为数字类型.
6. 读取一行.(READ语句)READ TABLE itab [INTO wa| ASSIGNING<fa>] INDEXidx.读取的结果可以是结构与行类型兼容的工作区或字段符号<fs>.如果读取成功,则SY-TABIX返回该行的索引.一般在访问目标工作区之前,要先用SY-SUBRC字段查看一下读取成功与否.READTABLE itab FROM key [INTO wa|ASSIGNING<fs>].目标数据结构中的关键字段必须已经被预赋值,内表中相同关键字的首个数据行中的其他字段将被读入目标区域中.READTABLE itab WITH TABLE KEY k1 = f1 …ki = fi [INTO wa |ASSIGNING<fs>].指定表中的所有表关键字段的值,目标结构在操作前可以为任何值,内表数据行整体读入目标区域.READTABLE itab WITH KEY k1 = f1 …ki = fi [INTO wa|ASSIGNING<fs>].KEY列表可以为任意字段,不一定是表关键字.
7. 修改一行.(MODIFY语句)MODIFY itab [FROM wa] [INDEX idx][TRANSPORTINGf1,f2…].使用FROM选项指定的工作区域wa代替itab中索引为idx的现有行,一般需要指定INDEX选项.MODIFYTABLE itab FROM wa [TRANSPORTINGf1,f2…].工作区域wa在语句操作过程中起到双重作用,其一是根据其关键字段的值来确定需要替换的内表的行;其二是根据其他非关键字段的值来替换内表行中相应字段的数据.如果只希望更新部分字段的值,可以使用TRANSPORTING选项.MODIFYitab FROM wa TRANSPORTING f1,f2…WHERE cond.使用WHERE选项修改多行.
8. 删除一行.DELETE语句.DELETE itab INDEXidx.如果删除成功,则所有行的索引数减一,SY-SUBRC值为0,如果不存在索引行为idx,则SY-SUBRC返回4.DELETETABLE itab FROM wa.DELETE TABLE itab WITH KEY k1 = f1…ki =fi.DELETE TABLE [FROM n1 ][TO n2][WHERE<condition>].
9. 循环处理.LOOP AT itab <result> [FROMn1][TO n2] [WHERE<condition>]. <statement block>.ENDLOOP.
10. 初始化内表.
CLEARitab.该语句将内表重置为填充前的状态,该表将不包含任何行.如果内表有表头行,会同时清空内表数据行和表头行的内容.
CLEAR itab[].只希望初始化内表本身,保留表头行的内容.REFRESHitab.如果内表有表头行,该语句确保只初始化内表本身.FREE itab.使用CLEAR或REFRESH初始化内表后,系统仍保持在内在中为内表预留的空间.该语句可以重置内表并同时释放其内存,而不必先使用REFRESH或CLEAR语句.…itabIS INITIAL…
11. 整体复制内表.如果想将内表的全部内容复制到另一个内表中,可以进行整体赋值操作,使用MOVE或”=”.MOVE itab1 TOitab2.Itab1 = itab2.
12. 比较内表大小.内表可用作逻辑表达式的操作数进行比较.…itab1<operator>itab2…其中<operator>可以为操作符EQ,=,NE,<>,><,GE,>=,LE,<=,GT,>,LT,<等. 业务表的操作.