1

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

这是我的子表单布局:

Product | Batch #  |  Test result

我的规格表是这样的:

Product | Min | Max

我尝试使用DLookup但没有成功,可能语法错误。

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

我想到的一个好主意是有一个按钮来自动通知我的质量人。

谢谢你。

  • 更新以便于理解
4

2 回答 2

1

Products 中的 Autonumber ID 字段设置为主键,而 Batch 中的 Product 字段是文本。更改为数字长整数类型。这在 [产品规格] 表中正确完成。

一旦该字段类型固定,可以在 LabBatchQuery 中包含 [产品规格] 表,并且规格字段将可用于条件格式中的直接参考。

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]

将 [今天日期] 文本框更新后代码更改为:Me.[LabBatchQuery subform].Requery

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

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

如果 Products 和 [Product Specification] 是一对一的关系,为什么不合并为一张表呢?

于 2018-12-29T09:23:28.573 回答
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
于 2018-12-29T21:42:56.993 回答