Foxtable(狐表)用户栏目专家坐堂 → 请教一个排班问题


  共有5549人关注过本帖树形打印复制链接

主题:请教一个排班问题

帅哥哟,离线,有人找我吗?
liufucan
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:649 积分:5730 威望:0 精华:0 注册:2017/4/7 12:15:00
请教一个排班问题  发帖心情 Post By:2018/5/25 14:50:00 [显示全部帖子]

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

 回到顶部
帅哥哟,离线,有人找我吗?
liufucan
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:649 积分:5730 威望:0 精华:0 注册:2017/4/7 12:15:00
  发帖心情 Post By:2018/5/25 15:22:00 [显示全部帖子]

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

 回到顶部
帅哥哟,离线,有人找我吗?
liufucan
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:649 积分:5730 威望:0 精华:0 注册:2017/4/7 12:15:00
  发帖心情 Post By: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
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:649 积分:5730 威望:0 精华:0 注册:2017/4/7 12:15:00
  发帖心情 Post By:2018/5/26 13:34:00 [显示全部帖子]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:排班.table


 回到顶部
帅哥哟,离线,有人找我吗?
liufucan
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:649 积分:5730 威望:0 精华:0 注册:2017/4/7 12:15:00
  发帖心情 Post By:2018/5/26 15:27:00 [显示全部帖子]

谢谢老师,还有一个问题,怎么控制每个员工上早班的次数都是3,上晚班的次数都是6呢?

 回到顶部
帅哥哟,离线,有人找我吗?
liufucan
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:649 积分:5730 威望:0 精华:0 注册:2017/4/7 12:15:00
  发帖心情 Post By:2018/5/26 15:34:00 [显示全部帖子]

我把代码这么改了一下并增加了一个自定义函数testcount
Dim count As Integer = 0
Dim Names As List(Of Integer) = Args(0)
Dim Val As Integer = Args(1)

For t As Integer = 0 To (Names.Count-1)
           
If Names.Contains(Val)= True Then
    count = count+1
End If

Next

Return count

光星期一测试没问题,加上别的星期就卡住了
Dim lst100 As new List(of Integer) 
Dim lst200 As new List(of Integer) 
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) 
Dim lst11 As new List(of Integer) 
Dim v1() As Integer = {1,2,3,4,5,6,7,8,9,10}
lst11.AddRange(v1)
 lst1.Add(1)
 lst1.Add(2)
lst11.Remove(1)
lst11.Remove(2)
Do  While lst1.count < 4     
Dim id As Integer = rand.Next(1,10)
          If lst1.Contains(id) = False And Functions.Execute("testcount",lst100,id) < 6 Then
        lst1.Add(id)
lst100.Add(id)
lst11.Remove(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 And Functions.Execute("testcount",lst200,id) < 3 Then
        lst1.Add(id)
lst200.Add(id)
lst11.Remove(id)
ids1 = ids1 & id & ","
    End If
 
   Loop 
dr("早班")= ids1.Trim(",")
ids1 = ""

For t As Integer = 0 To (lst11.Count-1)
        ids1 = ids1 & lst11(t) & ","
    Next
dr("正常班")= ids1.Trim(",")
ids1 = ""

lst1.Clear
lst11.Clear
 lst1.Add(1)
 lst1.Add(2)
lst11.Remove(1)
lst11.Remove(2)


 回到顶部
帅哥哟,离线,有人找我吗?
liufucan
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:649 积分:5730 威望:0 精华:0 注册:2017/4/7 12:15:00
  发帖心情 Post By:2018/5/26 16:46:00 [显示全部帖子]

早晚班是每天都要值的,一个月共30个早班60个晚班,均到每个人就是3个早班6个晚班啊。我是想有没有高效的办理可以统计集合中某个元素出现的次数?

 回到顶部
帅哥哟,离线,有人找我吗?
liufucan
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:649 积分:5730 威望:0 精华:0 注册:2017/4/7 12:15:00
  发帖心情 Post By:2018/5/26 17:23:00 [显示全部帖子]

周六日是大家都不休,我的意思是尽量做到早晚班均等公平(不是绝对的),我把自定义函数去了,不卡了,老师帮我看看怎么控制这个每人
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:排班.table

早晚班的次数呢?

 回到顶部
帅哥哟,离线,有人找我吗?
liufucan
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:649 积分:5730 威望:0 精华:0 注册:2017/4/7 12:15:00
  发帖心情 Post By:2018/5/26 18:10:00 [显示全部帖子]

好深奥,愣是没看懂,老师能不能稍微解释一下?

 回到顶部
帅哥哟,离线,有人找我吗?
liufucan
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:三尾狐 帖子:649 积分:5730 威望:0 精华:0 注册:2017/4/7 12:15:00
  发帖心情 Post By:2018/5/26 18:31:00 [显示全部帖子]

我大致看懂了
If dict.ContainsKey(idx) Then
        dict(idx)=dict(idx)+1
    Else
        dict.Add(idx,1)
    End If
字典的这个用法帮助好像没有介绍啊
[此贴子已经被作者于2018/5/26 18:30:57编辑过]

 回到顶部
总数 19 1 2 下一页