设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 1924|回复: 5
打印 上一主题 下一主题

[帮助] 请教:ACCESS能否实现此种排班功能?

[复制链接]
跳转到指定楼层
1#
发表于 2008-10-2 18:22:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教:ACCESS能否实现此种排班功能?如图所示:
(数据库及要求在附件内)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2008-10-2 20:20:08 | 只看该作者
当然可以。

只要你的算法清晰,通过表的设计,查询和VBA应该足够完成你的任务了。
3#
发表于 2008-10-3 10:56:34 | 只看该作者
Private Sub CmdGo_Click()
    Dim Cn As New ADODB.Connection, Rs As New ADODB.Recordset, sqlStr As String
    Set Cn = CurrentProject.Connection
   
    '第一步,先将当天导师有上班的的优先安排给学生===================================================================================================================
    sqlStr = "SELECT 学生姓名,日期,导师姓名,带教 FROM 安排 ORDER BY 日期"
    Rs.Open sqlStr, Cn, adOpenKeyset, adLockPessimistic   '后面两个参数不可省,否则无法更新资料
    Do Until Rs.EOF
        If IsNull(DLookup("[带教1]", "带教查询", "[日期]=#" & Rs("日期") & "# AND [带教1]='" & Rs("导师姓名") & "'")) = False Then   '如果学生当天的导师有上班的话
            Rs!带教 = Rs!导师姓名
        End If
        Rs.Update
        Rs.MoveNext
    Loop
    Rs.Close
   
   '第二步,取得没有分配带教老师的记录(以学生的优先次序排序),然后按带教老师的优先次序予以分配=====================================================================
    Dim Rs2 As New ADODB.Recordset, sqlStr2 As String
    sqlStr = "SELECT 安排.学生姓名, 安排.日期 FROM 学生优先次序 INNER JOIN 安排 ON 学生优先次序.学生姓名 = 安排.学生姓名 WHERE 安排.带教 Is Null ORDER BY 学生优先次序.优先次序"
    Rs.Open sqlStr, Cn
    Do Until Rs.EOF
        sqlStr2 = "SELECT 带教查询.带教1 FROM 带教查询 INNER JOIN 带教优先次序 ON 带教查询.带教1 = 带教优先次序.带教姓名 WHERE 带教查询.日期=#" & Rs!日期 & "#" & _
                "  ORDER BY 带教优先次序.优先次序"
        Rs2.Open sqlStr2, Cn
        Do Until Rs2.EOF
                If IsNull(DLookup("[日期]", "安排", "[日期]=#" & Rs!日期 & "# AND [带教]='" & Rs2!带教1 & "'")) = True Then '当天此老师尚未安排带教,则排上并退出循环
                Cn.Execute ("UPDATE 安排 SET 带教='" & Rs2!带教1 & "' WHERE 学生姓名='" & Rs!学生姓名 & "' AND 日期=#" & Rs!日期 & "#")
                Exit Do
            End If
            Rs2.MoveNext
        Loop
        Rs2.Close
        Rs.MoveNext
    Loop
    Rs.Close
   
    '第三步,通过上面两步,解决了导师带自己的学生,和每个导师都有学生可带(当然前提是经第一步后有学生没导师带)====================================================
    '在此步中,只需按照学生的优先顺序,以及导师的优先顺序,以及导师已经带教的学生数进行带教的排班
    '如果优先的导师带教的学生在当天是最少的,则将尚未分配导师的优先的学生分配给他,否则看第二优先的导师带教的学生在当天是最少的……依次类推
   
    Dim DJ As String
   
    Rs.Open sqlStr, Cn
    Do Until Rs.EOF
        DJ = ""
        sqlStr2 = "SELECT 带教查询.带教1 FROM 带教查询 INNER JOIN 带教优先次序 ON 带教查询.带教1 = 带教优先次序.带教姓名 WHERE 带教查询.日期=#" & Rs!日期 & "#" & _
                "  ORDER BY 带教优先次序.优先次序"
        Rs2.Open sqlStr2, Cn
        Do Until Rs2.EOF
            '下面选择语句用来判断当前的带教老师已经带教学生的数量,得到选出带教人数最少的导师
            If DJ = "" Then
                DJ = Rs2!带教1
            Else
                If DCount("*", "安排", "[日期]=#" & Rs!日期 & "# AND [带教]='" & Rs2!带教1 & "'") < DCount("*", "安排", "[日期]=#" & Rs!日期 & "# AND [带教]='" & DJ & "'") Then
                    DJ = Rs2!带教1
                End If
            End If
            Rs2.MoveNext
        Loop
        Rs2.Close
        Cn.Execute ("UPDATE 安排 SET 带教='" & DJ & "' WHERE 学生姓名='" & Rs!学生姓名 & "' AND 日期=#" & Rs!日期 & "#")
        Rs.MoveNext
    Loop
    Set Rs2 = Nothing
    Rs.Close
    Set Rs = Nothing
    Set Cn=Nothing
    MsgBox "完成"
    '这里还存在一点问题尚未解决,就是优先的学生不一定能够分配给优先的导师,如学生A是优先级第一的,导师A是优先级第一,导师B次之,设当天共有学生4人(A,B,C,D),学生B的导师是导师A,其它学生的导师当天均无带教任务
    '所以在第一步就已经将学生B分配给导师A,在第二步就将学生A分配给了导师B,而不能像理想中的排法:学生B<>导师A、学生A<>导师A、学生C<>导师B、学生D<>导师B
    '程序最终取得的结果将是:学生B<>导师A、学生A<>导师B、学生C<>导师A、学生D<>导师B
End Sub
4#
发表于 2008-10-3 10:58:16 | 只看该作者
原文件如下

代码有些复杂,应该有更为简单的实现方法,如果哪位有更好的解决办法,望不吝赐教

[ 本帖最后由 zyp 于 2008-10-3 11:00 编辑 ]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
5#
发表于 2008-10-3 14:18:11 | 只看该作者
对于楼主的要求,我个人建议用EXCEL函数来做更好一些,而非用ACCESS来实现.
6#
 楼主| 发表于 2008-10-3 17:40:05 | 只看该作者
十分感谢“ZYP”的帮助,您的帮助解决了我的大问题!“ZYP”曾多次给予我们这些新手以援手,希望能够多多向您学习!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-2 06:41 , Processed in 0.101797 second(s), 30 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表