ABAP 使用 INDICATORS 更新指定列

作者:ABAP三叔 约 4 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, Basis, Data Engineering, SD, 开发, 数据工程, 系统管理, 销售分销
ABAP 使用 INDICATORS 更新指定列 - 封面图
ABAP 使用 INDICATORS 更新指定列 - 封面图

前言

在ABAP中,使用modify或update dbtab from table @itab语句更新表数据的时候,需要先select *

查询出原有的所有数据列,再去更新表。

这就导致有两个问题:

1\. select * 语句如果数据量特别大,列数很多的时候,对数据库IO性能有较大影响;

2\. 如果不用select *,更新表的时候,如果某些列没有赋值,就会导致原表中的该列数据丢失。

从ABAP7.55版本起,推出了 I NDICATORS关键字,可以指定需要更新的列名。

代码示例一

TYPES wa TYPE sflight WITH INDICATORS ind TYPE abap_bool.DATA itab TYPE TABLE OF wa WITH EMPTY KEY.

SELECT carrid,connid,fldate,price FROM sflight WHERE carrid = 'LH' AND connid = '0400' INTO CORRESPONDING FIELDS OF TABLE @itab. IF sy-subrc = 0. LOOP AT itab ASSIGNING FIELD-SYMBOL(<wa>). <wa>-price *= '0.8'. <wa>-ind-price = abap_true. ENDLOOP.

UPDATE sflight FROM TABLE @itab INDICATORS SET STRUCTURE ind.

ENDIF.

程序执行前:

ABAP 使用 INDICATORS 更新指定列 - 封面图
ABAP 使用 INDICATORS 更新指定列 - 封面图

2\. 程序执行时

ITAB值

ABAP 使用 INDICATORS 更新指定列 - 封面图
ABAP 使用 INDICATORS 更新指定列 - 封面图

IND结构中值的类 型为C(1),赋值'X'的列需要更新

ABAP 使用 INDICATORS 更新指定列 - 封面图
ABAP 使用 INDICATORS 更新指定列 - 封面图

3.更新后结果

ABAP 使用 INDICATORS 更新指定列 - 封面图
ABAP 使用 INDICATORS 更新指定列 - 封面图

代码示例二

TYPES wa TYPE sflight WITH INDICATORS ind.DATA itab TYPE TABLE OF wa WITH EMPTY KEY.

SELECT carrid,connid,fldate,price FROM sflight WHERE carrid = 'LH' AND connid = '0400' INTO CORRESPONDING FIELDS OF TABLE @itab. IF sy-subrc = 0. LOOP AT itab ASSIGNING FIELD-SYMBOL(<wa>). <wa>-price *= '0.8'. <wa>-ind-price = '01'. ENDLOOP.

UPDATE sflight FROM TABLE @itab INDICATORS SET STRUCTURE ind.

ENDIF.

只有两 处不一样:

1\. TYPES wa TYPE sflight WITH INDICATORS ind TYPE abap_bool ,删除了后面的类型;

2\. <wa>-ind-price = abap_tru e.改为 <wa>-ind-price = '01' .

ABAP 使用 INDICATORS 更新指定列 - 封面图
ABAP 使用 INDICATORS 更新指定列 - 封面图

IND结构中值的类 型默认的是1位的十六进制,赋值'01'的列需要更新

总结

1\. INDICATORS只能用在UPDATE语句中,不能用在MODIFY语句

2\. itab内表中的列需要包含表的主键和待更新的列,并且需按主键去重,否则会更新失败

3\. 需要将 INDICATORS中需要更新的列名打上标记,默认需赋值'01',如果指定了C(1)类型,需赋值为'X'。

ABAP三叔

关于作者:ABAP三叔

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「ABAP使用INDICATORS更新指定列.md」整理生成,仅用于内部技术分享与学习交流。