SAP 内表操作及其使用技巧

举报
雨绸缪 发表于 2023/07/31 17:09:08 2023/07/31
【摘要】 内表定义在定义内表时,建议先定义对应的类型,再定义内表。 TYPES: BEGIN OF ty_company, bukrs TYPE t001t-bukrs, “公司代码 txtna TYPE t001t-txtna, “公司代码描述 END OF ty_company. DATA: it_company TYPE...

内表定义

在定义内表时,建议先定义对应的类型,再定义内表。

  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将会废弃此荐功能,目前在面向对象编程中不支持带表头的内表。

内表使用

修改内表中的字段值

  1. 使用 MODIFY it_tab TRANSPORTING field ... WHERE <condition>

该方法将可加快修改内表记录集的速度。特别是在内表行中有嵌套内表时,该写法将可明显增加速度

  1. 通过 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_tab01it_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 语句释放,可以减少程序占用系统的内存。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。