ABAP 7.4及以上版本高效更新内表GT_KUNNR的方法
ABAP 7.4+ 高效更新内表数据方案
需求背景
现有两个内表:
- GT_KUNNR:结构包含
KUNNR、TEXT字段,数据如下:
| KUNNR | TEXT |
|---|---|
| 123 | demo text |
| 456 | test inv |
- GT_TEXT:结构包含
KUNNR、TEXT、EXPIRED字段,数据如下:
| KUNNR | TEXT | EXPIRED |
|---|---|---|
| 123 | welcome | X |
传统实现代码(循环+二分查找):
LOOP AT GT_KUNNR ASSIGNING FIELD-SYMBOL(<lfs_kunnr>). READ TABLE GT_TEXT ASSIGNING FIELD-SYMBOL(<lfs_text>) WITH KEY kunnr = <lfs_kunnr>-kunnr BINARY SEARCH. IF sy-subrc EQ 0. <lfs_kunnr>-text = <lfs_text>-text. ENDIF. ENDLOOP.
要求在ABAP 7.4及以上版本实现相同逻辑,且因GT_KUNNR数据量庞大,需规避构造表达式(VALUE、FOR、REDUCE等)创建新内表带来的性能瓶颈,寻求高效实现方式。
高效实现方案
方案1:哈希表+直接循环更新
利用哈希表O(1)的查找性能替代二分查找,直接修改原内表的字段符号,完全避免创建新内表:
" 一次性将GT_TEXT转换为哈希表,仅需执行一次 DATA(gt_text_hash) = VALUE HASHED TABLE( FOR <text> IN GT_TEXT ( KEY kunnr = <text>-kunnr COMPONENTS kunnr = <text>-kunnr text = <text>-text ) ). " 循环原内表直接更新数据 LOOP AT GT_KUNNR ASSIGNING FIELD-SYMBOL(<lfs_kunnr>). IF DATA(<update_line>) = gt_text_hash[ kunnr = <lfs_kunnr>-kunnr ]. <lfs_kunnr>-text = <update_line>-text. ENDIF. ENDLOOP.
方案2:批量MODIFY更新
提取GT_TEXT的更新键值对后,用MODIFY批量更新原内表,同样不产生新内表开销:
" 提取GT_TEXT中需要更新的KUNNR和TEXT到辅助哈希表 DATA(gt_update_map) = VALUE HASHED TABLE( FOR <text> IN GT_TEXT ( KEY kunnr = <text>-kunnr COMPONENTS kunnr = <text>-kunnr text = <text>-text ) ). " 批量修改原内表,仅更新匹配到的行 MODIFY GT_KUNNR FROM TABLE gt_update_map TRANSPORTING text WHERE kunnr = gt_update_map-kunnr.
核心优化说明
- 哈希表替代二分查找:哈希表查找时间复杂度为O(1),数据量越大,对比二分查找的性能提升越显著
- 直接操作原内表:所有方案均通过字段符号或
MODIFY直接更新GT_KUNNR,彻底规避构造表达式创建新内表带来的内存占用和性能损耗 - 预处理复用:仅做一次哈希表转换,避免循环内重复执行高成本操作
内容的提问来源于stack exchange,提问作者CoderW
相关产品推荐
相关产品推荐

