ABAP RESTful Application Programming Model(二)

本文介绍了在ABAP开发中如何通过Validation机制确保数据唯一性,包括定义MessageClass、在BehaviorDefinitions中声明CheckSemanticKey、实现检查逻辑以及测试过程。重点展示了如何通过查询数据库来验证新数据的唯一性,以防止重复数据的插入。
摘要由CSDN通过智能技术生成

上文,继续通过API创建数据。
在这里插入图片描述
可以看到,完全相同的两条数据被保存成功了。业务上,数据要保证唯一性,避免数据重复。为了保证数据唯一性,在添加数据时要验证数据是否已存在,通常验证数据的业务主键。

一、添加Validation

1.定义消息

File->New->Other
在这里插入图片描述
message,选择Message Class
在这里插入图片描述
定义Message Class内容。
在这里插入图片描述
Message主要包括两部分,Number是消息代码,Short Text是消息内容。内容不仅可以是静态字符串,还支持变量。使用&+数字作为占位符,最多支持4个占位符。如消息000,表示消息里含有两个变量。

2.声明

Behavior Definitions中,找到ZR_XXX,添加声明,这里是CheckSemanticKey,在createupdate时触发。
在这里插入图片描述

3.实现

添加CheckSemanticKey之后,会有警告,点击警告,Quick Fix,会自动在ZBP_R_XXX文件中生成实现方法。
在这里插入图片描述
在方法中添加如下代码。

DATA read_keys TYPE TABLE FOR READ IMPORT zr_kdlaconn.
DATA connections TYPE TABLE FOR READ RESULT zr_kdlaconn.

read_keys = CORRESPONDING #( keys ).

READ ENTITIES OF zr_kdlaconn IN LOCAL MODE
    ENTITY Connection
    FIELDS ( uuid carrierid connectionid )
        WITH read_keys
        RESULT connections.

LOOP AT connections INTO DATA(connection).
  SELECT FROM zkdlaconn
      FIELDS uuid
      WHERE carrier_id = @connection-CarrierID
      AND connection_id = @connection-ConnectionID
      AND uuid <> @connection-uuid
  UNION
  SELECT FROM zkdlaconn_d
      FIELDS uuid
      WHERE carrierid = @connection-carrierid
      AND connectionid = @connection-ConnectionID
      AND uuid <> @connection-uuid
  INTO TABLE @DATA(check_result).

  IF check_result IS NOT INITIAL.
    DATA(message) = me->new_message(
        id = 'ZCL_KDLK_MSG'
        number = '000'
        severity = ms-error
        v1 = connection-CarrierID
        v2 = connection-ConnectionID
    ).

    DATA reported_record LIKE LINE OF reported-connection.
    reported_record-%tky = connection-%tky.
    reported_record-%msg = message.
    reported_record-%element-carrierid = if_abap_behv=>mk-on.
    reported_record-%element-connectionid = if_abap_behv=>mk-on.
    APPEND reported_record TO reported-connection.

    DATA failed_reocrd LIKE LINE OF failed-connection.
    failed_reocrd-%tky = connection-%tky.
    APPEND failed_reocrd TO failed-connection.
  ENDIF.
ENDLOOP.

4.核心逻辑

4.1.read_keys

read_keys = CORRESPONDING #( keys ).

read_keys获取新建数据的表主键,这里是UUID。
在这里插入图片描述
在这里插入图片描述

4.2.connections

READ ENTITIES OF zr_kdlaconn IN LOCAL MODE
    ENTITY Connection
    FIELDS ( uuid carrierid connectionid )
        WITH read_keys
        RESULT connections.

根据read_keys获取业务主键,此处为carrieridconnectionid,存在connections表中。
在这里插入图片描述

4.3.check_result

在这里插入图片描述
循环新建数据的业务主键,主表和临时表中查询,并把结果存在check_result中。

4.4.消息

在这里插入图片描述
通过调用new_message方法,idMessage Class的类名,number为消息代码,severity是消息类型,v1v2是占位符的值。

二、测试

再次添加业务主键相同的数据,Airline ID=123Flight Number=123
在这里插入图片描述
得到航班重复的错误消息。
在这里插入图片描述


总结

打完收工。

  • 46
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值