我有一个查询字段,该字段为FuncID字段提供结果文本“已完成”或“未完成”。我需要使用IFF创建另一个表达式,该表达式根据使用以下公式完成的FuncID来表示其所在的运算符级别1-5
FuncID 1
FuncID 2
FuncID 3
FuncID 4
FuncID 5
FuncID 6
FuncID 7
FuncID 8
运算符1 = FuncID 1 或 FuncID 2必须完成
运算符2 = FuncID 1 AND 必须完成FuncID 2
运算符3 = 八(8)个FuncID中的四(4)个必须完成
运算符4 = 八(8)个FuncID中的六(6)个必须填写
运算符5 = 八(8)个FuncID中的八(8)个必须完成
ElegibleLevel: Iff[FuncID]=1 AND [Expr1] = 1,"OPERATOR 1",0,
Iff[FuncID]=1 OR [FuncID]=2 AND [Expr1] = 1,"OPERATOR 1",0,
Iff[FuncID]=1 AND [FuncID]=2 AND [Expr1] = 1,"OPERATOR 2",0,
Iff(Count[FuncID]=3) = 4 AND [Expr1] = 1,"OPERATOR 3",0,
Iff(Count[FuncID]=4) = 6 AND [Expr1] = 1,"OPERATOR 4",0,
Iff(Count[FuncID]=5) = 8 AND [Expr1] = 1,"OPERATOR 5",0,
答案 0 :(得分:0)
我建议使用与此数据库模式类似的数据库模式(简化):
要确定员工的操作员级别,我们只需为每个员工计算2个数字:
其中第一个是您的CountOfReqCompleted
。两者都可以使用以下查询来计算:
EmployeesFunctionsAll:
SELECT EmployeesFunctions.EmployeeID,
Count(EmployeesFunctions.FuncID) AS FunctionsCount
FROM EmployeesFunctions
GROUP BY EmployeesFunctions.EmployeeID;
EmployeesFunctionsBasic:
SELECT EmployeesFunctions.EmployeeID,
Count(EmployeesFunctions.FuncID) AS FunctionsCount
FROM EmployeesFunctions
WHERE (((EmployeesFunctions.FuncID) In (1,2)))
GROUP BY EmployeesFunctions.EmployeeID;
最后,要计算每位员工的操作员级别,我们可以使用LEFT JOIN
将这2个查询加入到 Employees 表中,这样“所有记录的“员工”被归还”。除了嵌套多个Iif
函数之外,我们可以使用Switch
函数来完成任务:
SELECT Employees.EmployeeID, Employees.EmployeeName,
Switch(
EmployeesFunctionsAll.FunctionsCount >= 8, "Operator 5",
EmployeesFunctionsAll.FunctionsCount >= 6, "Operator 4",
EmployeesFunctionsAll.FunctionsCount >= 4, "Operator 3",
EmployeesFunctionsBasic.FunctionsCount >= 2, "Operator 2",
EmployeesFunctionsBasic.FunctionsCount >= 1, "Operator 1"
) AS OperatorLevel
FROM (Employees LEFT JOIN EmployeesFunctionsAll
ON Employees.EmployeeID = EmployeesFunctionsAll.EmployeeID)
LEFT JOIN EmployeesFunctionsBasic
ON Employees.EmployeeID = EmployeesFunctionsBasic.EmployeeID;
答案 1 :(得分:0)
我现在正在调用一个函数,该函数将能够基于计数来判断我是否根据查询结果而不是所有Iffs完成了要求。
Function SetLevel(lngFuncID As Long, lngEmpID As Long, varDateCompleted As Variant)
Dim lngPosID As Long
Dim lngEmpPosID As Long
Dim strSQL As String
Dim strCriteria As String
strCriteria = "EmpID = " & lngEmpID
If DCount("*", "qryMetalShopEmployeeFunctions", strCriteria) = 8 Then
lngPosID = DLookup("PosID", "tblMetalShopLevel", "Position = ""Operator 5""")
ElseIf DCount("*", "qryMetalShopEmployeeFunctions", strCriteria) = 7 Then
lngPosID = 0
ElseIf DCount("*", "qryMetalShopEmployeeFunctions", strCriteria) = 6 Then
lngPosID = DLookup("PosID", "tblMetalShopLevel", "Position = ""Operator 4""")
ElseIf DCount("*", "qryMetalShopEmployeeFunctions", strCriteria) = 5 Then
lngPosID = 0
ElseIf DCount("*", "qryMetalShopEmployeeFunctions", strCriteria) = 4 Then
lngPosID = DLookup("PosID", "tblMetalShopLevel", "Position = ""Operator 3""")
ElseIf DCount("*", "qryMetalShopEmployeeFunctions", strCriteria) = 3 Then
lngPosID = 0
ElseIf DCount("*", "qryMetalShopEmployeeFunctions", _
strCriteria & " And (FuncID = 1 Or FuncID = 2)") = 2 Then
lngPosID = DLookup("PosID", "tblMetalShopLevel", "Position = ""Operator 2""")
ElseIf lngFuncID = 1 Or lngFuncID = 2 Then
lngPosID = DLookup("PosID", "tblMetalShopLevel", "Position = ""Operator 1""")
End If
If lngPosID > 0 Then
lngEmpPosID = Nz(DMax("EmpPosID", "tblMetalShopEmployeeLevel"), 0) + 1
strSQL = "INSERT INTO tblMetalShopEmployeeLevel(EmpPosID, EmpID, PosID, DateAchieved) " & _
"VALUES(" & lngEmpPosID & "," & lngEmpID & "," & lngPosID & "," & _
IIf(IsNull(varDateCompleted), "NULL", "#" & Format(varDateCompleted, "yyyy-mm-dd hh:nn:ss") & "#") & ")"
CurrentDb.Execute strSQL, dbFailOnError
End If
结束功能