关于值班管理的存储过程

2016-01-29 16:51 10 1 收藏

关于值班管理的存储过程,关于值班管理的存储过程

【 tulaoshi.com - SQLServer 】

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

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

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

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

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()

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/sqlserver/)

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()}))
     &nb

来源:https://www.tulaoshi.com/n/20160129/1499655.html

延伸阅读
标签: Web开发
CREATE PROC myx_prPageRecordset @queryStr nvarchar(1000),  @keyField nvarchar (200),  @pageSize int,  @pageNumber int  AS BEGIN DECLARE @sqlText AS nvarchar(4000) DECLARE @sqlTable AS nvarchar(4000) SET @sqlTable =&n...
标签: SQLServer
前言 一直用ASP+ACCESS来编写网页和公司的内部应用系统,内部应用系统也就是大家说的OA吧,这个我也不知道,公司又叫它ERP,反正不管什么,它是用来帮助公司处理日常工作的,简化劳动的.从来没用过存储过程,所有的添加,删除,修改都是在ASP里面写程序执行,代码很多.数据量少的时候没什么感觉,挺快的,可等到数据量大的时候,上W条记录查询,尤其是不...
标签: Web开发
1.调用存储过程的一般方法 先假设在sql server中有一存储过程dt_users: CREATE PROCEDURE [dbo].[dt_users] AS select * from users return GO 第一种方法是不利用command对象,直接用recordset对象 set rs=server.createobject("adodb.recordset") sql="exec dt_users" rs.open sql,c...
不过在网上找了一些,发现都有一个特点——就是不能传出总记录数,干脆自己研究吧。终于,算是搞出来了,效率可能不是很好,但是我也觉得不错了。贴代码吧直接:也算是对自己学习mysql的一个记录。 代码如下: CREATE PROCEDURE p_pageList ( m_pageNo int , m_perPageCnt int , m_column varchar(1000) , m_tab...
sql语句执行的时候要先编译,然后执行。存储过程就是编译好了的一些sql语句。用的时候直接就可以用了。所以效率会高 一 存储过程介绍 存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化 后存储在数据库服务器中,使用时只要调用即可。在ORACLE中,若干个 有联系的过程可以组合在一起构成程序包。 使用存储过程有以下的优点: * 存...

经验教程

130

收藏

48
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部