自動生成業務單據流水號方案

2022-07-20 01:18:11 字數 2442 閱讀 3395

我們在開發管理軟體的時候,常常遇到流水號(單據號、登記號)自動生成、控制和管理的問題。由於流水號

具有唯一性和連續性的特點,在實際開發過程中若處理不好,會產生流水號重複及斷號的問題。特別是多個併發用

戶同時儲存一張同樣的業務單據時,系統會返回多個相同的流水號。筆者以前在開發企業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...