原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)
一
前言
SE16N 是ECC/S4中查看表内容的一个工具,方便实用. 前面写了一系列关于优化SE16N的文章.
详见链接
https://mp.weixin.qq.com/mp/homepage?__biz=Mzg4MjA1MjE4NQ==&hid=29&sn=6ea0f2777b31f2b633c2bcb74940ff4e
最近根据业务需求添加了一个优化点
**本文主要介绍SE16N基于业务字段(非表主键)的重复性检查**
二
标准主键检查
表的主键不能肯定不能重复, 因此标准SE16N有主键检查.
如果尝试维护重复主键的信息,系统会报错. 这个错误信息不太友好,
如果同时维护了多条数据, 系统笼统的报错: 已存在有规定键的一个数据记录. 没有定位到具体报错的主键信息.
三
业务需求
业务可能需要用SE16N维护表内容时,针对非主键的字段执行重复检查.
比如维护内部公司代码和外部公司代码对应关系表时,表的主键是内部公司代码. 但是需要外部公司代码也不能重复.重复了会影响通过外部公司代码读取内部公司代码逻辑.
四
需求实现
之前有一篇介绍SE16N优化的文章,涉及到了基于配置的数据检查.
> 详见链接 无峰,公众号:ABAP 技巧与实战 [ SAP小技巧之 改造SE16N(五)
> ](https://mp.weixin.qq.com/s?__biz=Mzg4MjA1MjE4NQ==&mid=2247485340&idx=1&sn=76031e8ad8841af477b785d2dc6ab7c6&chksm=cf5ddaaaf82a53bc032358b180b079fc6fcea060be2d6374cd6583b6b9c0fb08d296571510d6&token=1198815933&lang=zh_CN#rd)
在此基础上, 补充一个配置 数据重复检验
其中
DUPLICATE_CHECK 数据重复校验方式
• 空 不检查
• A业务关键字非空才检查
• B业务关键字为空也检查
DUPLICATE_CHECK_KEY 数据重复校验关键字(非主键的数据重复校验,非空触发,维护数据重复校验的关键字,允许多个关键字,通过逗号分割)
五
实现效果
先配置特定表的非主键重复性检查.
修改或新增行,如果指定字段重复. 保存时弹窗报错,阻止数据的保存,除非报错问题被修复.
SE16N中不管重复的数据是否被选择出来显示, 重复性检查都能够成功.
六
代码逻辑
在SE16N的保存过程中.增强检查
基于配置调用函数检查数据重复
函数中使用动态语法获取当前表配置的重复检查字段,并且检查是否存在选择条件. 如果存在选择条件, 则需要获取这些关键字内容被选择条件过滤掉的其他数据,
一起来实现重复性检查.
实际逻辑中还考虑了一些细节.比如,如果使用了通用删除字段DEL_FLAG标记的行则不参与检查
七
优化有效期重叠检查
之前做的有效期重叠检查没有考虑SE16N选择条件过滤掉的数据,这次一并补充上.有效期重叠检查和关键字重复检查有很多共性
都需要基于业务关键字识别出其他行.
在此基础上有效期重叠检查需要考虑重复关键字的内容期间是否重叠.
关键字重复检查仅需要考虑存重复关键字内容存在
八
其它方式
非主键字段的内容唯一性检查还可以通过创建数据库索引实现
用SE11表创建唯一索引,实测唯一索引也能阻止重复数据创建.(为空也会检查重复性).
相比增强实现的重复性检查. 唯一索引触发检查不足之处
• 内容为空也会触发唯一索引检查
• 唯一索引检查没有提示明确的错误
九
总结
非关键字如果要确保数据不能重复.
可以使用标准功能 创建一个唯一索引
也可以通过本文提供的增强方式实现可配置的重复性检查
唯一索引缺点很明显, 但是如果字段不允许为空的情况下, 唯一索引可以更加严格的确保数据不重复. 此时再补充本文的增强检查. 可以形成最佳组合.
对唯一索引无法覆盖的情况: 数据允许为空且空值不参与唯一性检查. 则只能通过类似于本文的增强来实现了.
**约定**
如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.
syjf1976
sharry_xlp
Yannick_Duan
申请进入公众号讨论群提问或者参与话题讨论