一个有问题的存储过程。甚急!!!(200分)

  • 主题发起人 主题发起人 LittleSong
  • 开始时间 开始时间
L

LittleSong

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾,我写了一个考勤的程序。要求自动处理三班倒,二班倒的问题。
我写了一个存储过程,处理的结果总是有问题,我实在找不出问题处在那儿。
请大虾帮忙看一下。谢谢。

职工排班表结构:
编号 char(8)
班次名称 varchar(20)
日期 datetime //班次变更日期
原班次名称 varchar(20)

班次表结构:
班次名称 varchar(20)
上班时间 datetime
下班时间 datetime
聚组 integer //确定同一组班次
次序 integer
周期 integer

CREATE PROCEDURE sp_AutoChangeRuns
@CurrentDate DateTime
AS

Declare @BarCode char(8)
Declare @TheDate DateTime
Declare @LastRuns VarChar(20)
Declare @Runs VarChar(20)
Declare @JZ integer
Declare @NextOne integer
DeClare @Cycle integer

Declare RunsCursor cursor for Select 编号,班次名称,班次起始日期,原班次名称 from 职工排班表 where 班次名称 in (Select 班次名称 from 班次表 where 聚组 <> 0) for Update

open RunsCursor
Fetch RunsCursor into @BarCode,@Runs,@TheDate,@LastRuns

while @@Fetch_Status = 0 begin
Select @JZ=聚组,@NextOne=次序,@Cycle=周期 from 班次表 where 班次名称=@Runs
if DateDiff(DD,@TheDate,@CurrentDate)>=@Cycle begin
Select @LastRuns = @Runs
Select @Runs=班次名称 from 班次表 where 聚组=@JZ and 次序=@NextOne+1
if IsNull(@Runs,'Why')='why'begin
Select @Runs=班次名称 from 班次表 where 聚组=@JZ and 次序=1
end

Update 职工排班表 set 班次名称=@Runs,班次起始日期=DateAdd(DD,@Cycle,@TheDate),原班次名称=@LastRuns where Current of RunsCursor
end

Fetch Next from RunsCursor into @BarCode,@Runs,@TheDate,@LastRuns
end

Close RunsCursor
Deallocate RunsCursor
 
举个例来说明结果的问题?
 
是结果不对还是语法通不过
 
是结果不对:

比方说 :
有班次:
a1,a2,a3;//一组
b1,b2,b3;//二组
.
.
.//n组
工人 XX 本周上a3,下周应上a1,但结果为 b3;
实际上 n1->n2->n3 不发生错误。
在n3->n1 时结果 莫名其妙?可能全都是 b3,或其他的x3!!

 
哈哈,我知道原因了。

当你
Select @Runs=班次名称 from 班次表 where 聚组=@JZ and 次序=@NextOne+1
时返回null,但他并不破坏@Runs中的数据,所以真确的过程应该为:



CREATE PROCEDURE sp_AutoChangeRuns
@CurrentDate DateTime
AS

Declare @BarCode char(8)
Declare @TheDate DateTime
Declare @LastRuns VarChar(20)
Declare @Runs VarChar(20)
Declare @JZ integer
Declare @NextOne integer
DeClare @Cycle integer

Declare RunsCursor cursor for Select 编号,班次名称,班次起始日期,原班次名称 from 职工排班表 where 班次名称 in (Select 班次名称 from 班次表 where 聚组 <> 0) for Update

open RunsCursor
Fetch RunsCursor into @BarCode,@Runs,@TheDate,@LastRuns

while @@Fetch_Status = 0 begin
Select @JZ=聚组,@NextOne=次序,@Cycle=周期 from 班次表 where 班次名称=@Runs
if DateDiff(DD,@TheDate,@CurrentDate)>=@Cycle begin
Select @LastRuns = @Runs,@Runs=null ----将@Runs付值null.
Select @Runs=班次名称 from 班次表 where 聚组=@JZ and 次序=@NextOne+1
if IsNull(@Runs,'Why')='Why'begin
Select @Runs=班次名称 from 班次表 where 聚组=@JZ and 次序=1
end

Update 职工排班表 set 班次名称=@Runs,班次起始日期=DateAdd(DD,@Cycle,@TheDate),原班次名称=@LastRuns where Current of RunsCursor
end

Fetch Next from RunsCursor into @BarCode,@Runs,@TheDate,@LastRuns
end

Close RunsCursor
Deallocate RunsCursor


----测试环境Win98+Ms SQL7.0
 
原因很简单,当NextOne到最大值时,下面一句的条件为False,就不会执行@Runs=班次名称,
所以@Runs还为以前的最大值,如你的示例中的3,如果你先初始话再调用这句就不会又问题了.


Select @Runs=班次名称 from 班次表 where 聚组=@JZ and 次序=@NextOne+1
 

Similar threads

后退
顶部