原文:Small Fire · ABAP 内表使用 · ABAP 子专栏 · Small Fire 技术笔记
内表定义
工作区域
工作区域可以存放多个变量数据,相当于一维数组。
间接定义:通过 Type 定义结构类型,然后通过DATA赋值
TYPES: BEGIN OF str_order.
aufnr TYPE afko-aufnr,
dauat TYPE afpo-dauat,
END OF str_order.
" TYPE定义的只是一个类型,不可以在程序中直接使用,必须用DATA赋值 "
DATA: lt_table TYPE TABLE OF str_order,
ls_table TYPE str_order.
直接定义:直接使用 DATA 声明一个结构对象,可以在后续程序中直接使用该工作区
DATA: BEGIN OF str_matnr,
matnr TYPE matnr,
werks TYPE bukrs,
END OF str_matnr.
参照DB或则结构创建工作区:DATA <wa> TYPE <dbtab>|<str>.
参照内表创建工作区:DATA <wa> LIKE LINE OF <dbtab>.
继承结构:结构复用,作用是将结构类型 structure_type 与结构变量 structure 的所有组件字段拷贝到当前结构定义的指定位置。
INCLUDE { {TYPE struc_type} | {STRUCTURE struc} } [AS name [RENAMING WITH SUFFIX suffix]].结构对象复用
DATA: BEGIN OF gt_result OCCURS 0, endcount TYPE zz_final_count, enddiffs TYPE zz_final_diffs. "直接定义组件字段,但前面语句后面使用逗号" INCLUDE STRUCTURE str_matnr. "直接将结构对象包括进来,也可以是已经定义的结构" INCLUDE TYPE str_order. "直接将结构类型包括进来" DATA:comm LIKE ztest_str. "直接参照" DATA: END OF gt_result.
结构类型复用
TYPES: BEGIN OF str_result, endcount TYPE zz_final_count, enddiffs TYPE zz_final_diffs. "直接定义字段,但是保留前面的逗号" INCLUDE STRUCTURE str_matnr. "直接将结构对象包括进来" INCLUDE TYPE str_order. "直接将结构类型包括进来" TYPES: uname type c, ustatus type c. TYPES: END OF str_pidoc.
内表类型
- 索引内表:标准内表(Standard table)、排序表(Sorted table)
- 标准内表:每一行数据都有关键字和系统生成的逻辑索引。
- 排序表:排序表按照关键字升序排序后再进行存储。
- 哈希表:(Hashed table) 没有索引的表,只能靠关键字进行寻址,用哈希算法管理数据。
内表定义
可以参考结构体、其他内表、透明表等方式定义内表。
参考结构:DATA table_name TYPE TABLE OF structure [WITH HEADER LINE].
参考内表:DATA table_name TYPE TABLE OF 内表或透明表 [WITH HEADER LINE].
- WITH HEADER LINE ,用 itab[] 和 itab 来区分内表和工作区
- 分别定义内表和工作区
- 定义结构时用 OCCUR 0 直接定义
- LIKE LINE OF 后面接一个内表,表示一个 data 参数具有和内表一样的结构,可当做 Work Area 使用
- LIKE TABLE OF 后面接一个结构,表示一个 data 参数是一个内表,这个内表和后面接的结构一样
内表操作
内表清空
CLEAR itab:仅清空工作区,对内表数据存储空间不影响。REFRESH itab:清空内表数据存储空间,对工作区不影响。REFRESH itab FROM TABLE dbtab:清空内表存储空间,填充从数据库表所获数据。FREE itab:清空内表数据存储空间,对工作区不影响。
APPEND(增加,内表赋值)
有 HEADER LINE 的内表,数据被赋给内表 HEADER LINE后再 APPEND 到表中最后一行。
APPEND itab.
对于没有 HEADER LINE 的内表,只能通表外部工作区来传递数据。
APPEND wa TO itab.APPEND LINES OF itab1 [FROM idx1] [TO idx2] TO itab2.
INSERT(向内表插入数据)
INSERT wa INTO TABLE itab.:将结构体中数据新增到内表INSERT wa INTO TABLE itab INDEX index.:将结构体中数据插入到内表指定位置INSERT LINES OF itab1 [FROM idx1] [TO idx2] INTO itab2 [INDEX idx3].:将 itab1 指定范围数据插入到 itab2 中
DELETE(删除数据)
DELETE TABLE itab WITH TABLE KEY k1=v1...kn=vn.:删除单条。多条时只删除第一条,条件为表关键字。DELETE TABLE itab [FROM wa].:删除单条。多条数据时,只删除第一条。条件为所有关键字段,值来自 wa。DELETE itab INDEX idx.:根据索引删除具体行数据。DELETE itab [FROM n1] [TO n2] WHERE cond1 AND cond2 .: 根据条件删除多条数据DELETE itab FROM idx1 TO idx2.:根据索引删除具体行数范围间数据。DELETE ADJACENT DUPLICATES FROM itab [COMPARING f1 f2 | ALL FIELDS].:删除重复数据,仅保留第一条。执行此条件前必须先按照内表关键字声明的顺序进行排序。- 如果指定了COMPARING 选项,则需要根据指定的比较字段顺序进行排序,才能删除所有重复数据
MODIFY:(修改内表数据)
按内表位置或者具体内表字段值相等条件修改内表数据。
MODIFY itab [INDEX idx] FROM wa [TRANSPORTING f1...fn] WHERE condition.
READ:(从内表中读取数据)
READ TABLE itab [INTO wa] FROM wa.:以表关键字为查找条件,条件来自 wa。READ TABLE itab [INTO wa] WITH KEY k1=v1...kn=vn [BINARY SEARCH].- 二分法查找出来的数据是第一条符合条件的数据,必须先按指定的关键字段排序
READ TABLE itab [INTO wa] INDEX index.
LOOP….ENDLOOP:(循环读取内表数据)
循环读取内表数据,在循环中使用系统变量SY-TABIX可获取当前所执行的行数。
LOOP AT ITAB [INTO WA] FROM n1 TO n2.:读取内表具体索引行数之间的数据。LOOP AT ITAB [INTO WA] WHERE cond.:按具体字段条件读取内表。LOOP AT ITAB [ASSIGNING wa ] WHERE cond.:根据查询条件循环内表数据并分配给字段符号。
AT…ENDAT(设置内表循环触发条件)
该语法为事件控制函数,应用于LOOP循环语句中,用于获取内表的数据变化事件。
Loop 的时候不能加条件;AT 和 ENDAT 之间不能使用 loop into 的 working area。
AT NEW field.:当某个字段数据与上一行数据值不同时触发该事件。- 当 field 字段或者 field 字段左边的字段内容发生变化时该事件后面的语句都会执行
- field 必须是内表的第一个字段
- 内表中 field 之后的字段的值都会变成 " * "
AT END OF field.:当内表中某个字段当前行值与下一行值不同时触发该事件。AT FIRST.:当执行内表第一行时触发该事件。AT LAST.:当执行内表最后一行时触发该事件。
COLLECT(内表数据分类汇总)
将内表中相同的字段合并,若有类型为I的字段,则将其值加总。
COLLECT [wa INTO] itab.
DESCRIBE(获取内表具体属性)
DESCRIBE TABLE itab LINES n.:获取内表当前总行数,n 为整型 i。n = lines (itab).
SORT(内表排序操作)
SORT itab ASCENDING|DESCENDING BY field1 field2 field3.- 指示符在 BY 在前面,表示后面的字段都用这个升降序,作用范围是后面 BY 所有的字段
SORT itab BY field1 field2 field3 ASCENDING|DESCENDING.- 指示符在 BY 的后面,则只是对这个指示符前面的字段起作用,其他的字段还是默认的方式排序