博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自动生成业务单据流水号方案
阅读量:5127 次
发布时间:2019-06-13

本文共 2004 字,大约阅读时间需要 6 分钟。

       我们在开发管理软件的时候,常常遇到流水号(单据号、登记号)自动生成、控制和管理的问题。由于流水号

具有唯一性和连续性的特点,在实际开发过程中若处理不好,会产生流水号重复及断号的问题。特别是多个并发用
户同时保存一张同样的业务单据时,系统会返回多个相同的流水号。笔者以前在开发企业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)<5  
                    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"提示,后台软件可根据返回信息提醒软件操作员。

转载于:https://www.cnblogs.com/lzmbk/p/8456029.html

你可能感兴趣的文章
运维基础-Linux发展史、安装、基本操作
查看>>
win7系统激活最简单方法
查看>>
布尔表达式
查看>>
MySQL设置字段的默认值为当前系统时间
查看>>
springBoot之HelloWorld
查看>>
.net framework 4.5为啥在IIS中找不到了
查看>>
python扫描端口脚本
查看>>
实现一个string类
查看>>
leetcode 之Swap Nodes in Pairs(21)
查看>>
后RCNN时代的物体检测及实例分割进展
查看>>
File类的创建,删除文件
查看>>
Cookie/Session机制详解
查看>>
Struts随笔
查看>>
php保留小数方式
查看>>
软件工程第3次作业 | 提问回顾与个人总结
查看>>
读锁跟写锁的区别
查看>>
铁大通。
查看>>
【22】java初始化(静态变量)
查看>>
【38】通过继承扩展接口
查看>>
Never Wait for Weights(带权并查集+路径压缩)
查看>>