多个表自动分配圆桌SQL

时间:2015-05-07 20:30:57

标签: sql ms-access-2010

我正在尝试构建一个复杂的SQL,它会以圆桌方式自动为工作人员分配作业。例如,我有50名工人和500名作业。我希望每个工人能够平均分配10个任务,但是他们可能不会全部获得10个,有些人可能会获得更多,因为有" IF"可能有1个worker得到15和1得到5的变量。以下是使这个SQL复杂的变量。我有2个表,这些数据将来自和更新。 " tblUser"是所有工人信息的所在地,字段[程序]和[语言]是我们分配时必须考虑的变量。工人只能知道1个程序,2个程序或3个程序。它具体说明了每个员工都知道的程序。

例如,工人1知道MC / CF并且放在字段[程序]中。现在对于[语言],每个工人可能会或可能不会知道超过1种语言。如果是,则会在[语言]字段中列出。我们假设所有工人都懂英语,所以我们考虑一下。但是,只有英语的工作人员不应该获得西班牙语作业。

现在是第二张表," CFRRR"此表是分配所在的位置。 [assignedto]是被分配案件的工人将该工人的[工人ID]放入的字段。[工人名称]是被分配案件的工人所具有的字段。工作人员[用户名]放在。[语言]是一个字段,其中包含分配所使用的语言,[程序]具有分配所在的程序。这里的复杂变量是CFRRR中的[程序]可能只说MC,但是MC / CF的工作人员可以进行分配,因为他们将MC作为他们的程序之一,所以匹配sql不适用于此。

我现在有一个圆桌SQL,但它没有考虑任何在分配中非常重要的变量(语言,程序)。

Public Function GetNextAssignee() As Long

    Dim db As dao.Database
    Dim rs As dao.Recordset
    Dim strSQL As String

    Set db = CurrentDb
    strSQL = "SELECT TOP 1 WorkerID FROM tblUser ORDER BY TS ASC"
    Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
    If Not rs.BOF And Not rs.EOF Then
        strSQL = "UPDATE tblUser SET TS = " & DMax("[TS]", "tblUser") + 1 & " WHERE [WorkerID]= " & rs!workerid
        db.Execute strSQL, dbFailOnError
        GetNextAssignee = rs!workerid
    Else
        GetNextAssignee = 0
    End If

    rs.Close
    db.Close
    Set rs = Nothing
    Set db = Nothing

End Function
Public Function AssignNullProjects() As Long

    Dim db As dao.Database
    Dim rs As dao.Recordset
    Dim strSQL As String

    Set db = CurrentDb
    strSQL = "SELECT CFRRRID FROM CFRRR WHERE assignedto Is Null"
    Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
    If Not rs.BOF And Not rs.EOF Then
        While Not rs.EOF
            strSQL = "UPDATE CFRRR SET assignedto = " & GetNextAssignee & " WHERE CFRRRID = " & rs!CFRRRID
            db.Execute strSQL, dbFailOnError
            rs.MoveNext
        Wend
    End If

    rs.Close
    db.Close
    Set rs = Nothing
    Set db = Nothing
End Function

1 个答案:

答案 0 :(得分:0)

您的代码看起来差不多完成了。现在,您需要增强GetNextAssignee()函数以接受两个参数:程序和语言:GetNextAssignee(program As String, language As String)

在函数中,您需要修改select语句以根据传入的程序和语言检索员工:

strSQL = "SELECT TOP 1 WorkerID FROM tblUser WHERE [program] LIKE '*" & program & "*' AND [language] = '" & language & "' ORDER BY TS ASC"

请注意,在上面的语句中,我使用了嵌入SQL的参数。您不应该在生产代码中执行此操作。您应该始终使用parameterised个查询

AssignNullProjects()中,您需要修改select语句以从作业中检索程序和语言:

strSQL = "SELECT CFRRRID, [program], [language] FROM CFRRR WHERE assignedto Is Null"
Set rs = db.OpenRecordset(strSQL, dbOpenDynaset)
If Not rs.BOF And Not rs.EOF Then
    While Not rs.EOF
        strSQL = "UPDATE CFRRR SET assignedto = " & GetNextAssignee(rs!program, rs!language) & " WHERE CFRRRID = " & rs!CFRRRID
        db.Execute strSQL, dbFailOnError
        rs.MoveNext
    Wend
End If

当然,您的逻辑可以进一步增强,即您可能还需要检查工作工时,工人名单,假期等。