关于值班管理的存储过程

存储过程

一个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 intas

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

set @i=1set @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 @PersonIDif @@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_watchingPersondeallocate 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 @PersonIDif @@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_watchingPerson4deallocate 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 @PersonIDif @@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_watchingPerson2deallocate 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 @PersonIDif @@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_watchingPerson3deallocate cur_watchingPerson3

commit tran

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

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

时间: 2024-10-04 19:17:47

关于值班管理的存储过程的相关文章

VSS管理存储过程

问题描述 环境:VS2005,SQL2005怎么在VS2005中找不到开启存储过程版本控制(VS2003有),在VS2005中怎么解决?请各位大大帮帮忙,急!!! 解决方案 解决方案二:是否安装了VS的VSS的管理?如下:1.运行VisualStudio.NET安装程序.2.在"服务器组件"下,选择"VS6存储过程版本控制".3.单击"立即更新"或"安装"以安装所需的组件.解决方案三:我的VS已经使用了VSS,我装的VS200

面向WEB2.0的IT服务管理平台

按照ITIL的服务理念和服务水平的成熟程度要求,金保工程数据中心在信息技术的管理标准.服务流程和服务质量上还有待改善,目前的IT服务管理水准与实现信息技术资源共享.信息技术专业服务的要求相比较,有一定差距. 用户需求: 通过IT运维管理项目建设,劳保部希望可以实现网络的集中监控和统一展现,规范IT服务管理流程,有效管理整个IT基础设施和服务的配置信息,对事件和问题能够做到"主动"管理,摆脱"被动局面". 应用效果: 实施Broadview方案后,劳动保障部信息中心可

房地产行业协同管理解决方案

1.整体介绍 万户公司在分析了房地产行业的业务特点以及管理存在的问题,针对我国房地产行业的现状和未来发展趋势,提出了一套完整的万户协同办公系统房地产行业解决方案. 万户ezOFFICE 协同办公系统提供的基础功能可以很好的解决企业的基础管理存在的问题,如企业知识无法有效的共享传递和创新.企业流程审批不规范和审批效率低下.员工沟通交流不畅.办公成本高等问题.在此基础上针对于房地产行业分支机构较多如何统一管理问题,员工存在经常性的异地办公的现象,如何保证OA信息安全性问题,企业领导关注信息需要多样性

公共事业企业协同管理解决方案

每个单位都会存在一些很个性化的应用需求,如何快速解决这些个性化的需求是企业和软件供应商都很头疼的事情.万户ezOFFICE协同办公系统提供的自定义平台就专门为满足这些个性化的功能需求而设计,经过简单培训客户的系统管理员可以方便快捷的搭建各种应用系统如:交通卡管理.值班管理.合理化建议管理.合同管理.外出管理.来访管理等. 门户化设计为让各种信息轻松整合展现 ezOFFICE提供的门户化套件,为企业的不同类型用户设计个性化的访问门户,用户通过一个入口可以查看自己权限内的其他业务系统信息.OA内部信

MS SQL 2005 安全设置

安全 拿到MS SQL 2005还没有一天,总的来说,MS SQL 2005的安全性比SQL 2000要强上不少,不过默认设置还是有和原来一样的漏洞,下面我们来修改一下默认设置. 1.安装MSSQL时使用混合模式,当然SA密码最好不能为空,在SQL2005中,可以对SA这个超级用户名进行修改或删除.use masterALTER LOGIN [sa] WITH NAME=[zxs] /*修改SA帐号*/sp_password '111111','123456','sa' /*修改SA密码*/使用

封网!奥运期间在站长圈里的一个新名词.

相关很多站长对下面的通知或相类似的信息一定不陌生,是的,封网,这个是一个最近刚刚在站长圈内流传的新名词,封网,站长们准备好了吗? -------------------------------------------------- 奥运封网期间(8月1日-8月25日),机房停止进出服务器等设备,并且请重视以下通知,以免服务器被断网无法恢复. 1. 在封网期间如果被网安通知有违法信息.发生用户网站内容被黑.被篡改成反动.未经中央电视台授权许可擅自转播奥运会赛事等,机房将在第一时间断开此网站的连接,

认识VF--Visual FoxPro 漫谈

visual BOE.COM Article Resource News Links About US      文章标题Visual FoxPro 漫谈 作品来源BOE 数据网络工作室 创建日期 2001年02月23日 最后更新 2002年07月21日  文字数量 约22000字 作者姓名 陈纯 译者姓名 原创作品 无译者 版权声明 版权属于BOE 数据网络工作室  相关下载 --  细节描述      作为市场上最灵活和功能最强大的数据库管理系统,Visual FoxPro拥有悠久而辉煌的发

SQL Server 2000安全配置完全攻略

server|安全|攻略 数据库是电子商务.金融以及ERP系统的基础,通常都保存着重要的商业伙伴和客户信息.大多数企业.组织以及政府部门的电子数据都保存在各种数据库中,他们用这些数据库保存一些个人资料,比如员工薪水.个人资料等等.数据库服务器还掌握着敏感的金融数据.包括交易记录.商业事务和帐号数据,战略上的或者专业的信息,比如专利和工程数据,甚至市场计划等等应该保护起来防止竞争者和其他非法者获取的资料.数据完整性和合法存取会受到很多方面的安全威胁,包括密码策略.系统后门.数据库操作以及本身的安全

SQL Server 2000的安全配置

server|安全 在进行SQL Server 2000数据库的安全配置之前,首先你必须对*作系统进行安全配置, 保证你的*作系统处于安全状态.然后对你要使用的*作数据库软件(程序)进行必要的安全审核, 比如对ASP.PHP等脚本,这是很多基于数据库的WEB应用常出现的安全隐患, 对于脚本主要是一个过滤问题,需要过滤一些类似 , ' @ / 等字符,防止破坏者构造恶意的SQL语句. 接着,安装SQL Server2000后请打上补丁sp1以及最新的sp2. 下载地址是:http://www.mi