本帖轉過來得﹐原來那帖說得不明不白
有3個表﹐我分別說明一下:
表一:km_shift
     
        @u_shiftid [char] (5),         --pk,班別ID
@u_shiftname [nvarchar] (100), --班別名稱
@u_stime1 [char] (4),          --上班1開始時間
@u_etime1 [char] (4),          --上班1結束時間
@u_times1 [numeric](4,1),      --上班時間合計 開始時間1減去結束時間,比如0700-0900 上班時間為2.0
@u_stime2 [char] (4),          --上班2開始時間
@u_etime2 [char] (4),
@u_times2 [numeric](4,1),
@u_stime3 [char] (4),
@u_etime3 [char] (4),
@u_times3 [numeric](4,1),
@u_update [datetime],           --更新時間﹕當前時間即可
@u_upuser [char] (10)           --更新人﹐登陸用戶,登陸時得到     
        上班時間1--3就是指得3個時間段,再程序中都是利用u_stime和u_etime顯示
          left(u_stime1,2) + ':' + right(u_stime1,2) + '-' + left(u_etime1,2) + ':' + right(u_etime1,2)  as u_stime1
表二﹕km_groupshift
      
        @u_groupid [char] (5),         --pk,組別代碼
@u_no [char] (2),              --pk,自增長﹐2為得序列號
@u_shiftid [char] (5),         --班別代碼
@u_update [datetime],
@u_upuser [char] (10)
      表三: km_shiftg
      
        @u_dataid [char] (2),          --pk,廠別﹐登陸時得到
@u_date [datetime],            --pk,排班日期
@u_groupid [char] (5),         --pk,組別代碼
@u_shiftid [char] (5),         --pk,班別代碼
@u_update [datetime],          --更新日期
@u_upuser [char] (10)          --更新人﹐登陸用戶﹐登陸時得到
      
說明下各表關系
表一:km_shift是個基本表﹐生成班別名稱及上班時間段如﹕
----u_shiftid------u_shiftname----u_stime1----u_etime1----u_times1---  (2,3略)
      001              白班            0700       0900        2.0  
      002              OFF           ----       ----        ----  
表二:km_groupshift 生成以組別為區分得排班輪次表
     如果用戶選擇了A組﹐那么7/1循環﹐既是插入7個班別名稱﹐7個中有一個為OFF休息日
     比如用戶選擇了A組﹐那么插入之后得結果應該是
     組別有張專門得表km_group(存放u_groupid,u_groupname)
--u_groupid---u_no--u_shiftid---u_upuser---u_update
      001(A組) 01       001(白班)  super     ......
      001      02       001       super     ......
      001      03       001       super     ......
      001      04       001       super     ......
      001      05       001       super     ......
      001      06       001       super     ......
      001      07       002(OFF)  super     ......  
這里就是我說得一個7/1循環了﹐這個其實就是再排班得時候用到﹐以它為基本﹐按照日期比如 2008/05/01--2008/05/21
﹐21天的話﹐就應該循環3次﹐下面說明
表三:km_shiftg (既是我希望大家幫寫存儲過程的表)
     這個表用到了表一的那3段時間﹐雖然表中不要求插入那3段時間的值﹐但是再程序界面中是要根據班別﹐顯示相應的3個上班時間段.
     表實際插入結果:super用戶進的3廠﹐選擇了001(A)組排班﹐A組已經在km_groupshift表中有7/1循環
--u_dataid---------u_date------u_groupid-----u_shiftid-----u_upuser-----u_update
    03(廠的id)    2008/05/01       001           001(白班)    SUPER       .... 
    03(廠的id)    2008/05/02       001           001          SUPER       ....  
    03(廠的id)    2008/05/03       001           001          SUPER       ....  
    03(廠的id)    2008/05/04       001           001          SUPER       ....  
    03(廠的id)    2008/05/05       001           001          SUPER       ....  
    03(廠的id)    2008/05/06       001           001          SUPER       ....  
    03(廠的id)    2008/05/07       001           002(OFF)     SUPER       ....
    03(廠的id)    2008/05/08       001           001(白班)    SUPER       ....  
    03(廠的id)    2008/05/09       001           001          SUPER       ....  
    03(廠的id)    2008/05/10       001           001          SUPER       ....  
    03(廠的id)    2008/05/11       001           001          SUPER       ....
    03(廠的id)    2008/05/12       001           001          SUPER       ....  
    03(廠的id)    2008/05/13       001           001          SUPER       ....  
    03(廠的id)    2008/05/14       001           002(OFF)     SUPER       .... 
                     .
                  2008/05/21                  
而用戶界面的顯示效果為:(用戶選擇的5月1日--5月31日,還是A組的排班輪次進行這31天的排班)-----日期-----u_shiftid-------u_stime1--------u_stime2---------u_stime3-------  
2008/5/1      001(白班)     07:00-12:00      13:00-17:00     19:40-22:00      (3個上班時間段)
2008/5/2      001           07:00-12:00      13:00-17:00     19:40-22:00
2008/5/3      001           07:00-12:00      13:00-17:00     19:40-22:00
2008/5/4      001           07:00-12:00      13:00-17:00     19:40-22:00      
2008/5/5      001           07:00-12:00      13:00-17:00     19:40-22:00      
2008/5/6      001           07:00-12:00      13:00-17:00     19:40-22:00    
2008/5/7      002(OFF)      -----             -----            ----- (休息)
2008/5/8      001          
2008/5/9      001          
2008/5/10     001          
2008/5/11     001         
2008/5/12     001          
2008/5/13     001          
2008/5/14     002(OFF)          
   .  
2008/5/31     .....  
         
我要的就是這個表3操作的存儲過程﹐各位大哥幫個忙﹐謝謝了﹐100分送上,原來的那個帖子轉到這類

解决方案 »

  1.   

    我以前做过一个排班的存储过程,挺复杂的。
    是可以选择时间段,进行排班的。
    我记得,我是先根据时间段,把所有的日期先列举出来,存放在一张临时表中。
    然后,再一笔笔的判断人员的上班时间,Update进这张临时表。
    而且,上班时间分好多种,有3班倒的,有一周5天班的。
    总之,搞清楚时间安排,逻辑上正确,就应该没问题的。
      

  2.   

    被你們逼出來得﹐我自己弄了個﹐完全沒錯﹐實現了固定假日為休息日﹐user選定班別代碼排列
    我帖出來﹐給需要得朋友參照下.set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    goALTER PROCEDURE [dbo].[KM_ShiftG_insert]
        @u_dataid [char] (2),
    @u_date [datetime],
    @u_groupid [char] (5),
    @u_no [char] (2),
    @u_update [datetime],
    @u_sdate datetime,
    @u_edate datetime,
    @u_upuser [char] (10)
    as
    declare @ld_sdate datetime      --排班開始日
    declare @ld_edate datetime      --排班結束日
    declare @ls_shift_id char(5)    --班別代碼
    declare @ls_u_no int            --班別序號
    declare @maxls_u_no int         --最大班別序號
    declare @ls_off_shiftid char(5) --假日代碼set @ld_sdate=@u_sdate
    set @ld_edate=@u_edate--get u_shiftid from km_shift where u_shiftname='OFF'
    select @ls_off_shiftid=u_shiftid from km_shift where u_shiftname='OFF'--get u_no from km_groupshift
    set @ls_u_no=convert(int,@u_no)--get max(u_no)from km_groupshift
    select @maxls_u_no=max(convert(int,u_no)) from km_groupshift where u_groupid=@u_groupid--drop km_shiftg where u_sdate <=  u_date  and u_date <= u_edate
    delete km_shiftg where u_groupid=@u_groupid and u_date>=@u_sdate and u_date<=@u_edatewhile(@ld_sdate<=@ld_edate)
    begin
         --get u_shiftid from km_groupshift
         select @ls_shift_id=u_shiftid from km_groupshift where u_groupid=@u_groupid and u_no=@ls_u_no
         --if u_date is holiday then參照固定假日表﹐如果當天為固定假日﹐則為u_shiftid='OFF'
         if(exists(select u_date from km_holiday where year(u_date)=year(@ld_sdate) and month(u_date)=month(@ld_sdate) and day(u_date)=day(@ld_sdate)))
             set @ls_shift_id = @ls_off_shiftid
         --insert into km_shiftg
         insert into km_shiftg(u_dataid,u_date,u_groupid,u_shiftid,u_update,u_upuser)
    values(@u_dataid,@ld_sdate,@u_groupid,@ls_shift_id,@u_update,@u_upuser)     set @ls_u_no=@ls_u_no+1
     if(@ls_u_no>@maxls_u_no)
     set @ls_u_no=1
        
         set @ld_sdate=dateadd(day,1,@ld_sdate)
    end
      

  3.   

    实践是学习的方法。实践是检验的标准。
    good luck