我們在開發管理軟體的時候,常常遇到流水號(單據號、登記號)自動生成、控制和管理的問題。由於流水號
具有唯一性和連續性的特點,在實際開發過程中若處理不好,會產生流水號重複及斷號的問題。特別是多個併發用
戶同時儲存一張同樣的業務單據時,系統會返回多個相同的流水號。筆者以前在開發企業erp系統的時候,就曾出
現多個併發使用者同時儲存同型別的業務單據時,系統返回相同的流水號。導致業務單據出現重複。經過多方研究,
最終筆者找到了解決方案,該方案無需對資料庫加鎖,高效又簡單,在實際應用中取得了良好的效果!現把該方案寫出來,
供同行參考批評。
客戶要求自動生成銷售單據流水號,格式為:xs-年月-該年該月的流水號。具體格式如下:xs-1702-00003,表
示2023年2月開具第3單銷售單,最大單據號為99999。根據客戶的需求,我們按以下步驟編寫流水號自動生成**:
一.建立業務單據總表
create table [dbo].[ywdjzb] (
[id] [int] identity (1, 1) not null ,
[ckdh] [varchar] (30) not null ,
[zd1] [varchar] (20) null
[zd2] [varchar] (20) null
[zd3] [varchar] (20) null
) on [primary]
goywdjzb為業務單據總表 ,ckdh為流水號,具有唯一性和連續性的特點,所以設定為主鍵,防止重複。zd1,zd2,zd3為
單據總表其他字段,可根據實際業務修改。
二.建立流水號生成訪問過程(sql server資料庫)
create procedure getckdh
@getckdh varchar(50),--流水號型別
@dwmc varchar(500),--@dwmc為要儲存的單據記錄,使用者可根據實際需要傳遞[ywdjzb]表的記錄,
@returnda varchar(150) output
asdeclare
@dwgq varchar(50),--生成的單據流水號變數
@sqlstr nvarchar(1000)--sql語句
select @dwgq=maxvalue from ( select max(cast(right(ckdh,5) as int))+1 as maxvalue from
ywdjzb where ckdh like @getckdh+'%') as tempdata --自動生成最新的單據流水號變數
if len(@dwgq)<>0
begin
while len(@dwgq)<5
begin
set @dwgq='0'+@dwgq
endset @dwgq=@getckdh+@dwgq
endelse
begin
set @dwgq=@getckdh+'00001'
endselect @sqlstr='insert into ywdjzb (ckdh,zd1,zd2,zd3) values('+''''+@dwgq+''''+@dwmc
--根據最新的流水號儲存單據記錄
exec sp_executesql @sqlstr
if exists (select * from ywdjzb where ckdh=@dwgq)
begin
set @returnda=@dwgq
endelse
begin
set @returnda='error'
endreturn
go三.管理軟體呼叫,筆者採用delphi開發管理軟體,具體**如下:
........
sql.add(' execute getckdh :getckdh, :dwmc, :returnda output ') ;
parameters.items[0].value := getckdh;
dwmc:=','''+zd1bl+''','''+zd2bl+''','''+zd3bl+''');//使用者可根據實際需要傳遞[ywdjzb]表的記錄
parameters.items[1].value := dwmc;//
prepared;
execsql;
result:=parameters.items[2].value;
........
若sql server資料庫成功生成流水號並儲存以下記錄:
into ywdjzb (ckdh,zd1,zd2,zd3) values(''流水號'',''欄位1'',,''欄位2'',,''欄位3''),並自動返回自動生
成的流水號給後台軟體,若處理失敗,就返回"error"提示,後台軟體可根據返回資訊提醒軟體操作員。
SQL自動生成流水號
select convert char 6 getdate 12 下面的 生成長度為8的編號,編號以bh開頭,其餘6位為流水號。得到新編號的函式 create function f nextbh returns char 8 asbegin 從表裡得到最大值加個1000001就增乙個1 return...
SQL生成流水號
經過了幾次的測試終於成功了 declare year int,month int,day int,temp no varchar 12 needno varchar 4 no varchar 20 number varchar 50 randno varchar 50 nu varchar 10 s...
php生成流水號
function createn i else if i 100 else if i 1000 else echo substr 2012050010 0,6 echo createn 2 2 echo createn 9 9 echo createn 10 10 echo createn 11 1...