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. 创建二个实体,以保存各实体所要求的 ...
随机推荐
- 软件工程(FZU2015)赛季得分榜,第六回合
目录 第一回合 第二回合 第三回合 第四回合 第五回合 第6回合 第7回合 第8回合 第9回合 第10回合 第11回合 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分 ...
- Java链栈
package com.lxm.customDataStructure; public class LinkStack<T>{ class Node<T>{ T data; N ...
- redis 学习 01(下载 学习资源)
1. windows 版 redis 下载地址 https://github.com/MSOpenTech/redis/releases 2. redis 实战源码 http://redisinact ...
- 为开发者准备的 Android 函数库(2016 年版)
转载:http://www.androidchina.net/5922.html第三方函数库(译者注:包括第三方提供的 SDK,开源函数库)以惊人的方式助力着 Android 开发,借助这些其他开发人 ...
- MySQL复制配置(多主一从)
复制多主一从 replicaion 原理 复制有三个步骤:(分为三个线程 slave:io线程 sql线程 master:io线程) 1.master将改变记录到二进制日志(binary log)中( ...
- TypeError: 'bool' object is not callable g.user.is_authenticated()
此问题查了stackoverflow后知道is_authenticated是一个属性而不是一个方法所以g.user.is_authenticated() 用法会报错
- C#利用System.Net发送邮件(带 抄送、密送、附件、html格式的邮件)
net2.0后,C#可以利用System.Net发送邮件了. 代码整理如下: 3. 增加IProcessMessage类,定义了一个消息方法,用于消息传递 /********************* ...
- [NHibernate]HQL查询
目录 写在前面 文档与系列文章 查询的几种方式 HQL查询 一个例子 总结 写在前面 上篇文章介绍了nhibernate在项目中的基本配置,包括数据库连接字符串的设置,映射文件的配置及需注意的地方,这 ...
- [NHibernate]增删改操作
目录 写在前面 文档与系列文章 添加数据 删除数据 修改数据 添加修改数据 总结 写在前面 上篇文章介绍了nhibernate的基于面向对象的条件查询.对一个项目来说,增删改查是必不可少的,虽然实现方 ...
- Ubuntu 12.4 Apache2 安装教程
一.更新操作系统 sudo apt-get update && sudo apt-get upgrade 二.安装Apache及依赖 sudo apt-get install apac ...