表单未保存仅打开关闭时Number seq自动递增问题求助
解决表单未保存时编号序列自动递增的问题
核心原因
默认的编号序列(Number Sequence)生成逻辑是生成即消耗,只要调用了numberSeq.num()或类似方法获取编号,系统就会将该编号标记为已使用,即便后续未完成表单保存操作,也不会回滚这个编号。
解决方案
1. 使用编号序列的预留(Reserve)机制
在表单初始化或获取编号时,调用预留方法而非直接生成:
NumberSeq numberSeq; NumberSeqId numberSeqId = NumberSeqReference::findReference(typeId2ExtendedTypeId(tableStr(YourTable))).NumberSeqId; // 第三个参数false表示预留编号,不立即消耗 numberSeq = NumberSeq::newGetNum(numberSeqId, true, false); // 保存时正式消耗编号 if (yourTable.validateWrite()) { numberSeq.used(); // 标记编号为已使用 yourTable.insert(); } else { numberSeq.abort(); // 放弃预留编号,编号会回到序列池 }
2. 调整编号序列的系统配置
- 进入Organization administration > Number sequences > Number sequences,找到目标编号序列
- 将Continuous属性设置为
No:非连续模式下,未使用的编号会被系统回收,但此配置会导致编号出现断号,仅适合对编号连续性要求不高的业务场景
3. 表单事件中添加回滚逻辑
在表单的关闭或取消事件中,判断未保存时回滚预留的编号:
public void close() { if (numberSeq && !this.isSaved()) { numberSeq.abort(); } super(); }
注意事项
- 预留机制仅适用于支持该逻辑的编号序列类型,部分系统内置编号序列可能无法修改此行为
- 非连续编号配置需结合业务需求评估,避免影响业务流程对编号的依赖
内容的提问来源于stack exchange,提问作者Restler-B
相关产品推荐
相关产品推荐

