日期:2014-05-17  浏览次数:20427 次

求助关于触发器更新语句不能达到想要效果
小弟发贴时分数只有36分...希望大哥们行行好帮助一下小弟。
代码如下,
目的是自动生成PSBillNo,
如果FComboBox1 和Fdate 修改后就更新PSBillNo,
如果这两个字段没有修改则保存新增时的PSBillNo,
PSBillNo的生成依据是FComboBox1 +Fdate计算的结束日期的年月+流水号,
而流水号的依据是FComboBox1 +Fdate计算的结束日期的年月,如果单据中而在这两个的组合,即取最大值再增加一位

问题:现在修改FComboBox1 和Fdate有变动之后,PSBillNo重新生成流水号依据不成功,求助

SQL code

ALTER   TRIGGER [dbo].[Update] ON [dbo].[t_HTPS]
FOR  Update,insert 
AS
begin

DECLARE @FNO nvarchar(10) --顺序号
DECLARE @FComboBox1 nvarchar(2)--订单类型英文简写
DECLARE @FComboBox1Del nvarchar(2)--删除前的订单类型英文简写
DECLARE @FStartdate DateTime --开始时间
DECLARE @FEnddate DateTime --结束时间
DECLARE @Fdate DateTime --单据时间
DECLARE @FdateDel DateTime --删除前的单据时间
DECLARE @Fid Int --单据内码


--取删除前的代号和删除前的日期
select
@FComboBox1Del=FComboBox1,
@FdateDel=Fdate
from deleted
--取更新前的单据内码、订单类型、当月开始和结束时间

select @Fdate=Fdate,@Fid=fid,@FComboBox1=FComboBox1,
@FStartdate=
case
when datepart(day,Fdate)>=26 then dateadd(day,-(datepart(day,Fdate)-26),Fdate)
when datepart(day,Fdate)<26 then dateadd(day,26-datepart(day,dateadd(month,-1,Fdate)),dateadd(month,-1,Fdate))
end,
@FEnddate=
case
when datepart(day,Fdate)>=26 then dateadd(day,-(datepart(day,dateadd(month,1,Fdate))-25),Fdate)
when datepart(day,Fdate)<26 then dateadd(day,25-datepart(day,Fdate),Fdate)
end
from inserted


--取顺序号
set @FNO=(select top 1 convert(varchar,REPLICATE(0,3-len(right(PSBillNo,3)+1))) + convert(varchar,right(PSBillNo,3)+1) From T_htps where FComboBox1=@FComboBox1 and Fdate between @FStartdate and @FEnddate order by PSBillNo desc)

--如果本月没有生成过此类订单的顺序号,那么开始顺序号为001
if @FNO is null or @FNO=''
begin
set @FNO='001';
end


--更新
if @FComboBox1!=@FComboBox1Del or @Fdate!=@FdateDel
begin
update T_htps set PSBillNo=convert(varchar,@FComboBox1)+convert(varchar,substring(convert(char(12),@FEnddate,112),3,2))+convert(varchar,substring(convert(char(12),@FEnddate,112),5,2))+convert(varchar,@FNO) 
where fid=@fid and PSBillNo!='' and (FComboBox1!=@FComboBox1Del or Fdate!=@FdateDel)
end
else if @FComboBox1!=@FComboBox1Del and @Fdate=@FdateDel
begin
update T_htps set PSBillNo=convert(varchar,@FComboBox1)+convert(varchar,substring(convert(char(12),@FEnddate,112),3,2))+convert(varchar,substring(convert(char(12),@FEnddate,112),5,2))+convert(varchar,@FNO) 
where fid=@fid and PSBillNo=''
end


end




------解决方案--------------------
因为在你的update中有and PSBillNo=''这个条件。
这个去掉就行。

------解决方案--------------------
检查下你两个判断if后面的条件,感觉逻辑不严谨