基于表上数据的MS Access Subform条件格式

时间:2018-12-29 05:40:40

标签: forms ms-access lookup conditional-formatting dlookup

我的数据库为实验室提供了一个表格视图,可将其测试结果输入到我们生产的每个批次中。 我有一个查询作为Subform数据源,我使用日期组合框供实验室人员查看当天的生产情况。我的问题是,当他们编写测试的值时(例如批次5,产品A,测试结果= 10),我需要子窗体根据位于另一个表中的最小/最大规范进行条件格式设置。说这张表说产品A允许的范围是11-15。然后,当技术人员写10时,应提示他隔离产品。一种简单的方法是将CELL标记为BOLD RED。

这是我的子窗体布局:

Product | Batch #  |  Test result

我的规格表是这样的:

Product | Min | Max

我尝试使用DLookup失败,可能语法错误。

关于如何解决此问题的任何建议?

我想到的一个不错的主意是要有一个按钮来自动通知我的合格人员。

谢谢。

  • 已更新以便于理解

2 个答案:

答案 0 :(得分:1)

“产品”中的“自动编号ID”字段被设置为主键,而“批次”中的“产品”字段为文本。更改为数字长整数类型。在[产品规格]表中正确完成了此操作。

字段类型固定后,可以在LabBatchQuery中包含[Product Specification]表,并且可以在条件格式中直接引用该规范字段。

SELECT Batch.*, [Product Specification].*
FROM [Product Specification] RIGHT JOIN Batch ON [Product Specification].[Product Code] = Batch.Product
WHERE (((Batch.[Production Date])=[Forms]![TNA Batch Analysis]![Today Date]));

将RecordSource更改为仅引用LabBatchQuery而不是SQL语句。或者,不要在查询对象中使用动态参数(我从不这样做),而是将其放在RecordSource SQL语句中。 SELECT * FROM LabBatchQuery WHERE [Production Date]=[Forms]![TNA Batch Analysis]![Today Date];

条件格式设置规则将类似于:Value Is Not Between [pH Min] And [pH Max]

将[Today Date]文本框AfterUpdate代码更改为:Me.[LabBatchQuery subform].Requery

建议在命名约定中不要使用空格或标点符号/特殊字符(仅下划线除外)。

还建议不要在表中设置查找。

如果“产品”和“ [产品规格]”具有一对一的关系,为什么不合并为一张表?

答案 1 :(得分:1)

您可以使用 Form_BeforeUpdate 来验证/条件格式化数据

以下代码将限制PH值,如果它们超出产品规格表中定义的范围。同样,您可以为其他字段定义。

将此代码放入您的子表单:


Private Sub Form_BeforeUpdate(Cancel As Integer)

    Dim pH_Min As Double, pH_Max As Double

    If Nz(Product, -1) <> -1 And Nz(Me.Batch__, "") <> "" And Nz(Me.pH, -1) <> -1 Then

        pH_Min = DLookup("[pH Min]", "Product Specification", "[Product Code]=" & Product)
        pH_Max = DLookup("[pH Max]", "Product Specification", "[Product Code]=" & Product)


        If Me.pH.Value >= pH_Min And Me.pH.Value <= pH_Max Then
            'no action
        Else
            MsgBox "Invalid Value", vbInformation
            Cancel = True
        End If

    End If
End Sub