跳到主要内容

自动编号字段

自动编号,是一种特殊的数据规范,表单或报表中经常需要使用序列号,比如单号、编号等,当需要定义一个规则来自动生成所需的序列号时,我们称之为自动编号。

在可视化界面可以为该字段类型额外配置以下属性:

  • 公式 formula:在这里输入自动编号规则,可以是一个返回自动编号规则的公式,也可以直接输入自动编号规则。

自动编号规则

要实现自动编号需要先确定编号规则,通常来说有两种类型的编号规则,一种是按日期编号,另一种是按序号编号。

  • 日期: 以字符Y表示当年,M表示当月,D表示当日,不支持小时、分和秒,用一对大括号包裹它们即可得到某种按日期编号的规则。

比如 {YYYY} 表示像 2022 这种当年的四位年编号,{YY} 表示像 22 这种当年的两位年编号, {MM}{DD}则分别表示像 0218 这种当月和当日的两位月和日编号

  • 序号: 以数值符号 0 表示序号占位,用一对大括号包裹它们即可得到某种按序号编号的规则。

比如 {0000}{00} 分别表示以4位数和2位数的序号形式编号,每个编号会在前一个编号的基础上递增1,每个编号值前面会补0以填满占位数,默认起始编号为1,编号规则 {0000} 第一个编号为0001,第二个为0002。

当编号值太大造成占位不足时会自动扩充占位数,像上述 {0000} 这种编号规则的第一万个编号值为10000,第十万个编号值为100000。

  • 混合编号: 可以制定单独按日期或序号编号的编号规则,也可以把两种编号规则结合起来,还可以在大括号外混入其他固定字符。

比如可以新建一个合同编号字段,并在该字段“公式”文本框中输入{YYYY}-{0000}, 当新建一个合同记录时,会为合同记录自动生成如 2022-0001 这样的编号值。

常用的合同编号规则还有 SN{YYYY}{MM}{DD}{000}采购合同\[{YYYY}\]{000}号,它们分别会生成像 SN20220408001采购合同[2022]001 这样的编号值。

  • 重置序号:如果是纯序号的编号规则,那么其编号值中序号会一直递增而不会出现重置序号值的情况,但是对于混合了日期和序号的编号规则,每一轮日期范围会重置一次序号值。

比如 {YYYY}-{0000} 这种编号规则,编号值会从 2022-00012022-0002、 ... 一直递增其中的序号值。

但是当其中日期编号值变化时会重置序号值并进入新一轮的序号值递增,比如到2023年时,编号值会从 2023-00012023-0002、 ... 重新开始递增。

  • 编号规则限制:如果同一个编号规则中包含两组及以上序号规则时,各组序号值只计算一次,它们的值始终相同。

比如编号规则 {YYYY}-{0000}-{000} 中包含了两组序号规则,它会生成 2022-0001-001 这种编号值,而不可能出现 2022-0001-002 这种各个序号值不相同的情况。

自动编号公式

我们在自动编号字段的公式属性中可以直接输入自动编号规则,也可以输入一个返回自动编号规则的公式,这样不但可以实现更复杂的逻辑判断,在不同的情况下使用不同的编号规则,而且可以在编号规则中引用记录中的字段值。

比如以下公式直接返回合同编号规则:

"SN{YYYY}{MM}{DD}{000}"

下面的公式在以上合同编号规则基础上增加了逻辑判断,如果合同金额大于十万则把前缀 SN 换为 IM 以表示重要合同:

IF(amount > 100000, "IM{YYYY}{MM}{DD}{000}", "SN{YYYY}{MM}{DD}{000}")

以上公式优化后内容如下所示:

IF(amount > 100000, "IM", "SN") & "{YYYY}{MM}{DD}{000}"

我们还可以在公式中引用合同记录中的字段值,假设合同中有一个名为合同类型的选择框字段,以下公式进一步把合同类型加入到编号规则中:

IF(amount > 100000, "IM", "SN") & '-' & type & '-' & "{YYYY}{MM}{DD}{000}"

以下是一个类型为付款的重要合同的编号值:

IM-payment-20211208008

需要注意的是,自动编号字段只在记录初始创建的时候计算一次,这意味着其公式属性中如果引用了其他字段值的话,当相关字段值变更后,不会重新更新自动编号值。

自动编号配置

关于起始编号

默认起始编号为1,需要变更起始编号时可以修改目标”自动编号“的“当前编号值”内容,设置方法就是下面的“自动编号配置”。

公式生效范围

使用{YYYY}等日期公式时,可以设置其生效范围,当无效时公式返回空字符串,设置方法就是下面的“自动编号配置”。

自动编号配置

需要变更起始编号或设置日期公式生效范围时需要编辑目标”自动编号“来配置相关属性,点开“设置-高级设置-自动编号”。

自动编号记录规则:当您为一个对象创建一个自动编号字段后,如果没有新建该对象记录,自动编号记录中不会生成该对象的自动编号记录。

如果您想变更起始编号,请在自动编号中新建一条记录,“对象名”、“自动编号字段”请输入对应您之前创建的那一个自动编号字段名及其对象名,“当前编号值”请输入起始编号。“日期范围开始日期”和“日期范围截止日期”如果不填就是默认当年的开始时间和结束时间。

如果您想中途变更编号,请在自动编号中筛选对应的记录,修改其“当前编号值”内容。

新建一条记录时,编号从1开始记录。如果输入的是100,表示从101开始记录。而且当前编号值会随着新增记录的增加而改变,比如已经有10条记录了,当前编号值会显示为10。

修改自动编号值

通常来说自动编号字段值是完全根据配置的编号规则自动计算出来的,也就是说它是不可以被用户在界面上编辑的。

不过实际业务场景中有可能会遇到某些情况下需要允许用户手动输入编号值以满足某些特殊情况下的编号值设定。

默认情况下,自动编号字段在记录创建的时候按编号规则计算出来结果保存其值之后,会始终显示为只读状态,再也不会也不允许用户在界面上修改该字段值。但是管理员可以通过配置 字段权限 来允许特定用户编辑该字段。

当用户在界面上编辑自动编号字段值时,遵循以下规范:

  • 新建记录时不显示自动编号字段,只有编辑记录时才显示为文本输入框。
  • 不允许输入空值,但允许输入和保存为不符合该字段的编号规则的值。
  • 保存时会校验编号值的唯一性,不允许输入已经被占用的编号值。
  • 保存后的值不参与自动编号规则计算,也不会更新自动编号配置中的“当前编号值”属性。

计算下一个编号值及跳号规则

自动编号字段值是根据编号规则自动计算得到的,每次生成新的编号值时都遵循以下规范:

  • 日期类型的编号规则直接按当前时间值来计算,与前一个编号值没有关系。
  • 序号类型的编号规则需要在前一个编号值的基础上递增1。
  • 整个编号值计算出来后,需要校验字段值的唯一性。
纯序号

以下步骤描述了一个纯序号类型的编号规则是如何找到前一个编号值的:

  • 从数据库中查找该自动编号字段关联的自动编号配置,配置中的”当前编号值“就是需要找的前一个编号值。
  • 如果数据库中未查找到任何关联自动编号配置,则自动新建一个”当前编号值“为0的自动编号配置记录,0值即是需要找的前一个编号值。
  • 如果数据库中找到多条关联自动编号配置,则以找到的第一条为准,取其”当前编号值“属性值作为前一个编号值。
混合编号

对于包含日期和序号的编号规则,因为每一轮日期范围会重置一次序号值,所以它找到前一个编号值的过程与纯序号类型不一样,以下步骤描述了相关过程:

  • 从数据库中查找该自动编号字段关联的自动编号配置,查找时根据公式中引用的年、月、日规则,增加对应的日期范围开始日期与截止日期过滤条件。
  • 如果数据库中未查找到任何关联自动编号配置,则自动新建一个”当前编号值“为0的自动编号配置记录,该配置的日期范围开始日期与截止日期两个属性值是根据公式中引用的年、月、日规则自动算出来的,同时取0值作为需要找的前一个编号值。
  • 如果数据库中找到一条或多条关联自动编号配置,则以找到的第一条为准,取其”当前编号值“属性值作为前一个编号值。
手动编号

当通过字段权限配置来允许用户在界面上编辑自动编号字段值时,应该遵循以下规范以兼顾自动编号字段值计算规则:

  • 界面上编辑自动编号字段值保存时不会更新自动编号配置中的“当前编号值”属性,即手动编号值不参与自动编号规则计算。
  • 如果手动编号时输入的值正好符合该自动编号字段的编号规则,后续创建业务记录计算自动编号值时应该跳过该编号值以保证自动编号字段值的唯一性。

必填规则

因为自动编号字段值是在服务端自动计算生成的,所以不支持该字段类型的字段的必填属性,以避免新建记录时报错。

变更编号规则

当我们因为业务需求变更需要变更编号规则时,就需要修改自动编号公式以制定新的编号规则。

但是如果这么做的话历史数据中已经有的记录中的自动编号字段值是不会重新计算的,所以系统正式上线前应该认真确认编号规则是否能满足业务需求以避免不必要的麻烦。