ABAP SQL更新DB小技巧 WITH INDICATORS

在使用HTTP服务时我们更新数据时经常会使用到PUT或者PATCH,PUT的更新是完全以传入的字段信息为准,没有记录时进行创建,存在记录时完全依据传入的数据进行覆盖更新,而PATCH则是可以仅更新指定字段,而不影响其他字段,那在ABAP SQL中其实也有同样的功能,只是大多数时候都是为了方便直接使用了MODIFY语法进行更新(等同于PUT),这就要求如果是要更新记录时,你需要先获取目标数据的完整字段值信息,将你想更改的字段的值修改后,再次更新,那在ABAP Release 758之后,是可以使用WITH INDICATORS来达到PATCH更新的效果的,下面用一个简单的例子来说明下这个小技巧。


创建一张测试表:

TYPES定义更新结构:

复制代码
TYPES:
  ty_dn_ind TYPE ztest_upd_ind WITH INDICATORS ind,
  tt_dn_ind TYPE SORTED TABLE OF ty_dn_ind WITH UNIQUE KEY id.

此处使用WITH INDICATORS关键字定义了一个更新结构,为了方便起见,直接debug看一下定义出来的结构就一眼明白这样定义的效果:

ind 用来指定定义的结构名称,而这个结构的字段和定义的字段完全一致,只是默认类型是X类型,该结构的用处是在更新数据库表格时,起到一个控制的作用,只有当ind 结构中对应的字段设置为01时,才会更新此字段,否则不进行任何更新,这个作用类似于BAPI中的X结构,熟悉RAP开发的顾问应该也已经联想到了,等同于EML语法更新BO时的%control结构。

实际使用例子:

复制代码
*&---------------------------------------------------------------------*
REPORT ztest_update_db_with_ind.

TYPES:
  ty_db_ind TYPE ztest_upd_ind WITH INDICATORS ind,
  tt_db_ind TYPE SORTED TABLE OF ty_db_ind WITH UNIQUE KEY id.

DATA:
  lt_ins TYPE tt_db_ind,
  ls_ind TYPE ty_db_ind,
  lt_upd TYPE tt_db_ind,
  is_ind TYPE ty_db_ind.

DELETE FROM ztest_upd_ind.

lt_ins = VALUE #( ( id = '1' field1 = 'test1' field2 = 'test2' field3 = 'test3' ) ).

INSERT ztest_upd_ind FROM TABLE @lt_ins.

COMMIT WORK AND WAIT.
BREAK-POINT.

lt_upd = VALUE #( ( id = '1' field1 = 'test1->change' ind-field1 = '01' ) ).

UPDATE ztest_upd_ind FROM TABLE @lt_upd INDICATORS SET STRUCTURE ind.

COMMIT WORK AND WAIT.
BREAK-POINT.

以上代码第一步,先清空测试表,然后插入一条测试数据:

然后构建更新内表,在设置主键之后,我们仅更新FIELD1字段,并且为FIELD1的控制字段设置为01,可以看到在更新之后,底表中仅FIELD1字段进行了变更,其他字段不受影响。

当然这个控制结构的类型可以使用关键字TYPE 自行执行,比如WITH INDICATORS ind TYPE abap_boolean,这样一来控制结构的类型就不再是00 或者01 来控制,而是abap_true 和abap_false来控制,但是建议还是使用默认的类型,这样一来在RAP有些场景需要动态处理时,可以快速的进行mapping。

以上。

相关推荐
这个DBA有点耶3 分钟前
主库秒级,从库延迟2小时:深挖Online DDL回放的MDL阻塞与算法降级机制
数据库·sql·dba
郭小李6 分钟前
mybatis 动态 sql
java·sql·mybatis
xcLeigh17 分钟前
KingbaseES数据库教程:初识数据库,从安装到跑通第一条SQL
android·数据库·sql·安装·数据库教程·kes
ClouGence2 小时前
开源数据库管理工具 CloudDM 发布新版本,支持团队多级审批工单,无需依赖第三方系统
数据库·sql·开源
是真的小外套3 小时前
网络安全实战第15期:SQL注入根源之一条拼接语句的警示
sql·安全·web安全
freejackman5 小时前
【架构篇】双遍历 + 多栈协同:手撸 SQL 血缘引擎的架构思考
java·大数据·数据库·hive·sql·架构·spark
陈年老古董7 小时前
Spark 3.1.3 集群搭建 + Spark-SQL 整合 Hive 记录
hive·sql·spark
念何架构之路7 小时前
Go 标准库 database/sql 详解
数据库·sql·golang
Decay__20 小时前
09_MySQL 闪回与时间点恢复 —— binlog 回放、mysqlbinlog、PITR 与误删恢复
运维·数据库·sql·mysql·架构
梦影_1 天前
MySQL进阶教程(五)—— SQL调优(下)
android·大数据·数据库·后端·sql·mysql·database