前言
在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.程序执行前:
2\. 程序执行时
ITAB值
IND结构中值的类 型为C(1),赋值'X'的列需要更新
代码示例二
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' .
IND结构中值的类 型默认的是1位的十六进制,赋值'01'的列需要更新
总结
1\. INDICATORS只能用在UPDATE语句中,不能用在MODIFY语句
2\. itab内表中的列需要包含表的主键和待更新的列,并且需按主键去重,否则会更新失败
3\. 需要将 INDICATORS中需要更新的列名打上标记,默认需赋值'01',如果指定了C(1)类型,需赋值为'X'。