以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  请教一个排班问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=119474)

--  作者:liufucan
--  发布时间:2018/5/25 14:50:00
--  请教一个排班问题
办公室共10个人,每人每周固定一天休息(周一到周五每天两人),除了休息的人以外分成三个班次。早班一个人,晚班两人,其余人正常班。要求每人每月上早班和晚班的次数尽量均等,如有五一等法定假日则随机补休,但每天休息不得超过三人。请问老师这个能用狐表实现吗?
[此贴子已经被作者于2018/5/25 14:56:37编辑过]

--  作者:有点甜
--  发布时间:2018/5/25 15:13:00
--  

 【你本来说早班2个人的】

 

比如 30天,10个人,一个人6个早班、6个晚班。然后随机排列早班、随机排列晚班。

 

用洗牌的方式,30张牌,每个人3张牌(写自己名字),然后洗牌打乱,按顺序抽取,对应第一张对应1号,第二张对应2号......这样确定第一个早班人

 

同理,确定第二个早班人,晚班人1,晚班人2。

 

得到的4组数据,1号可能有重复的人(比如 张三、李四、张三、王五),这个时候,就要交换去重复。

 

如果1号那天,第一个早班和第一个晚班重复,这个时候,把看2号晚班的人是否张三(直到找到不是张三的人),交换这两个人。一直往后,排除所有重复值。

[此贴子已经被作者于2018/5/25 15:14:50编辑过]

--  作者:liufucan
--  发布时间:2018/5/25 15:22:00
--  
老师说得好抽象,能不能简单做个例子?
因为每个人的休息日是固定的,我目前用电子表格做的时候都是先排休息,再排法定假日,再排早晚班,剩下的就是正常班。用狐表有没有比较简单的实现逻辑?

--  作者:有点甜
--  发布时间:2018/5/25 15:24:00
--  

方法二:随机抽取,类似这种

 

http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=114803&skin=0

 


--  作者:有点甜
--  发布时间:2018/5/25 15:29:00
--  
以下是引用liufucan在2018/5/25 15:22:00的发言:
老师说得好抽象,能不能简单做个例子?
因为每个人的休息日是固定的,我目前用电子表格做的时候都是先排休息,再排法定假日,再排早晚班,剩下的就是正常班。用狐表有没有比较简单的实现逻辑?

 

用4楼方法,或者2楼方法,得到排班以后,节假日的去掉或者顺延,休息日的调换横向调换一下人员的顺序即可。


--  作者:有点甜
--  发布时间:2018/5/25 15:30:00
--  

随机抽取,参考

 

http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=109227&skin=0

 

http://www.foxtable.com/webhelp/scr/2963.htm

 


--  作者:liufucan
--  发布时间:2018/5/26 13:27:00
--  
老师,我拿论坛上的例子改了一个,发现抽取早晚班都没有问题,但是加了抽取正常班的代码时就会卡项目,麻烦老师帮忙改改。
1-10代表人员编号。

Dim frm As winform.Form = Forms("窗口1")
Dim y As Integer = frm.Controls("ComboBox1").value \'指定年
Dim m As Integer = frm.Controls("ComboBox2").value \'指定月

Dim days As Integer = Date.DaysInMonth(y,m) \'返回指定 年\\月 的天数
Dim ed As Date = New Date(y,m,Days)
Dim sd As Date = New Date(y,m,1) \'从指定日期开始

Dim zbrys As List(Of String) = DataTables("人员").GetValues("序号","姓名 is not null","_sortkey")

Dim d As Date = sd

Dim dt As DataTable = DataTables("假期")
Do While d <= ed
    Dim fdr As DataRow = dt.Find("日期 = #" & d & "#")
    If fdr Is Nothing Then
        Dim nr As Row = Tables("表b").AddNew
        nr("日期") = d
        nr("星期") = Format(d, "dddd")
           Else
        Dim nr As Row = Tables("表b").AddNew
        nr("日期") = d
        nr("星期") = Format(d, "dddd")
        nr("假期") = fdr("说明")
    End If
      d = d.AddDays(1)
Loop
 Tables("表b").save


For Each dr As DataRow In DataTables("表b").DataRows
Select Case dr("星期")
 Case "星期一"
      dr("假期")="1,2"
Dim ids1 As String
Dim lst1 As new List(of Integer) 
 lst1.Add(1)
 lst1.Add(2)

Do  While lst1.count < 4     
Dim id As Integer = rand.Next(1,10)
          If lst1.Contains(id) = False Then
        lst1.Add(id)
ids1 = ids1 & id & ","
    End If
 
   Loop 
dr("晚班")= ids1.Trim(",")
ids1 = ""
Do  While lst1.count < 5     
Dim id As Integer = rand.Next(1,10)
          If lst1.Contains(id) = False Then
        lst1.Add(id)
ids1 = ids1 & id & ","
    End If
 
   Loop 
dr("早班")= ids1.Trim(",")
ids1 = ""
Do  While lst1.count < 10
Dim id As Integer = rand.Next(1,10)
          If lst1.Contains(id) = False Then
        lst1.Add(id)
ids1 = ids1 & id & ","
    End If
 
   Loop
dr("正常班")= ids1.Trim(",")
ids1 = ""


lst1.Clear

 lst1.Add(1)
 lst1.Add(2)

 Case "星期二"
      dr("假期")="3,4"
 Case "星期三"
      dr("假期")="5,6"
 Case "星期四"
      dr("假期")="7,8"
 Case "星期五"
      dr("假期")="9,10"

 
End Select
dr.save
Next

--  作者:liufucan
--  发布时间:2018/5/26 13:34:00
--  
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:排班.table


--  作者:有点蓝
--  发布时间:2018/5/26 15:11:00
--  
DataTables("表b").DeleteFor("")
Dim y As Integer = 2018 \'指定年
Dim m As Integer = 6 \'指定月

Dim days As Integer = Date.DaysInMonth(y,m) \'返回指定 年\\月 的天数
Dim ed As Date = New Date(y,m,Days)
Dim sd As Date = New Date(y,m,1) \'从指定日期开始

Dim zbrys As List(Of String) = DataTables("人员").GetValues("序号","姓名 is not null","_sortkey")

Dim d As Date = sd

Dim dt As DataTable = DataTables("假期")
Do While d <= ed
    Dim fdr As DataRow = dt.Find("日期 = #" & d & "#")
    If fdr Is Nothing Then
        Dim nr As Row = Tables("表b").AddNew
        nr("日期") = d
        nr("星期") = Format(d, "dddd")
    Else
        Dim nr As Row = Tables("表b").AddNew
        nr("日期") = d
        nr("星期") = Format(d, "dddd")
        nr("假期") = fdr("说明")
    End If
    d = d.AddDays(1)
Loop
Tables("表b").save

For Each dr As DataRow In DataTables("表b").DataRows
    Dim lst1 As new List(of Integer)
    Dim ids1 As New List(of Integer) \'用于存储洗牌前的位置
    Dim ids2 As New List(of Integer) \'用于存储洗牌后的位置
    Select Case dr("星期")
        Case "星期一"
            dr("假期")="1,2"
            lst1.Add(1)
            lst1.Add(2)
        Case "星期二"
            dr("假期")="3,4"
            lst1.Add(3)
            lst1.Add(4)
        Case "星期三"
            dr("假期")="5,6"
            lst1.Add(5)
            lst1.Add(6)
        Case "星期四"
            dr("假期")="7,8"
            lst1.Add(7)
            lst1.Add(8)
        Case "星期五"
            dr("假期")="9,10"
            lst1.Add(9)
            lst1.Add(10)
        Case Else
            Continue For
    End Select
    For i As Integer = 1 To 10 \'准备初始的牌
        If lst1.Contains(i) = False Then
            ids1.add(i)
        End If
    Next
    For i As Integer = 0 To 7 \'开始洗牌
        Dim idx As Integer = ids1(rand.Next(0,ids1.count))
        ids2.Add(idx)
        ids1.Remove(idx)
    Next
    dr("晚班")= ids2(0) & "," & ids2(1)
    dr("早班")= ids2(2)
    dr("正常班")= ids2(3) & "," & ids2(4) & "," & ids2(5) & "," & ids2(6) & "," & ids2(7)
Next
Tables("表b").save

--  作者:liufucan
--  发布时间:2018/5/26 15:27:00
--  
谢谢老师,还有一个问题,怎么控制每个员工上早班的次数都是3,上晚班的次数都是6呢?