在访问时,如何根据不同的记录添加“if”语句?

时间:2016-11-22 14:54:16

标签: sql vba ms-access access-vba access

我有一个人们必须根据他们的标题进行的培训列表,这个列表是这样的

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语句,用于提取所有“缺失”培训,在该示例中,主管采取“灭火器instead of the listed火灾危险和意识, the火灾危险和意识”显示为不即使他们采取了相应的措施。

SELECT TakenAndReqTraining.Training, TakenAndReqTraining.EmployeeName, TakenAndReqTraining.DateTaken, TakenAndReqTraining.Expiry
FROM TakenAndReqTraining
WHERE (((TakenAndReqTraining.DateTaken) Is Null)) OR (((TakenAndReqTraining.Expiry)<=Now()));

*查找null,其中没有与课程相关的日期和员工意味着他们没有接受它,并且'= Now()查找过期。

1 个答案:

答案 0 :(得分:0)

你必须在两个相关的培训之间建立共同点 如果它们只是字符串,则没有简单的方法可以检查等效培训。

在指定所需培训的表格上创建 TrainingID 字段numeric。然后在该字段上为每个训练分配一个数字,以便为相同的训练分配相同的数字。这意味着您的查询识别缺少的培训将通过该编号识别,而不是基于字符串。

通过这种方式,您可以通过该字段识别缺少的培训。这是保持可扩展性的最佳方式。

否则,您必须在选择查询中编写一个开关,其中包含对具有等效项的每个培训的表达式评估。

编辑:

我倾向于使用小型数据库,如果这些表是1到500条记录,那么这个解决方案可能会再次发挥作用,从长远来看,这不是最好的方法。它是缓慢而丑陋的,如果你在查询中使用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中创建一个函数来执行相同的操作,这样您就不必处理表达式构建器。