【问题标题】:MS Access Subform conditional format based on data on a table基于表格数据的 MS Access Subform 条件格式
【发布时间】:2018-12-29 05:40:40
【问题描述】:

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

这是我的子表单布局:

Product | Batch #  |  Test result

我的规格表是这样的:

Product | Min | Max

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

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

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

谢谢。

  • 为便于理解而更新

【问题讨论】:

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

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


【解决方案1】:

产品中的自动编号 ID 字段设置为主键,但批处理中的产品字段是文本。更改为数字长整数类型。这在 [产品规格] 表中正确完成。

一旦字段类型固定,可以在 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] 是一对一的关系,为什么不合并为一张表呢?

【讨论】:

  • 感谢您的提示。我有很多工作要做......哈哈....我修复了一件事,我打破了 5.... 在我将字段修复为长整数类型后,我的所有查询都失败了。我修复了引用,然后我的 Union 查询显示的是产品 ID 而不是产品代码。我通过将绑定列更改为 2(在批处理表中的查找中)来解决此问题。我现在明白你所说的不在表中使用查找的意思了。哈哈...我现在有很多工作要做。我会学。感谢您的帮助
  • 我很困惑,将 BoundColumn 更改为 2 意味着保存描述性文本;但如果您将产品字段更改为数字类型,则无法保存字母字符。为什么要将产品 ID 作为计算字段?特别是因为它只是重复 ID 字段。至于生产日期字段,这是我第一次看到根据标识符值计算的日期,通常是其他方式。我最近遇到了一个问题,表计算字段在报表上的聚合计算中不起作用,必须是在查询中计算的字段。大多数有经验的开发人员都避免使用表格计算字段类型。
  • 我的产品必须是文本,因为它是字母数字 - 例如“TNA310S”。我试图更改为整数,它不允许我。至于为什么我有一个产品 ID 作为计算字段,我无法回答。我真的不记得创建它,除非我被困在某个地方并且我试图解决某些问题。附上完整的数据库。 dropbox.com/s/i5jh1h3ma3m5ez2/To%20Share%202.accdb?dl=0 - 使用 START 表单导航
  • 当然,我希望这不是我建议的更改。它是 Products 的主键 ID,应该保存到 Batch 和 [Product Specification] 表中。您已针对 [产品规格] 执行此操作,但未针对批次执行此操作。所以“改变”可能具有误导性。在批处理中创建数字字段并使用 ID 填充。修复查询并删除文本字段。
  • 执行此操作后,此查询是否可编辑? SELECT Batch.*, [产品规格].*
【解决方案2】:

您可以使用 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

【讨论】:

  • @GuilhermeBrum 对此有何更新?
猜你喜欢
  • 2022-10-07
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多