关于值班管理的存储过程

来源:互联网 发布:linux下的caffe安装 编辑:程序博客网 时间:2024/06/05 07:33
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
 一个bt主任的要求值班管理 要求如下

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

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

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

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

5换班等...

建2个表

1watching

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

2watching_person

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

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

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

createprocProc_WatchingSetup
 --参数为四种角色的起始位置
 @leaderint,
 @Maleint,
 @Femaleint,
 @Driverint
as

declare@iint                                          --计数器
declare@jint
declare@PersonIDint
declare@weekdayint
declare@InsertPointdatetime
declare@msgchar(20)

set@i=1
set@j=1

--事务开始
BegintranReChange
--删除明天以后的记录(队列已改变删除以前的)
deletefromWatchingwhere[Datetime]>GetDate()

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

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

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

--开始使用游标

set@j=1

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

declarecur_watchingPersonscrollcursorFor
  selectPersonid fromwatching_personwherepart=1orderbyorderCodeasc

opencur_watchingPerson

--移动到开始位置
fetchabsolute@leaderfromcur_watchingPersoninto@PersonID
if@@fetch_status=-1
  fetchfirstfromcur_watchingpersoninto@PersonID

set@i=1


while@i<=30
 begin    

    while@j<=7--最长可能是1人插入7天
      begin       
       updatewatchingsetLeaderId=@PersonIDwhere[datetime]=(dateadd(day,@i,{fncurdate()}))       1

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>