odoo自动生成序列irsequen
我们很常见,业务单据要求唯一编号,尤其像凭证要求连号不中断。今天提供两种方式,第二种算作扩展,因为有些难度,常用的第一种都能满足。
第一种,使用ir.sequence模型:
记录你可以手动在《设置/技术/序列与标识符/序号》中,创建/修改/删除。
常见的是写成初始化数据,如:data/ir_sequence.xml文件
?xmlversion="1.0"encoding="utf-8"?odoodatanoupdate="1"recordid="category_customer_auto_yx"model="ir.sequence"fieldname="name"院线开头的分类/fieldfieldname="code"customer.category.yx/fieldfieldname="prefix"YX-/fieldfieldname="padding"6/field/recordrecordid="category_customer_auto_otc"model="ir.sequence"fieldname="name"otc开头的分类/fieldfieldname="code"customer.category.otc/fieldfieldname="prefix"OTC-/fieldfieldname="padding"6/field/record/data/odoo
详细讲解一下各个字段的作用,可对照上图查看:
name:序列名称
code:序列代码,通常为实现的模型名称
implementation:实现方式。序列有两种实现方式,一种为标准方式(standard),另外一种为非间断式(no_gap)。两者的区别在于,标准方式允许中间断层(1,2,4,6),而非间断式即不允许断层(1,2,3,4)。但如果删除记录,序列中仍可能存在间隙。非间断式的性能开销要大于标准方式。
prefix:前缀,即生成的序列号的前缀。
suffix:后缀,即生成的序列号的后缀。
padding:序列大小,即序列不包含前缀和后缀的长度。
step:步长,即下一个增加的数值,默认值为1。
number_next_actual:下一号码,即下一次,序列号数字。
use_date_range:布尔字段,勾选后,每个日期范围,使用不同序号
调用方法比较简单,通常我们在创建单据时调用:
api.modeldefcreate(self,vals):ifvals.get(category_customer_id):temp=self.env[customer.category].browse(vals[category_customer_id]).namecateg_map={院:customer.category.yx,o:customer.category.otc,其:customer.category.qt,}forrin[院,o,其]:iftemp.startswith(r):vals[num_customer]=self.env[ir.sequence].next_by_code(categ_map.get(r))ifvals.get(supplier)andnotvals.get(num):raiseUserError(未填写供应商编号)returnsuper(ResPartner,self).create(vals)next_by_code方法接收两个参数:
sequence_code:序列代码
sequence_date:序列日期。序列支持根据一段时间内,使用指定的序列。
常见错误:
此为sql约束引起的:SQLConstraints约束
_sql_constraints=[(name_uniq,unique(name,
|