自动生成单据编号
日期: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 |
可选 |
空串 |
如果不使用自动生成代码,这个参数为空。否则:按照表二来配置 |
输出:无