我们在开发管理软件的时候,常常遇到流水 (单据 、登记 )自动生成、控制和管理的问题。由于流水
具有唯一性和连续性的特点,在实际开发过程中若处理不好,会产生流水 重复及断 的问题。特别是多个并发用
户同时保存一张同样的业务单据时,系统会返回多个相同的流水 。笔者以前在开发企业ERP系统的时候,就曾出
现多个并发用户同时保存同类型的业务单据时,系统返回相同的流水 。导致业务单据出现重复。经过多方研究,
最终笔者找到了解决方案,该方案无需对数据库加锁,高效又简单,在实际应用中取得了良好的效果!现把该方案写出来,
供同行参考批评。
客户要求自动生成销售单据流水 ,格式为:XS-年月-该年该月的流水 。具体格式如下:XS-1702-00003,表
示2017年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]
GO
YWDJZB为业务单据总表 ,CKDH为流水 ,具有唯一性和连续性的特点,所以设置为主键,防止重复。ZD1,ZD2,ZD3为
单据总表其他字段,可根据实际业务修改。
二.建立流水 生成存取过程(SQL SERVER数据库)
CREATE PROCEDURE GETCKDH
@getckdh VARCHAR(50),–流水 类型
@dwmc VARCHAR(500),–@dwmc为要保存的单据记录,用户可根据实际需要传递[YWDJZB]表的记录,
@RETURNDA VARCHAR(150) OUTPUT
AS
declare
@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)
begin
set @DWGQ=’0’+@DWGQ
End
set @DWGQ=@getckdh+@DWGQ
end
else
begin
set @DWGQ=@getckdh+’00001′
end
select @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
end
else
begin
set @RETURNDA=’error’
end
return
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”提示,后台软件可根据返回信息提醒软件操作员。
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91749 人正在系统学习中 相关资源:数据据模型设计软件MySQLWorkbench6.3.9CE中文语言汉化版中英双语…
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!