MS Access 子表单条件格式基于 table 上的数据
MS Access Subform conditional format based on data on a table
我的数据库有一个表单视图,供实验室将他们的测试结果输入到我们生产的每批产品中。
我有一个查询作为子表单数据源,我使用日期组合框让实验室人员查看当天的生产。我的问题是,当他们写入测试值时(例如批次 5,产品 A,测试结果 = 10),我需要子表单根据位于另一个 [=34] 中的 min/max 规范进行条件格式化=].假设这个 table 表示产品 A 允许的范围是 11-15。那么当技术人员写10时,应该会提示他对产品进行隔离。一种简单的方法是将 CELL 标记为粗体红色。
这是我的子表单布局:
Product | Batch # | Test result
我的规范 sheet 是这样的:
Product | Min | Max
我试过使用DLookup
没有成功,可能是语法错误。
关于如何解决这个问题有什么建议吗?
我想到的一个好主意是有一个按钮来自动通知我的质量人员。
谢谢。
- 为便于理解而更新
Products 中的Autonumber ID 字段设置为主键,但Batch 中的Product 字段是文本。更改为数字长整数类型。这在 [产品规格] table.
中已正确完成
固定该字段类型后,可以在 LabBatchQuery 中包含 [产品规格] table,规格字段将可用于条件格式中的直接引用。
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
建议不要在命名约定中使用空格或 punctuation/special 个字符(下划线除外)。
还建议不要在 table 秒内设置查找。
如果 Products 和 [Product Specification] 是一对一的关系,为什么不合并为 1 table?
您可以使用Form_BeforeUpdate
来验证/条件格式化数据
如果 PH 值超出产品规格 table 中定义的范围,下面的代码将限制 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
我的数据库有一个表单视图,供实验室将他们的测试结果输入到我们生产的每批产品中。 我有一个查询作为子表单数据源,我使用日期组合框让实验室人员查看当天的生产。我的问题是,当他们写入测试值时(例如批次 5,产品 A,测试结果 = 10),我需要子表单根据位于另一个 [=34] 中的 min/max 规范进行条件格式化=].假设这个 table 表示产品 A 允许的范围是 11-15。那么当技术人员写10时,应该会提示他对产品进行隔离。一种简单的方法是将 CELL 标记为粗体红色。
这是我的子表单布局:
Product | Batch # | Test result
我的规范 sheet 是这样的:
Product | Min | Max
我试过使用DLookup
没有成功,可能是语法错误。
关于如何解决这个问题有什么建议吗?
我想到的一个好主意是有一个按钮来自动通知我的质量人员。
谢谢。
- 为便于理解而更新
Products 中的Autonumber ID 字段设置为主键,但Batch 中的Product 字段是文本。更改为数字长整数类型。这在 [产品规格] table.
中已正确完成固定该字段类型后,可以在 LabBatchQuery 中包含 [产品规格] table,规格字段将可用于条件格式中的直接引用。
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
建议不要在命名约定中使用空格或 punctuation/special 个字符(下划线除外)。
还建议不要在 table 秒内设置查找。
如果 Products 和 [Product Specification] 是一对一的关系,为什么不合并为 1 table?
您可以使用Form_BeforeUpdate
来验证/条件格式化数据
如果 PH 值超出产品规格 table 中定义的范围,下面的代码将限制 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