SqlServer按时间自动生成生成单据编号

SET @_tmpDateTime = GETDATE()

EXEC dbo.Dtw_Common_GenerateProofCode @ProofType = ‘SO‘,@[email protected], @ProofDate = @_tmpDateTime,
@RtnCode = @_tmpProofCode OUTPUT --生成的最终的CODE

USE [SZVB]
GO
/****** Object: StoredProcedure [dbo].[Dtw_Common_GenerateProofCode] Script Date: 2015/4/8 11:52:04 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Dtw_Common_GenerateProofCode]

(

@TableName nvarchar( 128 )=‘‘, --表名

@FiledName nvarchar(128)=‘‘,

@ProofType nvarchar( 32 ) , --单据简称 两位

@ProofDate datetime=‘‘,

@RtnCode nvarchar( 64 ) = null output, --生成的最终的CODE

@WhsCode varchar(10)=‘‘

)

AS

--使用新方式

--if(@WhsCode is null Or @WhsCode=‘‘)

--select @WhsCode=Code from W_inf_Warehouse where id=1

if(@WhsCode=‘‘)set @WhsCode =DB_NAME()--只有标准版使用仓库编码
else
set @WhsCode=LEFT(@WhsCode,4)

declare @Name varchar(50)

set @[email protected][email protected]

exec [up_GetMessageId] @[email protected],@EDICode=‘‘,@[email protected] output,@IsLongYear=1,@ItemCount=4

return

USE [SZVB]
GO
/****** Object: StoredProcedure [dbo].[up_GetMessageId] Script Date: 2015/4/8 13:49:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/*
增加一张生成序列号表:w_SN_EDI 1)EDICode nvarchar(50) 2)SerialNo int

declare @s nvarchar(100)

exec dbo.up_GetMessageId ‘DTWEHS‘,‘IR‘,@s output

print @s
*/

ALTER Procedure [dbo].[up_GetMessageId]
(
@Name nvarchar(100) =‘DTW01‘,
@EDICode nvarchar(8),
@RMessageId nvarchar(100) output,
@IsLongYear int=0,
@ItemCount int=5 , --流水码长度
@IsClear bit=1, --是否清零
@SplitChar varchar(1)=‘‘,
@CodeQty int=0 --需要条码的数量,注意不是份数,份数是每个条码相同,而数量是指连续的号码
)
AS
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION --开始一个事务
declare @IsReturnTable bit
set @IsReturnTable=0
if(@CodeQty>0)
begin
--为了兼容以前系统,对于没有指定@CodeQty的不需要返回表,仅适使用@RMessageId返回一个号码
set @IsReturnTable=1
end

else
begin
set @CodeQty =1
end
declare @SerialNo int,@Date nvarchar(8)
if(@IsLongYear=1)
set @Date=convert(nvarchar(6),getdate(),12)
else if(@IsLongYear=2) --短年+月份
set @Date=convert(nvarchar(4),getdate(),12)
else
set @Date=convert(nvarchar(8),getdate(),112)
set @SerialNo = 0

if not exists(select 1 from w_SN_EDI where [Name][email protected] and [email protected])
begin
Insert Into w_SN_EDI([Name],EdiType,[Date],SerialNo)
select @Name,@EDICode,@Date,@CodeQty
if(@@Error<>0) goto err
end
else
begin
if @IsClear=1
begin
if not exists(select 1 from w_SN_EDI where [Name][email protected] and [email protected] and [Date][email protected])
begin
update w_SN_EDI set serialno [email protected],[Date][email protected]
where [Name][email protected] and [email protected]
if(@@Error<>0) goto err
end
else
begin
select @SerialNo = serialno from w_SN_EDI
where [Name][email protected] and [email protected] and [Date][email protected]

update w_SN_EDI set serialno = serialno + @CodeQty
where [Name][email protected] and [email protected] and [Date][email protected]
if(@@Error<>0) goto err
end
end
else
begin--不清零
select @SerialNo = serialno from w_SN_EDI
where [Name][email protected] and [email protected]
if @SerialNo=99999 set @SerialNo=0
update w_SN_EDI set serialno = @SerialNo + @CodeQty
where [Name][email protected] and [email protected]
if(@@Error<>0) goto err
end
end
declare @end int
set @[email protected][email protected]
SET @RMessageId = ‘‘
declare @Tab table(Id int identity(1,1),No varchar(50))
set @[email protected]+1
while(@SerialNo<[email protected])
begin
set @[email protected][email protected][email protected]+ @[email protected]+(REPLICATE(‘0‘,@ItemCount-len(@SerialNo))+cast((@SerialNo) as nvarchar(10)))
Insert Into @Tab values(@RMessageId)
set @[email protected]+1
end
if(@IsReturnTable=1)
Select Id,No From @Tab

COMMIT TRANSACTION --提交事务
Return

err:
begin

raiserror(‘生成MessageId失败:%s%s‘,16,1,@Name,@EDICode)
ROLLBACK TRANSACTION

end

时间: 2024-08-30 13:10:50

SqlServer按时间自动生成生成单据编号的相关文章

按规则自动生成单据编号 以及并发问题

描述:每种单据新建时,自动生成它的单据编号. 规则如:固定码+日期+流水号 (ABC1603180001) 方法一:触发器 触发器的缺点是,执行了sql之后才看到编码. 测试:流水号不能超过最大数,否则后面的号码全是0 --有两张表,客户表和项目表,要求:新建项目时自动生成项目编号,每个不同的客户的项目的编号从1开始 --项目编号格式为PJ+"-"+"客户编号"+"-"+"日期"+"-"+"流水号

自动生成单据编号(转)

专门设计一个数据表用于存放管理软件中各种单据的最新的单据编号.编写一个存储过程用于自动生成单据编号. --****************--计算id --使用//表级排它锁//防止用户同时修改该记录--****************CREATE PROCEDURE GetId@xh integer,@id integer outAS /*如果想在连接一中锁住整个表,不允许其他事务更新表中任何记录,但可以读取记录,可使用HOLDLOCK选项,即(HOLDLOCK   等同于   SERIALI

用SQL存储过程生成唯一单据号

在一些系统中,经理要生成单据号,为了不使多台客户端生成的单据号重复,一般要在服务端生成这种流水号,本文是在数据库中生成流水号,并且可以生成多种类型的单据号(比如销售单据号,盘点单据号,进货单据号等),利用数据库锁的原理,先看一下SQL语句: CREATE PROC [dbo].[getlsh]     @lx VARCHAR(6) ,     @lsh VARCHAR(30) OUTPUT AS     BEGIN  --启动事务处理         [email protected]_poin

C# 程序自动批量生成 google maps 的KML文件

原文:C# 程序自动批量生成 google maps 的KML文件 google maps 的 KML 文件可以用于静态的地图标注,在某些应用中,我们手上往往有成百上千个地址,我们需要把这些地址和描述批量标注到 google maps 上去,如果手工来做,太耗时间,在这里我写了一个程序批量来生成这个 KML 文件. 首先看一下 KML 文件的格式: <?xml version="1.0" encoding="UTF-8"?> <kml xmlns=

Linux下按照时间和大小生成新文件的程序流程及其C代码实现

一.概述 在实际的软件开发项目中,会出现按照时间和大小生成新文件的需求.例如,某软件需求的描述如下: 按照如下两个条件之一生成新的文件: 第一,新的一天到来. 第二,文件的大小超过阈值. 本文详细介绍了根据时间和大小生成新文件的程序流程,并给出了C程序实现. 二.算法设计 对于这个按照不同的条件生成新文件的需求,在编写代码之前,我们要认真考虑以下问题: 1.如何知道当前写文件的时间与上次时间相比,是新的一天? 对于这个问题,最简单的做法是将上次写完文件之后的时间保存在内存中,等下次写文件之前读取

typescript 自动编译 生成js文件

项目文件 <?xml version="1.0" encoding="utf-8"?><Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">  <Import Project="$(MSBuildExt

ASP生成新会员编号

Function MakeUserCode OpenDB() Randomize dim getid_rs,getid set getid_rs=rsobj do while true getid="CN"&int(rnd()*(10^6)) getid_rs.open "select * from Members where User_Account='"&getid&"'",con if getid_rs.bof or

BPM合同管理——应用合同模板,自动创建生成

BPM合同管理——应用合同模板,自动创建生成 Ultimus流程化合同管理系统可以支持客户以合同模板自动生成的合同创建方式,对于具备标准化合同模板条件的客户,提供模板管理.模板套用.文本自动生成,支持企业各类合同进行自动创建. 一.合同起草方式.多场景应用 1.合同线下起草,直接附件上传 对于用户线下起草的合同附件,Ultimus流程化合同管理系统支持上传操作应用.这种起草方式最简单,但是相对而言,无法控制合同版本以及规范性,审阅时也很麻烦. 2.基于模板,把控关键合同要素 基于模版在线起草合同

根据当前日期生成16062801格式编号

之前发过一个帖子:根据日期生成编号,链接如下:http://plat.delit.cn/forum.php?m ... hlight=%B1%E0%BA%C5 现在客户要求去掉年份前面的那两个数字:那么要如何实现呢? '查询合同订单表中是否有根据当前日期生成的合同编号dim htbh = ExecuteScalar("select nvl(max(CTR_ID) + 1, '"+mid(formatdatetime(date(),"yyyyMMdd"),2,len(