子表单中每个相关记录的空字段

Posted

技术标签:

【中文标题】子表单中每个相关记录的空字段【英文标题】:Empty field for each related record in subform 【发布时间】:2019-02-07 06:10:11 【问题描述】:

关于 MS Access 数据库。

    主表单(客户)包含字段 Case 和 OriginalCase

    主表单按钮 #1(停用)将值从 Case 复制到 OriginalCase 并清除 Case 值

    主表单按钮 #2 (Command297) 将值从 OriginalCase 复制回 Case(如恢复备份)

    主表单包含子表单 (ClientDBHistory),在主表单中显示每个客户端的多条记录(对于主表单中的每个客户端,它显示来自子表单的所有相关记录)

    子表单已链接 OriginalCase 字段

我尝试对 Button #1 使用类似的编码,它只替换了子表单 Casenum 的 1 个值,而不是所有相关的值。按钮 #2 没有恢复子表单的 Casenum 的值。

如下:

Forms!Clients!ClientDBHistory.Form!OriginalCase = Forms!Clients!ClientDBHistory.Form!Casenum
Forms!Clients!ClientDBHistory.Form!Casenum = Null

下面是我的代码

Private Sub Command297_Click()
If IsNull(Me.[OriginalCase]) Then
MsgBox ("Cannot use this button if the Original Case field is empty. It will result in errors.")
ElseIf Not IsNull(Me.[OriginalCase]) Then
Me.[Casenum] = Me.[OriginalCase]
End If
End Sub

Private Sub Deactivate_Click()
If IsNull(Me.[Casenum]) Then
MsgBox ("Cannot use this button if the Casenum field is empty. It will result in errors.")
ElseIf Not IsNull(Me.[Casenum]) Then
Me.[OriginalCase] = Me.[Casenum]
Me.[Casenum] = Null
End If
End Sub

我希望按钮 #1 和 #2 对子表单中的所有相关记录执行相同的操作。 (不是新按钮)。

Master 拥有 Casenum 123456 子表单显示来自 123456 不同日期的所有相关条目

按钮 #1 将 Master 的 Casenum 复制到 OriginalCase 并清除 Casenum。然后应该对子表单中的所有相关条目 123456 发生相同的情况,从子表单的 Casenum 到 OriginalCase 并清除子表单的 Casenum。 按钮 #2 将 Master 和 Subform 的 OriginalCase 恢复到记录(不清除 OriginalCase)

【问题讨论】:

【参考方案1】:

你必须从表格而不是表格的角度来看待这个问题。您没有提供有关您的表结构的任何信息,因此我只能提供一般性指导。你需要的按钮是这样的:

DoCmd.RunSQL "UPDATE [MyTable] SET [Values I want change] WHERE [limit changes to the records displayed in the form]"
Rem Repeat if you need to UPDATE more than one table and your table relationships are not set to update
Me.Requery

编辑:这是 OP 用于解决问题的代码的(IMO)简化版本:

DoCmd.SetWarnings False
DoCmd.RunSQL "UPDATE tblClient SET Casenum=OriginalCase WHERE OriginalCase=' & Me.OriginalCase & "'"
DoCmd.RunSQL "UPDATE tblPayments SET Casenum=OriginalCase WHERE OriginalCase=' & Me.OriginalCase & "'"
Me.Requery
DoCmd.SetWarnings True

简化是基于在主窗体的上下文中运行,OriginalCase 是一个链接窗体和子窗体的字段,因此在两种窗体中是相等的。我假设OriginalCase 是一个文本字段,否则代码可以进一步简化。

作为补充说明,可以永久禁用运行操作查询的警告,而不必一直禁用和启用它们。

【讨论】:

感谢您的回复。 Master Form 修改名为 tblClients 的表中的数据。该表中受影响的字段是 Casenum 和 OriginalCase。 Subform 修改名为 tblPayments 的表中的数据。该表中受影响的字段也是 Casenum 和 OriginalCase。但是,这是具有相同 Casenum 的客户的多条记录的表。我希望这能更清楚地说明这一点。我不想删除整个记录,只是将值更改为 NULL/将 Subform/tblPayments 中 Casenum 的值移动到 OriginalCase。 我想对 SunKnight() 提供一般性答案表示感谢。我用谷歌搜索了他的答案示例,并在理解后立即对其进行了编码。 DoCmd.SetWarnings False DoCmd.RunSQL "UPDATE [tblClient] SET [Casenum] = [OriginalCase] WHERE [OriginalCase] = Forms!Clients.[OriginalCase]" DoCmd.RunSQL "UPDATE [tblPayments] SET [Casenum] = [OriginalCase] WHERE [OriginalCase] = Forms!Clients!ClientDBHistory.Form![OriginalCase]" Me.Requery DoCmd.SetWarnings True

以上是关于子表单中每个相关记录的空字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在Access中使用子表单时编辑现有记录而不创建新记录?

带有子表单的表单 - 通过更新两个字段之一来查找记录

从主表单域自动填充子表单域

Access 子表单中的字段名称填充了 vba 记录集

LibreOffice Base 子窗体显示不相关的记录

如果主窗体上有多个子窗体,则从 ACTIVE 子窗体打开记录