求救:谁给我编一个触发器,300分。基于SQL SERVER7.0的。(300分)

  • 主题发起人 主题发起人 王晓明
  • 开始时间 开始时间

王晓明

Unregistered / Unconfirmed
GUEST, unregistred user!
谁能给我编一个SQL SERVER7.0上的触发器,以产生一个唯一的凭证号,规则是年月+顺序号
(例如:2001020001,表示2001年2月份第一号单据,请高手们给我一个精确的代码,我感激
不尽!我的数据库表名称是RKMX,凭证编号字段是R_PZBH。
 
可以用过程,怎么不用过程呢?
 
我一直是这样用的,不过可惜我用的是InterBase,对MSSQL没有研究。
 
以下是本人编的一个存储过程,和你要求差不多。稍微改一下就可以了。
DROP PROCEDURE get_next_id;
CREATE PROCEDURE get_next_id @next_id char(14) out AS
DECLARE @current_id numeric(14), @current_date char(8)

SELECT @current_id=MAX(CONVERT(numeric(14,0),apply_id)) FROM yf_apply

SELECT @current_date=CONVERT(char(8), getdate(),112)

if (@current_id=null) or (substring(str(@current_id),1,8)<@current_date)
begin
SELECT @next_id=@current_date+'000001'
end
else
begin
if substring(str(@current_id),1,8)=@current_date
SELECT @next_id=str(@current_id+1)
else
if substring(str(@current_id),1,8)>@current_date
begin
raiserror 30001 "服务器日期不正确,不能进行数据录入。请与系统管理员联系!!!"
return
end
end;
 
建议用存储过程来完成更好,如果你的凭证号不是主关键字,或者在插入时先用了临时标记来
表示凭证号,也可以用下面这个触发器来生成插入记录的凭证号:

CREATE TRIGGER RKMX_INS ON [dbo].[RKMX]
FOR INSERT
AS
DECLARE @cid numeric(10),
@cdate char(6)

select @cdate=convert(char(6), getdate(),112)
select @cid=max(convert(numeric(4,0),substring(R_PZBH,7,4))) from RKMX
where R_PZBH like @cdate
if (@cid=null)
begin
update RKMX set R_PZBH=@cdate+'0001' where R_PZBH='***'
/*‘***’为临时标志,如果有其他关键字该条件也可写为R_ID=inserted.R_ID */
end
else
begin
select @cid=@cid+1
update RKMX set R_PZBH=@cdate+convert(char(4),@cid) where R_PZBH='***'
end;

哈哈,我也没测试过,有错误还请指正
 
以下是本人编的一个存储过程,和你要求差不多。稍微改一下就可以了。

declare
@y char(4),@m char(2),@d char(2),@h char(2),
@mi char(2),@s char(2)

select @y=datepart(yyyy, getdate())
select @m=datepart(mm, getdate())
select @d=datepart(dd, getdate())
select @h=datepart(hh, getdate())
select @mi=datepart(mi, getdate())
select @s=datepart(ss, getdate())

if datalength(rtrim(@m))=1
select @m='0'+ @m
if datalength(rtrim(@d))=1
select @d='0'+ @d
if datalength(rtrim(@h))=1
select @h='0'+ @h
if datalength(rtrim(@mi))=1
select @mi='0'+ @mi
if datalength(rtrim(@s))=1
select @s='0'+ @s

select @testid=rtrim(ltrim(@y))+rtrim(ltrim( @m))
+rtrim(ltrim( @d))+rtrim(ltrim( @h))+rtrim(ltrim( @mi))
+rtrim(ltrim( @s))
 
declare @Thedate datetime
declare @yearPart varchar(10)
declare @monthPart varchar(10)
declare @daypart varchar(10)
set @TheDate=current_timestamp
set @monthPart=convert(varchar(10),month(@TheDate))
set @yearpart=convert(varchar(10),year(@TheDate))
if len(@monthpart)=1
set @monthPart="0"+@monthPart
print @yearpart+@monthPart
200106
大致语法就用到这些,后面部分先select出来,处理,补上,就可以了
 
我来吧。

首先,你的表中还必须有一个字段,代表这是几月份的凭证(可能不能用当前日期,因为可能这个月输上个月的),
如这个字段叫dt,char(6)形如200106之类的。则你的trigger可以这样写.

create trigger tr on rxmx for insert as
declare @dt char(6)
declare @num int
select @dt=select dt from inserted
select @num=select count(*) from rxmx
update inserted
set r_pzbh=@dt+convert(char(4),@num+1)

我是一步步写的,你也可以合起来写
 
多人接受答案了
 
后退
顶部