如何在Business Central中创建含年月日的No. Series动态编号?
Business Central 自动生成C+年月日+3位流水号格式编号的配置方案
完全可以实现,不需要每日手动创建编号行,根据你使用的BC版本不同,要么原生配置就能搞定,要么只需要加几行极简的自定义代码,全程不需要人工日常维护。
新版本BC(v19/2021 wave2及以上版本)原生配置方法
这个版本开始系统自带的编号序列已经支持按日期自动匹配前缀,按下面步骤配置就行:
- 打开
No. Series(编号序列)页面,新建一条编号序列,填好编号编码、描述,绑定到你需要用的单据类型(比如销售发票) - 只需要建1条编号行,不需要按天新增:
- 起始日期填你要启用这个规则的首日,比如
2022-01-01 - 起始编号填
C220101001 - 结束编号填对应周期的最大值,比如只覆盖2022年就填
C221231999,要长期使用就填C991231999 - 一定要勾选
Date Order(按日期排序)选项,最后一位流水号长度设为3,增量步长设为1
- 起始日期填你要启用这个规则的首日,比如
- 配置完的逻辑是:系统会自动识别固定前缀
C之后的6位日期位(YYMMDD格式),新建单据时自动把这6位替换为当前单据日期,当日的流水号自动从001开始累加,跨天自动重置流水,完全不用手动加行。
旧版本BC/NAV(v18/2021 wave1及更早版本)实现方法
旧版本的Date Order功能只支持按年重置流水,不支持按日,这时候只要加个极简单的事件订阅就行,不用改系统标准逻辑:
- 先按上面的步骤新建编号序列,建一条初始行就行
- 新建一个扩展,订阅编号序列获取下一个号的触发事件,自动判断当日的编号行是否存在,不存在就自动创建,全程无感知,不需要人工操作。核心代码参考:
[EventSubscriber(ObjectType::Codeunit, Codeunit::"No. Series", 'OnBeforeGetNextNo', '', false, false)] local procedure AutoCreateDailyNoSeriesLine(var NoSeriesLine: Record "No. Series Line"; var IsHandled: Boolean) var WorkDateVal: Date; DatePrefix: Code[7]; begin // 替换成你自己建的发票编号序列编码 if NoSeriesLine."Series Code" <> 'INV-NO' then exit; WorkDateVal := WorkDate(); // 拼接C+YYMMDD格式的前缀 DatePrefix := 'C' + Format(WorkDateVal, 0, '<Year,2><Month,2><Day,2>'); // 如果当前行不是当日的编号行,自动新建当日行 if NoSeriesLine."Starting No." <> StrSubstNo('%1001', DatePrefix) then begin NoSeriesLine.Init(); NoSeriesLine."Series Code" := 'INV-NO'; NoSeriesLine."Starting Date" := WorkDateVal; NoSeriesLine."Starting No." := StrSubstNo('%1001', DatePrefix); NoSeriesLine."Ending No." := StrSubstNo('%1999', DatePrefix); NoSeriesLine."Last No. Used" := StrSubstNo('%1000', DatePrefix); NoSeriesLine.Insert(true); end; end;
配置完建议先做测试:修改系统工作日期为不同日期,新建几张测试发票,确认编号能自动匹配当前日期、当日流水从001开始累加即可,后续使用不需要人工维护编号行。
内容的提问来源于stack exchange,提问作者kuhi
相关产品推荐
相关产品推荐

