手机网站轮播图,凡科商城官网旗舰店,专业网页制作行情,八大处做双眼预约网站我们在开发管理软件的时候,常常遇到流水号(单据号、登记号)自动生成、控制和管理的问题。由于流水号具有唯一性和连续性的特点,在实际开发过程中若处理不好,会产生流水号重复及断号的问题。特别是多个并发用户同时保存一张同样的业务单据时#xff0c;系统会返回多个相同的流水… 我们在开发管理软件的时候,常常遇到流水号(单据号、登记号)自动生成、控制和管理的问题。由于流水号具有唯一性和连续性的特点,在实际开发过程中若处理不好,会产生流水号重复及断号的问题。特别是多个并发用户同时保存一张同样的业务单据时系统会返回多个相同的流水号。笔者以前在开发企业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]GOYWDJZB为业务单据总表 ,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 DWGQMaxValue 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 DWGQ0DWGQ End set DWGQgetckdhDWGQ end else begin set DWGQgetckdh00001 endselect SQLSTRinsert into YWDJZB (ckdh,ZD1,ZD2,ZD3) values(DWGQdwmc --根据最新的流水号保存单据记录exec sp_executesql SQLSTRif EXISTS (select * from YWDJZB where CKDHDWGQ) begin set RETURNDADWGQendelse begin set RETURNDAerrorend returnGO三.管理软件调用,笔者采用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提示,后台软件可根据返回信息提醒软件操作员。 转载于:https://www.cnblogs.com/lzmbk/p/8456029.html