触发器维护已经用编号/未用编号

原创 2004年08月23日 12:48:00

原帖地址:

http://community.csdn.net/Expert/topic/3298/3298074.xml?temp=.6988336

table1为初始化数据,table2为已用票据

在table2上写触发器,table2每insert,update,or 批量delete时,实时体现tabel1的'已用票号','已用票数', '结余票号','结余票数'的值.

-----------------------------------------------------------------------------------------------------------------------


--示例

--示例数据
create table table1(序号 int,类别 varchar(10),起始号 char(7),终止号 char(7),总数 int,已用票号 varchar(8000),已用票数 int,结余票数 int,结余票号 varchar(8000),组合编号 varchar(20))
insert table1 select 1,'A','0000001','0000010',10,NULL,0,10,'0000001-0000010','A-0000001-0000010'
union  all    select 2,'B','0000011','0000020',10,NULL,0,10,'0000011-0000020','B-0000011-0000020'

create table table2(组合编号 varchar(20),类别 varchar(10),票号 char(7))
go

--触发器
create trigger tr_process on table2
for insert,update,delete
as
select id=identity(int,1,1)
 ,a.组合编号,a.票号
 ,b.起始号,b.终止号
 ,已用票号=cast(null as [varchar] (8000))
 ,结余票号=cast(null as [varchar] (8000))
into #t
from table2 a,table1 b
where a.组合编号=b.组合编号
 and (exists(select 1 from inserted where 组合编号=a.组合编号)
  or exists(select 1 from deleted where 组合编号=a.组合编号))
order by a.组合编号,a.票号

declare @组合编号 varchar(20),@票号 int
 ,@已用票号 varchar(8000),@结余票号 varchar(8000)

update #t set
 @已用票号=case
  when 组合编号=@组合编号
  then case
   when 票号=@票号+1
   then case
    when right(@已用票号,1)='-'
    then @已用票号+票号
    else left(@已用票号,len(@已用票号)-7)+票号
    end
   else case
    when right(@已用票号,1)='-'
    then left(@已用票号,len(@已用票号)-1)
    else @已用票号 end+','+票号+'-'
    end
  else 票号+'-'
  end,
 @结余票号=case
  when 组合编号=@组合编号
  then case
   when 票号=@票号+1
   then left(@结余票号,len(@结余票号)-8)
   when right(9999999+票号,7)+'-'=right(@结余票号,8)
   then left(@结余票号,len(@结余票号)-1)+','
   else @结余票号+right(9999999+票号,7)+','
   end+right(10000001+票号,7)+'-'
  else case
   when 起始号=票号
   then ''
   when cast(起始号 as int)+1=票号
   then 起始号+','
   else 起始号+'-'+right(9999999+票号,7)+','
   end+right(10000001+票号,7)+'-'
  end,
 已用票号=@已用票号,
 结余票号=@结余票号,
 @票号=票号,
 @组合编号=组合编号

update a set
 已用票号=case
  when right(b.已用票号,1)='-'
  then left(b.已用票号,len(b.已用票号)-1)
  else b.已用票号
  end,
 结余票号=case
  when b.终止号=b.票号+1
  then left(b.结余票号,len(b.结余票号)-1)
  when len(b.结余票号)=8 and b.终止号<stuff(b.结余票号,1,1,'')
  then ''
  when b.终止号<left(right(b.结余票号,8),7)
  then left(b.结余票号,len(b.结余票号)-9)
  else b.结余票号+b.终止号
  end,
 已用票数=c.已用票数,
 结余票数=a.总数-c.已用票数
from table1 a,#t b,(
 select id=max(id),已用票数=count(*)
 from #t
 group by 组合编号
)c where a.组合编号=b.组合编号
 and b.id=c.id

--处理在子表中被全部删除的数据
if exists(select 1 from deleted a where not exists(select 1 from table2 where 组合编号=a.组合编号))
 update a set 已用票号='',已用票数=0,结余票数=a.总数,结余票号=a.起始号+'-'+a.终止号
 from table1 a,(
  select distinct 组合编号 from deleted a
  where not exists(select 1 from table2 where 组合编号=a.组合编号)
 )b where a.组合编号=b.组合编号
go

--插入第1条记录
insert table2 select 'A-0000001-0000010','A','0000001'

--显示结果
select 序号,已用票号,已用票数,结余票数,结余票号,组合编号 from table1
go

--插入第2条记录
insert table2 select 'A-0000001-0000010','A','0000002'

--显示结果
select 序号,已用票号,已用票数,结余票数,结余票号,组合编号 from table1
go

--插入第3条记录
insert table2 select 'A-0000001-0000010','A','0000004'

--显示结果
select 序号,已用票号,已用票数,结余票数,结余票号,组合编号 from table1
go

--插入第4条记录
insert table2 select 'A-0000001-0000010','A','0000003'

--显示结果
select 序号,已用票号,已用票数,结余票数,结余票号,组合编号 from table1
go

--修改记录
update table2 set 组合编号='B-0000011-0000020',票号='0000011'
where 组合编号='A-0000001-0000010' and 票号='0000002'

--显示结果
select 序号,已用票号,已用票数,结余票数,结余票号,组合编号 from table1
go

--批量删除:
delete from table2
where 票号 in ('0000001','0000002','0000011')

--显示结果
select 序号,已用票号,已用票数,结余票数,结余票号,组合编号 from table1
go

--删除测试
drop table table1,table2

/*--结果自己看--*/

触发器(trigger) 日期+流水=编号

create table tb(colID int identity,status int,ID nvarchar(14))gocreate trigger test on tbfor insert,...
  • simonhehe
  • simonhehe
  • 2007年08月23日 17:17
  • 821

触发器维护已经用编号/未用编号

table1为初始化数据,table2为已用票据在table2上写触发器,table2每insert,update,or 批量delete时,实时体现tabel1的已用票号,已用票数, 结余票号,结余...
  • emailqjc
  • emailqjc
  • 2010年02月08日 13:51
  • 243

触发器维护已经用编号/未用编号

原帖地址:http://community.csdn.net/Expert/topic/3298/3298074.xml?temp=.6988336table1为初始化数据,table2为已用票据在t...
  • chenzhiya
  • chenzhiya
  • 2008年01月03日 15:12
  • 128

SQL Server 开发之 使用触发器自动编号

使用SQL Server创建数字类型的字段,可以设置为自动编号。但很多时候并不能满足我们的需求,例如为学生编号时,可能要用到年级、系别等再加上流水号进行编号。下面给一个简单的例子,使用触发器来进行自动...
  • fengfangfang
  • fengfangfang
  • 2006年06月29日 13:20
  • 4510

公式编辑器右对齐+自动编号

word, MathType, 自动编号, 公式引用
  • CaiCai1666
  • CaiCai1666
  • 2016年10月21日 19:41
  • 794

sql server触发器自动生成编号

--创建编号 alter TRIGGER syttyzNumberCreate ON syttyz after INSERT AS DECLARE @id nvarchar...
  • myk_666888
  • myk_666888
  • 2010年07月21日 16:51
  • 1070

编号范围维护综述

在SAP系统中,各类主数据及单据都需要使用编号进行唯一性标识,以此形成后台有着大量编号范围维护的配置操作,种类繁多。 编号范围维护分为两部分: 1.号码段的定义; 2.给数据对象分配号码段。 ...
  • zhongguomao
  • zhongguomao
  • 2017年04月27日 14:59
  • 288

Dynamics CRM 2011 编程系列(27):使用触发器

在Dynamics CRM系统中使用触发器虽然不被官方建议,但却是解决一些疑难需求的有力工具。它也能快速的解决一些比较常用的需求,例如:编号。触发器和插件的使用背景很像,那我们什么应该怎样来对它们进行...
  • ghostbear
  • ghostbear
  • 2012年06月19日 14:05
  • 4403

oracle如何写一个触发器及序列号

通过PL\SQL工具就可以实现下列的这些代码,下面讲一个oracle如何设置序列自动增长 --创建表     createtable book(         bookId varchar2...
  • zhousenshan
  • zhousenshan
  • 2016年02月27日 16:03
  • 278

结构数组模拟零件数据库

需求( 339页): 此程序用来维护仓库存储的零件的信息数据库. 程序围绕一个结构数组建立, 且每个结构包含以下信息: 零件的编号, 零件的名称以及某种零件的数量. 程序将支持以下操作:1. 添加新零...
  • lgg201
  • lgg201
  • 2009年12月28日 08:38
  • 1074
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:触发器维护已经用编号/未用编号
举报原因:
原因补充:

(最多只允许输入30个字)