U9 研发体系 单据自动编号开发说明 文件编号:U9-研发-自动编号 版 本 号 :V1.5 修改状态: 编 写 人 :朱慧 审 核 人 : 批 准 人 : 批准时间:2008.06.27 U9 研发体系(单据自动编号开发说明) 版本记录 版本 修改与参与人 修改时间 修改原因 修改概述 审核人1.5 朱慧 2008-06-27 原始文档建立 一.问题域说明 本说明适用于继承了 DocType 基类的单据用于生成自动编号的场景。 二.基本原理 U9 中的单据种类繁多,如果继承了统一的 DocType 基类,则平台会提供一种方法依预定的规则生成自动单据编号,而不用这些单据自己写代码生成自动编号,根据生成方式的不同,分为以下几种情况: 1. 用基类的 OnInserting() OnUpdating()来生成 用这种方法生成自动编号,需要保证在调用上述两个方法的时候,DocNo 属性是空的,否则平台会认为不需要产生新的自动编号。 OnInserting()适用于编号方式为自动编号的新增的单据 OnUpdating()适用于修改现有的单据,由原来非自动编号方式改为自动编号方式,注意:此时需要清掉原来的单据号,才会产生新的编号。 2. 用基类的 GetDocNos()方法 第 2 页 共 5 页 U9 研发体系(单据自动编号开发说明) 这种方式相对主动一些,可以在任何需要的时候调用该方法生成自动编号,适用于在OnInserting() OnUpdating()方法之前需要得到单据号的场景。GetDocNos有一个重载的方法IList GetDocNos(int count),用于批量取自动编号。 3. 调用 SequenceDef 中的方法。 这种方法更主动一些,在SequenceDef中有一个公共方法用于生成自动编号IList GetSequenceNos(BusinessEntity.EntityKey entity, int count, object entityInstance) ,其实前两种生成自动编号的方法最终也是调用这个方法的。参数entity是实体的Key,count表示生成编号的个数,entityInstance是单据的实例。 单据号一旦使用后,其回收工作由单据基类的 OnDelete()方法来完成,在单据删除时,要相应地在 OnDelete()方法中调用基类的该方法。 单据自动编号预置数据说明 Base_SequenceSegment 名称 显示名 说明 ID ID CreatedOn 创建时间 CreatedBy 创建人 ModifiedOn 修改时间 ModifiedBy 修改人 IndexNumber 行号 该字段大小决定生成编码的段顺序 SegmentType 段类型 枚举: 0-字段值 1-上下文变量 2-常量 3-流水号 SegmentValue 段值 段类型=字段值时:录入字段编码,如:Dept.Code; 段类型=上下文变量时:录入上下文枚举值 第 3 页 共 5 页 U9 研发体系(单据自动编号开发说明) 上下文变量枚举: 0-登录语言 1-登录日期 2-登录组织 3-登录用户 段类型=常量时:录入常量字符,不能包含分隔符号; 段类型=流水号时:不录; SegmentLength 段长度 PadMethod 补位方式 补位方式枚举: 0-左补位 1-右补位 2-不补位 PadChar 补位字符 补位方式为左补位或者右补位时必须录入。 长度为 1 个字符长度。 DateFormat 日期格式 当段值类型为日期型时必须录入。 日期格式枚举: 0-YYYYMMDD 1-YYYYMD 2-YYMMDD 3-YYMD 4-YYYYMM 5-YYYYM 6-YYMM 7-YYM IsSequenceBy 流水依据段 段类型=流水号时,一定为 false SysVersion 事务版本 IsVisible 段显示 SequenceDef 编码方案 Separator 分隔符号 补位方式为不补位时必须录入。 第 4 页 共 5 页 U9 研发体系(单据自动编号开发说明) 长度为 1 个字符长度。 三.关键代码及说明 通过查看平台生成自动编号的代码,可以清楚地了解生成自动编号的处理过程。 在单据的 OnInserting()和 OnUpdating()方法中都有下面一行代码: this.ProcessDocNoOnInserting(); 而在该方法中,会使用下面的代码来生成自动编号: this.DocNo = this.GetDocNos(); 而 GetDocNos()也会使用它重载的方法取自动编号,其中返回编号的代码如下: return this.DocType.DocHeaderSequence.GetSequenceNos(null, count, this); 最终平台会用下面的代码来生成自动编号,继续查看,能够看到更详细的实现方式,可以参看平台的代码,此处略。 public IList GetSequenceNos(BusinessEntity.EntityKey entity, int count, object entityInstance) { string sequenceBy; if (entity == null) { sequenceBy = this.CalcSequenceBy(entityInstance); } else { sequenceBy = this.CalcSequenceBy(entity.GetEntity()); } List nos = new List(); nos = SequenceHelper.GetFlowNosByCLRSP(this, sequenceBy, count); if (entity == null) { return this.CalcSequenceNo(entityInstance, nos); } return this.CalcSequenceNo(entity.GetEntity(), nos); } 第 5 页 共 5 页