二、Internal Table的使用
1 Adding Lines by Key Access 以key access的方式添加数据
如上图所示的几种命令三种内表均适用,但是对于不同类型的内表,技术层面上的操作略有不同:
Standard table: 在内表的最后一行增加一行数据,与APPEND命令相同
Sorted table: 如果是unique key, 新增的记录将被插入在按照key列升序排列相应的位置,如果是non-unique key,如果已经存在相同Key值的行,输将将被插入第一个相同key值的列前面。
Hashed table: 新增的记录被插入内表最后一行(看上去,实际在哪一行对访问内表都无意义),相应的HASH INDEX中也增加一行。
如果内表是unique key定义的话,内表中如果已经存在同样key值的数据,则操作失败,SY-SUBRC返回值为4;当以上语句成功执行之后,即数据被插入内表,SY-TABIX值为插入后数据所在的位置。
COLLECT命令只能用于非key列全是数字类型(I,P,F)的内表。该语句的作用是将工作区的数据累加入内表相同key值的行,或没有的情况下新增一行。需要注意的是,对于non-unique key定义的内表,如果内表中存在多个key值相同的行,则COLLECT命令将只在第一个key值相同的列累加。示例代码如下:
TYPES: BEGIN OF TY_ITAB,
EBELN TYPE EKKO-EBELN,
EBELP TYPE EKPO-EBELP,
MATNR TYPE EKPO-MATNR,
MENGE TYPE EKPO-MENGE,
END OF TY_ITAB.
TYPES: TT_ITAB TYPE TABLE OF TY_ITAB.
DATA: WA_ITAB TYPE TY_ITAB.
DATA: T_ITAB_STANDARD TYPE TT_ITAB. "Default: Standard table
DATA: T_ITAB_SORTED TYPE SORTED TABLE OF TY_ITAB WITH NON-UNIQUE KEY EBELN EBELP MATNR. "Sorted table, NON-UNIQUE KEY
DATA: T_ITAB_HASHED TYPE HASHED TABLE OF TY_ITAB WITH UNIQUE KEY EBELN EBELP MATNR. "Hashed table, UNIQUE KEY
*fill data into working area line
DEFINE DEF_WA_ITAB.
WA_ITAB-EBELN = &1.
WA_ITAB-EBELP = &2.
WA_ITAB-MATNR = &3.
WA_ITAB-MENGE = &4.
END-OF-DEFINITION.
DEF_WA_ITAB ‘4500010001’ ‘00010’ ‘000000000010000000’ ‘100’.
INSERT WA_ITAB INTO TABLE T_ITAB_STANDARD.
INSERT WA_ITAB INTO TABLE T_ITAB_SORTED.
INSERT WA_ITAB INTO TABLE T_ITAB_HASHED.
DEF_WA_ITAB ‘4500010010’ ‘00010’ ‘000000000010000002’ ‘200’.
INSERT WA_ITAB INTO TABLE T_ITAB_STANDARD.
INSERT WA_ITAB INTO TABLE T_ITAB_SORTED.
INSERT WA_ITAB INTO TABLE T_ITAB_HASHED.
DEF_WA_ITAB ‘4500010002’ ‘00010’ ‘000000000010000003’ ‘100’.
INSERT WA_ITAB INTO TABLE T_ITAB_STANDARD. " Just append
INSERT WA_ITAB INTO TABLE T_ITAB_SORTED. " Sorted automatically: sorted table, asending order
INSERT WA_ITAB INTO TABLE T_ITAB_HASHED. " Apears to be append, but an entry of a hash index is made
DEF_WA_ITAB ‘4500010002’ ‘00010’ ‘000000000010000003’ ‘100’. "same record as last one
INSERT WA_ITAB INTO TABLE T_ITAB_STANDARD.
INSERT WA_ITAB INTO TABLE T_ITAB_SORTED. " inserted before the first entry of the same key
INSERT WA_ITAB INTO TABLE T_ITAB_HASHED. " Failed inserting: unique key sy-subrc = 4
DEF_WA_ITAB ‘4500010002’ ‘00010’ ‘000000000010000003’ ‘100’. "NUMBERIC FIELDS ARE COLLECTED ACCORDING KEY FIELDS
COLLECT WA_ITAB INTO T_ITAB_STANDARD. " ONLY TO THE FIRST LINE OF KEY-VALUE-OCCURED
COLLECT WA_ITAB INTO T_ITAB_SORTED. " THE SAME AS ABOVE
COLLECT WA_ITAB INTO T_ITAB_HASHED. " UNIQUE-KEY
DATA: T_ITAB_NAK TYPE SORTED TABLE OF TY_ITAB WITH NON-UNIQUE KEY EBELN EBELP. "NOT ALL CHAR-LIKE FIELDS ARE KEY FIELDS
DEF_WA_ITAB ‘4500010003’ ‘00010’ ‘000000000010000002’ ‘200’.
INSERT WA_ITAB INTO TABLE T_ITAB_NAK.
DEF_WA_ITAB ‘4500010003’ ‘00010’ ‘000000000010000002’ ‘100’.
*COLLECT WA_ITAB INTO T_ITAB_NAK. " IF UNCOMMENTED, SYNATX CHECK
2 Adding Lines by Index Access 以index access的方式添加数据
以上语句均是以index access的方式向内表添加数据,需要注意的是,如果INDEX指定的数值超过内表已有数据行数的范围,则语句执行失败,SY-SUBRC为4,数据也不会插入到内表中。在LOOP…ENDLOOP中间使用INSERT命令,数据将插入到由LOOP命令打开的游标处。INSERT LINES OF 命令用于批量插入数据。需要注意的是,如果使用Index access向 sorted table插入数据,我们必须确保index所指定的位置是按照key列排序相应的位置,否则将会出现runtime error;由于hashed table根本不支持 index access,写下的代码连语法检查也无法通过。因此建议仅对standard table使用index access方式插入数据。
上图中:Ranked list APPEND wa INTO rank_itab SORTED BY f.这个命令我在试验中发现WA中的数据根本不会添加到内表中,有人知道这是怎么用的话请留言,多谢。其它部分示例代码如下:
DEF_WA_ITAB ‘4500010006’ ‘00010’ ‘000000000010000002’ ‘100’.
INSERT WA_ITAB INTO T_ITAB_STANDARD INDEX 2.
*INSERT WA_ITAB INTO T_ITAB_SORTED index 2. " UNCOMMENT, runtime error
*INSERT WA_ITAB INTO T_ITAB_HASHED index 2. " UNCOMMENT, SEE SYNATX CHECK
LOOP AT T_ITAB_STANDARD INTO WA_ITAB.
INSERT INITIAL LINE INTO T_ITAB_STANDARD. " LOOP…ENDLOOP OPEN A CURSOR
ENDLOOP.
* INSERT INITIAL LINE INTO T_ITAB_STANDARD. " WITHOUT A LOOP, RUNTIME ERROR
INSERT INITIAL LINE INTO T_ITAB_STANDARD INDEX 2. " INDEX ACCESS, AN INIT LINE IS INSERTED INTO LINE 2
INSERT INITIAL LINE INTO T_ITAB_SORTED INDEX 1. " IF POSITION IS NOT CORRECT ACCORDING TO SORT CONDITION,
" RUNTIME ERROR, SO RECOMMAND USING ONLY ON STANDARD TABLE
*INSERT INITIAL LINE INTO T_ITAB_HASHED. " UNCOMMENT, SEE SYNATX CHECK
INSERT LINES OF T_ITAB_SORTED FROM 1 TO 4
INTO T_ITAB_STANDARD INDEX 1. "currently 11 records in the internal table, 1~12 IS OK, BEYOND 12, LIKE 13, 14… INSERTING FAILED
3 Changing Content by Key Access 以Key access的方式修改内容
如上图所示的语句中,如果使用FROM wa addition,要求wa中的key field必须有值。如果在内表中根据key值没有找到相符的行,删除、修改都没有执行成功,则SY-SUBRC 为4。TRANSPORTING 关键字用于限定更新选定的字段。WHERE addition中可以填写几乎各种条件表达式,但是要求表达式中关系运算符左边的表达式必须是内表中的字段,可以通过(变量名)的方式动态构造WHERE。
DELETE ADJACENT DUPLICATES… 命令用于删除内表中相邻行重复的数据。重复的定义是相对的,如果不适用COMPARING addition,重复是根据KEY FIELD定义的,如果使用ALL FIELDS则是全部字段,如果使用COMPARING,则根据指定的条件比较。通常使用这个命令时,我们首先对内表排序。
4 Changing Content by Index Access 以Index Access的方式修改内表数据
以上命令可以用于Standard table和Sorted table,不能用于Hashed table.
关于SY-SUBRC, TRANSPORTING, LOOP游标在这里就不再说明了,需要注意的是,LOOP…ENDLOOP中间用DELETE效率较低,对于多行的删除,建议使用DELETE itab FROM N1 TO N2或DELETE WHERE.