我正在尝试构建一个复杂的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
答案 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
当然,您的逻辑可以进一步增强,即您可能还需要检查工作工时,工人名单,假期等。