接上文,继续通过API创建数据。

可以看到,完全相同的两条数据被保存成功了。业务上,数据要保证唯一性,避免数据重复。为了保证数据唯一性,在添加数据时要验证数据是否已存在,通常验证数据的业务主键。
一、添加Validation
1.定义消息
File->New->Other。

搜message,选择Message Class。

定义Message Class内容。

Message主要包括两部分,Number是消息代码,Short Text是消息内容。内容不仅可以是静态字符串,还支持变量。使用&+数字作为占位符,最多支持4个占位符。如消息000,表示消息里含有两个变量。
2.声明
在Behavior Definitions中,找到ZR_XXX,添加声明,这里是CheckSemanticKey,在create和update时触发。

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获取业务主键,此处为carrierid和connectionid,存在connections表中。

4.3.check_result

循环新建数据的业务主键,主表和临时表中查询,并把结果存在check_result中。
4.4.消息

通过调用new_message方法,id为Message Class的类名,number为消息代码,severity是消息类型,v1和v2是占位符的值。
二、测试
再次添加业务主键相同的数据,Airline ID=123,Flight Number=123。

得到航班重复的错误消息。

总结
打完收工。
本文介绍了在ABAP开发中如何通过Validation机制确保数据唯一性,包括定义MessageClass、在BehaviorDefinitions中声明CheckSemanticKey、实现检查逻辑以及测试过程。重点展示了如何通过查询数据库来验证新数据的唯一性,以防止重复数据的插入。
837

被折叠的 条评论
为什么被折叠?



