自动生成单据编号
日期:2014-03-18
一、说明
业务单据的编号通常需要按照一定的规则由应用系统自动生成,少数时候也有可能由操作员手工填写。
二、自动编号的分段
常见的单据编号组成部分有以下几种:
(1)固定字符串
(2)员工编号
(3)日期
(4)顺序号
各种组成小段都会具有自己的特点与使用约束。
组成小段 | 分类情况 | 备注 |
固定字符串 | 无 |
|
有 | 定长,1~4位,通常用作前缀。 | |
员工编号 | 无 |
|
有 | 定长,2~5位 | |
日期 | 无 |
|
年:yyyy | 定长,4位 | |
年月:yyyyMM | 定长,6位 | |
年月日:yyyyMMdd | 定长,8位 | |
顺序号 | 无 |
|
有:本类单据内递增 对每个员工单独编号 本年/本月/本日内递增 对每个员工,按本年/本月/本日内递增 | 定长,1~8位,附加限制越多,长度越小 |
约束:在一个编码规则中每种组成小段可以没有,如果有只能是1个;各种小段并不能固定顺序!允许用户自定义配置。
这些组成小段也叫做编码的组成项目。
三、软件需求
(一)最终目标需求
描述:每种单据新建时,自动生成它的单据编号。
输入条件:
单据类型标识(必须),
员工编号(根据情况选用),
日期(数据库内自动)。
输出:新的单据编号
(二)系统配置初始需求
系统初始应该由程序员把所有需要自动生成编号的单据对象列表,并设定初始的编号规则。
这个需要编号的单据对象列表固定,由各单据功能代码硬编码调用,后期不允许删除单据对象,只允许修改各对象的具体编码规则。
(三)系统配置维护需求
系统运行初期,允许管理员自已修改各单据编号规则的初始设定,修改后在新的单据记录开始启用。
四、数据库定义与实现
(一)硬编码参数定义
编码小段类型:1-固定字符串;2-员工编号;3-日期;4-顺序号。
日期格式:yyyy/yyyyMM/yyyyMMdd。三选一
顺序号限制范围:ForEmp;Global/InYear/InMonth/InDay。两种可叠加
(二)表定义
表一:tBillCodeRules,定义单据编号对象的列表,并对格式予以总的说明
No | 字段名称 | 类型 | 说明 |
1 | SortCode | varchar(50) |
|
2 | BillKey | nvarchar(50) | PK,单据编号规则标识符号。 |
3 | BillTitle | nvarchar(50) | 单据名称 |
4 | IsAuto | int | Default 0。标识是否自动生成此项单据编号。0-否;1-是 |
5 | FormatDesc | nvarchar(50) | 格式说明 |
6 | Length | Int | 总长度 |
7 | TableName | varchar(50) | 所在数据表名称 |
8 | CodeColumnName | varchar(50) | 单据编号所在字段名称 |
9 | DateColumnName | varchar(50) | 单据日期所在字段名称 |
表二:tBillCodeRuleItems,对表一的单据对象详细定义它的每个编码小段(小段类型、顺序、格式选项、长度等)
No | 字段名称 | 类型 | 说明 |
1 | Id | Int | PK,AI,没有实际意义。 |
2 | BillKey | nvarchar(50) | FK,单据编号规则标识符号。 |
3 | ItemNo | int | 1~4,规则小段的顺序号。 |
4 | ItemType | int | 1~4,规则小段类型。1-固定字符串;2-员工编号;3-日期;4-顺序号 |
5 | Length | int | 本小段固定长度。 |
6 | Format1 | varchar(50) | Format1都是定义小段规则格式。 (1)当ItemType为“1-固定字符串”时,表示固定字符串值,不可空。 (2)当ItemType为“2-员工”时,字段空值。 (3)当ItemType为“3-日期”时,表示日期字符串格式,可为:yyyy/yyyyMM/yyyyMMdd三者之一。 (4)当ItemType为“4-顺序号”时,表示使用递增顺序号方式。但是,具体的递增方式有以下几种: A.如果包含ForEmp,表示顺序号需要为每个员工单独从头开始递增; B.如果包含InYear/InMonth/InDay之一,分别表示顺序号以年/月/日为周期从头开始递增。 C.如果既包含ForEmp,又包含InYear/InMonth/InDay之一,分别表示顺序号以年/月/日为周期,为每个员工从头开始递增。 D.空则表示顺序号是本类单据自系统启用初从1开始一直递增。 |
7 | Format2 | varchar(50) | 也是定义小段规则格式,目前保留。 |
(三)模拟测试数据
表一模拟数据
SortCode | BillKey | BillTitle | IsAuto | FormatDesc | Length | TableName | CodeColumnName | DateColumnName |
01 | Dj1 | 单据一 | 1 | 前缀+员工+日期+顺序号 | 17 | BillCodeTest | code | CreateDate |
02 | BI2 | 单据二 | 1 | 前缀+日期+顺序号 | 13 | BillCodeTest | code | CreateDate |
表二模拟数据
Id | BillKey | ItemNo | ItemType | Length | Format1 | Format2 |
1 | Dj1 | 1 | 1 | 3 | Dj1 |
|
2 | Dj1 | 2 | 2 | 4 |
|
|
3 | Dj1 | 3 | 3 | 6 | yyyyMM |
|
4 | Dj1 | 4 | 4 | 4 | ForEmp,InMonth |
|
5 | BI2 | 1 | 1 | 3 | BI2 |
|
6 | BI2 | 2 | 3 | 6 | yyyyMM |
|
7 | BI2 | 3 | 4 | 4 | InDay |
|
表三
create table BillCodeTest (
code varchar(50) primary key,
title varchar(50) ,
createDate datetime
)
(四)自动生成编码
名称:pBillCodeRules_NewCode
模块类型:存储过程
输入:
参数名称 | 类型 | 可选 | 缺省 | 备注 |
@BillIKey | varchar(50) | 必须 |
| 单据类型标识 |
@EmpCode | varchar(50) | 可选 | 空串 | 员工代码 |
返回:新的单据编号(varchar)
(五)维护:
名称:pBillCodeRules_UpdateRule
模块类型:C#代码方法
输入:
参数名称 | 类型 | 可选 | 缺省 | 备注 |
@BillIKey | varchar(50) | 必须 |
| 单据类型标识 |
@ruleItems | table | 可选 | 空串 | 如果不使用自动生成代码,这个参数为空。否则:按照表二来配置 |
输出:无