SAP 内表操作及其使用技巧
内表定义
在定义内表时,建议先定义对应的类型,再定义内表。
TYPES: BEGIN OF ty_company,
bukrs TYPE t001t-bukrs, “公司代码
txtna TYPE t001t-txtna, “公司代码描述
END OF ty_company.
DATA: it_company TYPE STANDARD TABLE OF ty_company,
wa_company TYPE ty_company.
注意:请避免使用带表头的内表,SAP将会废弃此荐功能,目前在面向对象编程中不支持带表头的内表。
内表使用
修改内表中的字段值
- 使用
MODIFY it_tab TRANSPORTING field ... WHERE <condition>
该方法将可加快修改内表记录集的速度。特别是在内表行中有嵌套内表时,该写法将可明显增加速度
- 通过
LOOP
处理来修改所有的组件
内表的大量修改必须通过在 LOOP
循环中来实现
把一个内表附加到另一个内表后面
例:
说明:内表 gt_tab01
和内表 gt_tab02
有相同的行结构且包含一定的记录集。
错误写法,通过 LOOP
循环实现内表的附加 :
LOOP AT it_tab01 INTO wa_tab.
APPEND wa_tab TO it_tab02.
ENDLOOP.
正确写法, 通过 APPEND LINES OF
语句批量附加内表:
APPEND LINES OF it_tab01 TO it_tab02.
删除内表中重复行
先对一个内表按删除时比较的字段进行排序,再通过以下语句删除重复行。
DELETE ADJACENT DUPLICATES FROM it_tab COMPARING field...
根据条件删除内表中的行
错误写法,通过 LOOP
循环进行删除:
LOOP AT it_tab INTO wa_tab.
IF wa_tab-filed = value.
DELETE it_tab INDEX sy-tabix.
ENDIF.
ENDLOOP.
正确写法,通过 WHERE
语句进行删除
DELETE it_tab WHERE filed = value.
内表是否为空的判断
错误写法:
DESCRIBE TABLE it_tab LINES l_lines. " 先计算内表的行数
IF l_lines = 0.
* 内表为空
ENDIF.
正确写法:
IF it_tab[ ] IS INITIAL.
* 内表为空
ENDIF.
读取内表行
- 关键字读取
READ TABLE it_tab INTO wa_tab WITH KEY field = value.
- 关键字二分搜索读取
READ TABLE it_tab INTO wa_tab WITH KEY field = value BINARY SEARCH.
- 索引读取
READ TABLE it_tab INTO wa_tab WITH KEY field = value INDEX l_index.
注意:在使用二分搜索读取内表时,要先按关键字对内表进行排序
性能比较:
类型 | 性能比较 |
---|---|
索引读取 | 最快 |
关键字二分搜索读取 | 较快 |
关键字读取 | 慢 |
使用原则:
当可以通过指定索引读取内表时,用指定索引读取
如若不能,则通过二分搜索进行读取
例:
不建议写法,通过内表关键字来连接两个表:
LOOP AT it_tab01 INTO wa_tab01.
READ TABLE it_tab02 INTO wa_tab02 WITH KEY field = wa_tab01-field.
CHECK sy-subrc = 0.
ENDLOOP.
建议写法 ,通过使用关键字二分搜索来连接两个表,但要对内表 gt_tab02 先按字段field进行排序:
SORT it_tab02 BY field.
LOOP AT it_tab01 INTO wa_tab01.
READ TABLE it_tab02 INTO wa_tab02 WITH KEY field = wa_tab01-field BINARY SEARCH.
CHECK sy-subrc = 0.
ENDLOOP.
通过平行光标来连接两个内表
方法一,要先对内表 it_tab01
和 it_tab02
按字段 field
进行排序。当两个内表条目数很大时,如上十万、百万,使用此种方法将会极大的增加程序性能:
建议写法:
SORT it_tab01 BY field.
SORT it_tab02 BY field.
l_index = 1.
LOOP AT it_tab01 INTO wa_tab01.
READ TABLE it_tab02 INTO wa_tab02 INDEX l_index.
CHECK sy-subrc = 0.
IF wa_tab02-field = wa_tab01-field.
l_index = l_index + 1.
ENDIF.
ENDLOOP.
方法二,通过 loop
循环中的 where
条件来进行连接,当内表条目数很大时,速度将会很慢,因为第二个 loop
循环相当于在全表扫描的查找内表 it_tab02
:
不建议写法:
SORT it_tab01 BY field.
SORT it_tab02 BY field.
LOOP AT it_tab01 INTO wa_tab01.
LOOP AT it_tab02 INTO wa_tab02 WHERE field = wa_tab01-field.
….
ENDLOOP.
ENDLOOP.
建议写法:
SORT it_tab01 BY field.
SORT it_tab02 BY field.
LOOP AT it_tab01 INTO wa_tab01.
CLEAR l_tabix.
READ TABLE it_tab02 INTO wa_tab02 WITH KEY field = wa_tab-field BINARY SEARCH.
CHECK sy-subrc = 0.
l_tabix = sy-tabix.
LOOP AT it_tab02 FROM l_tabix.
IF wa_tab02-field <> wa_tab01-field.
EXIT.
ENDIF.
ENDLOOP.
ENDLOOP.
- 这种方式通过使用关键字二分搜索来连接两个表,二分搜索提高了读取的性能。
- 通过在
Loop
循环中指定起始索引,减少了对内表的全表扫描 - 要先对内表
it_tab02
先按字段field
进行排序 |
内表字段值汇总
当将内表某数值型字段进行汇总时,应注意溢出情况。
不建议写法,当内表数据量较大,汇总值超过字段范围时,程序会DUMP掉:
LOOP AT it_tab INTO wa_tab.
l_lfimg = l_lfimg + wa_tab-lfimg. " 参考系统字段的情况下
ENDLOOP.
建议写法,及时获取系统所产生的错误,防止溢出:
LOOP AT it_tab INTO wa_tab.
TRY.
l_lfimg = l_lfimg + wa_tab-lfimg.
CATCH CX_SY_ARITHMETIC_OVERFLOW.
l_lfimg = '99999999999999.99'.
ENDTRY.
ENDLOOP.
释放内表
当内表的内容不再有用时,使用 FREE
语句释放,可以减少程序占用系统的内存。
- 点赞
- 收藏
- 关注作者
评论(0)