MS Access链接的组合框正在更新源表,当我希望它是只读的时

问题描述 投票:0回答:1

很抱歉,冗长的解释;我希望详细信息将有助于解释我想做什么。

在Access 2016中,我希望用户能够进入一个表单并从一个表中选择两个值的组合(只读),然后在与该组合相对应的不同字段中输入其他详细信息。保存记录后,其他详细信息以及与所选行组合相对应的行ID将保存在其他表中。

例如,说我有一个数据库,用于跟踪公司对它们如何满足各种政府法规要求的反应。我有一张法规表,其中包含以下字段:

  1. 行ID
  2. 规则集,将静态值存储在值列表中(例如,“ HIPAA”,“ PCI DSS”等)
  3. 法规编号
  4. 法规文本

在此表中,法规编号可能在法规集之间相同,但组合是唯一的,因此我在这两列上添加了唯一索引。

我还有另一个捕获响应信息的表。响应表具有FK列,该列链接到“法规”表中的行ID。 Responses:Regulations之间存在1:M关系。

我希望用户能够从下拉列表中选择法规集,然后有第二个下拉列表,该列表仅显示基于法规集的相关法规编号。然后,他们可以在其他字段中输入相关的响应数据。

我使用表单向导创建了一个表单,其中包含规则集和规则名称以及响应数据字段的组合框。链接组合框效果很好。我可以选择一个规则集,然后将规则编号列表限制为仅适用于该规则集的规则编号。但是,当我希望它是只读的时,它会尝试更新法规表。

假设我在规则集的规则表中有这些条目-规则编号HIPAA-1.0HIPAA-1.1HIPAA-1.3PCI DSS-5aPCI DSS-5b

我进入表单,并在第一个组合框中选择HIPAA。第二个组合框正确显示值1.0、1.1、1.3。我选择1.3,除了尝试关闭表单外,什么也不做。我收到一条错误消息,说该记录无法保存,因为它会导致“法规”表上的值重复。如果我删除唯一约束并重复步骤,则可以关闭该表单,但是当我转到“规则”表时,它已覆盖了数据,现在我有两个HIPPA行,其规则名称为1.3。

我希望表单仅使用“法规”表作为查找而无需任何更新。一旦用户有了“法规设置/编号”组合并保存了响应,我想将“法规行ID”存储在“响应”表中。

我认为这与规则集和规则编号之间的1:M关系有关,因此,当我选择一个规则集时,它将从表中选择一条记录;然后我选择的Reg编号可能来自其他行。我可以解决表单上的这种不匹配问题,因为当我保存响应记录时,我可以在监管表中查询与所选值相对应的行ID。但我想不出如何阻止它尝试更新法规表。

任何帮助将不胜感激!

ms-access combobox ms-access-2016 ms-access-forms
1个回答
0
投票

我能够在另一个论坛上获得帮助,所以我决定将答案放在这里,以防它对其他人有帮助。就我而言,解决方案涉及以下内容。 #4是我所缺少的。

1)规则集(较高级别)组合框应该是未绑定的,并且记录源应等于规则集表中的规则集名称和ID。2)规则组合框绑定到响应表(如果在规则表中有FK,则在此列表中),并且它使用规则表作为其记录源。记录源受“规则集”组合框的值限制。

3)规则集组合框具有更新后事件以重新查询规则组合框。4)然后,需要一些VBA代码才能使“法规设置”组合框显示基于“法规”组合框的当前值的正确值。这在当前事件的表单上进行:

'Check if this is a new record; if not then there is a value
' in the Regulation combo box that can be used to determine
' the value to display in the Regulation Set combo box.
If Me.NewRecord = False Then
  ' Lookup the Regulation Set
  Me.cboRegSet = DLookup("[ID]", "tblRegulationSet", "[ID] =" & _
    DLookup("[RegulationSetID]", "tblRegulation", "ID=" & Me.RegulationID))
  'Requery the Regulation combo box
  Me.cboRegulation.Requery
  ' Get the "Regulation.ID" based on the foreign key "RegulationID"
  Me.cboRegulation = DLookup("[ID]", "tblRegulation", "ID=" & Me.RegulationID)
  Else
  'If this is a new record, blank out the Regulation Set
  Me.cboRegSet = ""
End If
© www.soinside.com 2019 - 2024. All rights reserved.