如何基于SalOutCd7Plc与BseCd自动生成TmpltId编号?
实现按SalOutCd7Plc和BseCd分组的TmpltId自动递增方案
核心逻辑
以(SalOutCd7Plc, BseCd)作为分组键,每个分组内的TmpltId独立从1开始递增,不同分组的编号互不干扰。
具体实现步骤
事务属性配置
- 确保事务包含
SalOutCd7Plc、BseCd、TmpltId三个属性,将TmpltId设置为非自动编号(取消GeneXus默认的自动编号配置),数据类型选用数值型(如Int)。
- 确保事务包含
新增记录时的自增逻辑编写
- 打开Work With Plus的Web面板,定位到新增记录的预处理事件(如事务的
BeforeInsert事件,或面板的OnNewRecord事件,依GeneXus版本调整)。 - 编写分组查询与赋值逻辑:
// 查询当前分组下的最大TmpltId &MaxTmpltId = Max(TmpltId) Where SalOutCd7Plc = &SalOutCd7Plc and BseCd = &BseCd // 赋值新的TmpltId If &MaxTmpltId is null &TmpltId = 1 Else &TmpltId = &MaxTmpltId + 1 EndIf - 并发防护:为避免多用户同时插入时出现编号重复,需确保操作的原子性——可通过开启事务锁,或在数据库层面添加组合唯一约束来兜底。
- 打开Work With Plus的Web面板,定位到新增记录的预处理事件(如事务的
数据库约束加固
- 在事务对应的数据库表中添加组合唯一约束:
UNIQUE(SalOutCd7Plc, BseCd, TmpltId),强制保证同一分组内的TmpltId唯一,即使程序逻辑出现异常,数据库也会拦截违规数据。
- 在事务对应的数据库表中添加组合唯一约束:
场景测试验证
- 分别测试以下场景,确认逻辑符合预期:
- 插入
SalOutCd7Plc=1且BseCd=1的记录,验证TmpltId从1开始连续递增; - 插入
SalOutCd7Plc=1且BseCd=2、SalOutCd7Plc=2且BseCd=1的记录,验证每组的TmpltId均从1开始; - 同一分组内多次插入,确认编号无断层、无重复。
- 插入
- 分别测试以下场景,确认逻辑符合预期:
内容的提问来源于stack exchange,提问作者dragonquila
相关产品推荐
相关产品推荐

