数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
关于值班管理的存储过程

作者:未知 来源:月光软件站 加入时间:2005-5-13 月光软件站

一个bt主任的要求 值班管理  要求如下

1 一组队列  n 个人, 有4种角色,领导,汉子,大妈,司机。n个人根据自己角色按顺序排好队

2 值班要求:周一到周日 1个领导值班1个司机值班;周一到周日 每晚1个汉子 值班;周六 周日 上午下午2个大妈值班;假期每天1个领导1个司机1个汉子上午下午2个大妈

3 要求队列可增删查该 ,人员顺序可以调整,队列发生变化时,值班表自动更新

4 要求队列人员随时可以抽调对列中的人员不参加本轮排序(出差或请假)下轮继续按队列顺序排序,人员抽调后 ,队列自动向前顶替

5 换班等...

建2个表

1 watching

    [datetime] 日期  [weekday]星期 [leaderid]领导id [maleid]汉子id [female1]大妈1id [female2]大妈2id  [driverid] 司机id  [mark]备注

2 watching_person

   [ordercode]人员编号 [personid] 人员id  [part]人员角色 [leave]是否离开  [mark]备注

part 为人员角色 1领导2汉子3大妈4司机

当新的队列产生时需要更细从明天以后的值班安排表(此处为30天),然后将 按角色排队好的 起始位置传给存储过程 (即 领到从第几位开始排 司机从第几位开始排 汉子 大妈...)

create proc Proc_WatchingSetup
  --参数为四种角色的起始位置
  @leader int,
  @Male int,
  @Female int,
  @Driver int
as

declare @i int                                           --计数器
declare @j int
declare @PersonID int
declare @weekday int
declare @InsertPoint datetime
declare @msg char(20)

set @i=1
set @j=1

-- 事务开始
Begin tran ReChange
--删除明天以后的记录(队列已改变删除以前的)
delete from Watching where [Datetime]>GetDate()

if (@@error <>0)
   Begin
     rollback tran
     set @msg='error1'
     return
   end

--重新插入后30天的日期和星期
while @i<=30
  begin
     insert Watching (Datetime,WeekDay) values (dateadd(day,@i,{fn curdate()}),datepart(weekday,dateadd(day,@i,{fn curdate()})))    
     set @i=@i+1
  end

if (@@error !=0)
   Begin
     rollback tran
     set @msg='error2'
     return
   end

--开始使用游标

set @j=1

--////首先按排队顺序读出领导的队列

declare cur_watchingPerson scroll cursor For
   select Personid  from watching_person where part=1 order by orderCode asc

open cur_watchingPerson

--移动到开始位置
fetch absolute @leader from cur_watchingPerson into @PersonID
if @@fetch_status=-1
   fetch first from cur_watchingperson into @PersonID

set @i=1


while @i<=30
  begin    

     while @j<=7 --最长可能是1人插入7天
       begin       
        update watching set LeaderId=@PersonID where [datetime]=(dateadd(day,@i,{fn curdate()}))       
        if (@@error !=0)
          Begin
           rollback tran
           set @msg='error3'
          return
        end
        --如果不足7天就到周末 退出循环 换人
        select @weekday=datepart(weekday,dateadd(day,@i,{fn curdate()}))
        set @i=@i+1
        if (@weekday=1)
          break
         
       end

     set @j=1
    
     fetch next from cur_watchingperson into @PersonID
     -- 如果超出边界 回头队列第一位
     if @@fetch_status=-1
        fetch first from cur_watchingperson into @PersonID
  end

Close cur_watchingPerson
deallocate cur_watchingPerson

--////////////司机很领导完全一样
declare cur_watchingPerson4 scroll cursor For
   select Personid  from watching_person where part=4 order by orderCode asc

open cur_watchingPerson4

--移动到开始位置
fetch absolute @driver from cur_watchingPerson4 into @PersonID
if @@fetch_status=-1
    fetch first from cur_watchingperson4 into @PersonID

set @i=1

while @i<=30
  begin
     while @j<=7 --最长可能是1人插入7天
       begin       
        update watching set driverId=@PersonID where [datetime]=(dateadd(day,@i,{fn curdate()}))       
        if (@@error !=0)
          Begin
          --rollback tran
          set @msg='error3'
          return
        end

        select @weekday=datepart(weekday,dateadd(day,@i,{fn curdate()}))
        set @i=@i+1
        if (@weekday=1)
          break
         
       end

     set @j=1
     fetch next from cur_watchingperson4 into @PersonID
     -- 如果超出边界 回头队列第一位
     if @@fetch_status=-1
        fetch first from cur_watchingperson4 into @PersonID
  end

Close cur_watchingPerson4
deallocate cur_watchingPerson4

--///////////

--汉子每天1人值夜班 相对容易
declare cur_watchingPerson2 scroll cursor For
   select Personid  from watching_person where part=2 order by orderCode asc

open cur_watchingPerson2

--移动到开始位置
fetch absolute @male from cur_watchingPerson2 into @PersonID
if @@fetch_status=-1
    fetch first from cur_watchingperson2 into @PersonID

set @i=1

while @i<=30
  begin
 
     update watching set MaleId=@PersonID where [datetime]=(dateadd(day,@i,{fn curdate()}))     
     if (@@error !=0)
       Begin
          rollback tran
          set @msg='error3'
          return
       end
      
      set @i=@i+1

     fetch next from cur_watchingperson2 into @PersonID
     -- 如果超出边界 回头队列第一位
     if @@fetch_status=-1   
        fetch first from cur_watchingperson2 into @PersonID
 
  end

Close cur_watchingPerson2
deallocate cur_watchingPerson2

--大妈每周六周日2人值白班
declare cur_watchingPerson3 scroll cursor For
   select Personid  from watching_person where part=3 order by orderCode asc

open cur_watchingPerson3

fetch absolute @female from cur_watchingPerson3 into @PersonID
if @@fetch_status=-1
    fetch first from cur_watchingperson3 into @PersonID

set @i=1

while @i<=30
  begin

     select @weekday=[weekday] from watching where [datetime]=(dateadd(day,@i,{fn curdate()}))
    
     --判断 只有周末的半天才值班 安排2人
     if @weekday=7 or @weekday=1
        begin   
          
        --插入第一位
        update watching set Female1=@PersonID where [datetime]=(dateadd(day,@i,{fn curdate()}))       
    
        if (@@error !=0)
         Begin
           rollback tran
           set @msg='error3'
          return
        end

        fetch next from cur_watchingperson3 into @PersonID
        -- 如果超出边界 回头队列第一位
        if @@fetch_status=-1   
           fetch first from cur_watchingperson3 into @PersonID       
        --插入第二位
        update watching set Female2=@PersonID where [datetime]=(dateadd(day,@i,{fn curdate()}))       
    
        if (@@error !=0)
         Begin
          --rollback tran
           set @msg='error3'
          return
        end

       end
      
      set @i=@i+1
      fetch next from cur_watchingperson3 into @PersonID
        -- 如果超出边界 回头队列第一位
        if @@fetch_status=-1   
           fetch first from cur_watchingperson3 into @PersonID    
 
  end

Close cur_watchingPerson3
deallocate cur_watchingPerson3

commit tran

以上为队列改变时生成新值班安排的存储过程

其他 诸如 规定假期 调整人员 大同小异 欢迎批评指正




相关文章

相关软件