SqlServer按时间自动生成生成单据编号
SET @_tmpDateTime = GETDATE()
EXEC dbo.Dtw_Common_GenerateProofCode @ProofType = 'SO',@WhsCode=@WhsCode, @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 @Name=@ProofType+@WhsCode
exec [up_GetMessageId] @Name=@Name,@EDICode='',@RMessageId=@RtnCode 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]=@Name and EdiType=@EDICode)
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]=@Name and EdiType=@EDICode and [Date]=@Date)
begin
update w_SN_EDI set serialno =@CodeQty,[Date]=@Date
where [Name]=@Name and EdiType=@EDICode
if(@@Error<>0) goto err
end
else
begin
select @SerialNo = serialno from w_SN_EDI
where [Name]=@Name and EdiType=@EDICode and [Date]=@Date
update w_SN_EDI set serialno = serialno + @CodeQty
where [Name]=@Name and EdiType=@EDICode and [Date]=@Date
if(@@Error<>0) goto err
end
end
else
begin--不清零
select @SerialNo = serialno from w_SN_EDI
where [Name]=@Name and EdiType=@EDICode
if @SerialNo=99999 set @SerialNo=0
update w_SN_EDI set serialno = @SerialNo + @CodeQty
where [Name]=@Name and EdiType=@EDICode
if(@@Error<>0) goto err
end
end
declare @end int
set @end=@SerialNo+@CodeQty
SET @RMessageId = ''
declare @Tab table(Id int identity(1,1),No varchar(50))
set @SerialNo=@SerialNo+1
while(@SerialNo<=@end)
begin
set @RMessageId=@Name+@SplitChar+@EDICode+ @SplitChar+@Date+(REPLICATE('0',@ItemCount-len(@SerialNo))+cast((@SerialNo) as nvarchar(10)))
Insert Into @Tab values(@RMessageId)
set @SerialNo=@SerialNo+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
SqlServer按时间自动生成生成单据编号的更多相关文章
- 【SQL-自动生成编号】按规则自动生成单据编号 以及并发问题_使用触发器、函数 等
描述:每种单据新建时,自动生成它的单据编号. 规则如:固定码+日期+流水号 (ABC1603180001) 方法一:触发器 触发器的缺点是,执行了sql之后才看到编码. 测试:流水号不能超过最大数,否 ...
- odoo10如何自定义自动生成单据编号
1.在已有的model中穿件一个字段name class qingjiadan(models.Model): _name = 'qingjia.qingjiadan' name = fields.Ch ...
- SQLSERVER之高灵活的业务单据流水号生成
SQLSERVER之高灵活的业务单据流水号生成 最近的工作中要用到流水号,而且业务单据流水号生成的规则分好几种,并非以前那种千篇一律的前缀+日期+流水号的简单形式,经过对业务的分析,以及参考网上程序员 ...
- 用SQL存储过程生成唯一单据号
用SQL存储过程生成唯一单据号 在一些系统中,经理要生成单据号,为了不使多台客户端生成的单据号重复,一般要在服务端生成这种流水号,本文是在数据库中生成流水号,并且可以生成多种类型的单据号(比如 ...
- makefile自动依赖生成
自动依赖生成 基于make的构建环境要正确工作, 一个很重要(也很烦人)的任务是, 在makefile中正确列 举依赖. 这个文档将介绍了一个非常有用的让make自身来创建和维护这些依赖的方法. 文章 ...
- .NET ORM框架HiSql实战-第三章-使用自定义编号生成【申请编号】
一.引言 上一篇.NET ORM框架HiSql实战-第二章-使用Hisql实现菜单管理(增删改查) 中菜单编号采用的是雪花ID,生成的编号无法自定义.比如本系统的一个申请业务,需要按前缀+日期+流水号 ...
- C# 程序自动批量生成 google maps 的KML文件
原文:C# 程序自动批量生成 google maps 的KML文件 google maps 的 KML 文件可以用于静态的地图标注,在某些应用中,我们手上往往有成百上千个地址,我们需要把这些地址和描述 ...
- PHP批量生成底部带编号二维码(二维码生成+文字生成图片+图片拼接合并)
PHP批量生成带底部编号二维码(二维码生成+文字生成图片+图片拼接合并) 需求: 输入编号如 : cb05-0000001 至 cb05-0000500 批量生成 以编号为名称的下图二维码,然后压缩 ...
- Dynamic CRM 2013学习笔记(四)单据编号及插件批量注册工具
基本上每个实体form上都会有单据编号,而且不同的实体编号要求还不太一样,这时就需要一个通用的单据编号插件,可配置以应对不同的需求. 下面简单介绍下实现步骤: 1. 创建二个实体,以保存各实体所要求的 ...
随机推荐
- HTTP协议(二):header标头说明
Header 解释 示例 Accept-Ranges 表明服务器是否支持指定范围请求及哪种类型的分段请求 Accept-Ranges: bytes Age 从原始服务器到代理缓存形成的估算时间(以秒计 ...
- iOS开发小技巧--iOS键盘 inputView 和 inputAccessoryView
iOS键盘 inputView 和 inputAccessoryView 1.inputAccessoryView UITextFields和UITextViews有一个inputAccessoryV ...
- 教你一招:Word中的文字转换成表格,把表格转换成文字
在使用office软件时,常常会在Word中加入表格,这时候我们一般想到的是,建立表格,然后一格一格的填写;或者用Excel表格制作在复制到Word文档中.其实在Word中就可以将文本文档转换成电子表 ...
- Android开发常见问题小结
1.布局文件 自己写的布局文件无得使用 原因:导入了系统的R文件 修改:将android.R 这句注释 或者删除 2.Activity作为主窗口设置 Activity无法启动,或者要设置Activit ...
- 仿QQ大战—服务器的搭建(ServerSocket)
ServerSocket(服务器): ServerSocket是JAVA中提供的用于建立服务器的类: 在客户/服务器通信模式中, 服务器端需要创建监听端口的 ServerSocket, ServerS ...
- bzoj 4553 && HEOI2016 day1t3 seq
一个序列在所有变换中都单调不降的条件是i<j,a[i]<=min[j],mx[i]<=a[j],所以套CDQ就行了. #include<iostream> #includ ...
- BZOJ 2179: FFT快速傅立叶
2179: FFT快速傅立叶 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 2923 Solved: 1498[Submit][Status][Di ...
- DropDownList控件
1.DropDownList控件 <asp:DropDownList runat="server" ID="DropDownList1" AutoPost ...
- hibernate-cache
hibernate缓存分:一级缓存.二级缓存.三级缓存 一级缓存:Session内的缓存 实例: /*一级缓存: * session内的缓存 * */ @Test public void test1( ...
- Windows远程数据同步工具cwRsync
1. cwRsync简介cwRsync是Rsync在Windows上的实现版本,Rsync通过使用特定算法的文件传输技术,可以在网络上传输只修改了的文件.cwRsync主要用于Windows上的远程文 ...