接上文,继续通过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
。
得到航班重复的错误消息。
总结
打完收工。