自动生成单据编号

自动生成单据编号

作者:sagahu@163.com

日期: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

可选

空串

如果不使用自动生成代码,这个参数为空。否则:按照表二来配置

输出:无

原文地址:https://www.cnblogs.com/sagahu/p/3620132.html