自動生成單據編號
日期: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 |
可選 |
空串 |
如果不使用自動生成代碼,這個參數為空。否則:按照表二來配置 |
輸出:無