我有一个培训清单,人们必须根据他们的头衔,这个清单是这样的
Violence and Harassment
First Aid
Whmis
Fire hazard and awareness
Fire Extinguisher然后我有一个表,根据标题指定了所需的培训,如下所示
Supervisor | First Aid
Supervisor | Fire hazard and awareness
Driver | Whmis
Driver| Fire extinguisher然后就这样继续下去。
问题是,公司内部存在一些不一致之处。有几门课程是等效的,比如火灾危险和意识等同于灭火器,但所需的培训如上所列。
事后我有一个疑问,那就是把每个人都参加过的培训汇总在一起,但我在同等课程上遇到了麻烦。它创建了所有主管和他们所需的培训课程的组合,因此,它看起来像这样。
Supervisor | Joe | First Aid | May 21 2016还有一个查询,用来识别任何缺失的训练。
在上面的列表中,如果主管拿了灭火筒而不是火灾危险和火灾意识,我不希望它识别出他们缺少火灾危险和火灾意识。我应该把这个"if“语句放在哪里?
编辑:
以下是Select语句,它列出了所有“缺失”的培训,在示例中,主管参加了“灭火器和火灾危险和意识以及火灾危险和意识”,即使他们已经参加了等同的培训,也显示为未参加。
SELECT TakenAndReqTraining.Training, TakenAndReqTraining.EmployeeName, TakenAndReqTraining.DateTaken, TakenAndReqTraining.Expiry
FROM TakenAndReqTraining
WHERE (((TakenAndReqTraining.DateTaken) Is Null)) OR (((TakenAndReqTraining.Expiry)<=Now()));*如果没有与课程和员工相关联的日期,则查找null,这意味着他们尚未参加该课程,还会查找'=Now()以查找已过期。
发布于 2016-11-22 23:31:57
你必须在两个相关的培训之间建立共同点。
如果它们只是字符串,那么就没有简单的方法来检查等价的训练。
在指定所需培训的表上创建一个TrainingID字段。然后在该字段上为每个训练分配一个编号,以便为等效的训练分配相同的编号。这意味着识别缺失训练的查询将通过该数字进行识别,而不是基于字符串。
这样,您就可以通过该字段来识别缺少的训练。这是保持可伸缩性的最好方法。
否则,您必须在select查询中编写一个开关,在该查询中,您将为每个具有等效项的训练包含一个表达式求值。
编辑:
我倾向于使用小型数据库,如果表是1到500条记录,这个解决方案可能会起作用,但从长远来看,这不是最好的方法。它既慢又难看,如果你在查询中使用switch,那就更难看了。
在查询中使用switch:
您必须首先将培训转换为等价物(如果有),然后检查员工是否具有等价物。添加一个表达式,如下所示:
Equivalent: switch(Training="Fire Extinguisher","Fire Hazard and Awareness",Training="Fire Hazard and Awareness","Fire Extinguisher",Training="Training#2", "Equivalent#2")你需要在这里添加每一个等价的训练。
然后检查员工是否有第二个表达式的等价物:
HasEquivalent: nz(Dlookup("Training","TakenAndReqTraining","Employee='" & employee & "' AND Training='" & Equivalent & "' AND (DateTaken is not null) AND (TakenAndReqTraining.Expiry)<=Now()" ),"")
Criteria: <> ""您还可以在vba中创建一个函数来平等地执行,这样您就不必处理表达式生成器了。
https://stackoverflow.com/questions/40745027
复制相似问题