带有连接的记录集不可更新 - 如何正确执行 VBA

Posted

技术标签:

【中文标题】带有连接的记录集不可更新 - 如何正确执行 VBA【英文标题】:Recordset with join is not updateable - how to do VBA right way 【发布时间】:2020-06-14 09:20:16 【问题描述】:

如果重复一些较旧的答案,我很抱歉,但我无法弄清楚。 我有Access表单,连接到db,通过一些字段和一些vba程序过滤来操作它。

有选择定义我的记录集:

strsearch = "Select * from T1 left join DatT2M on T1.ID = DatT2M.RefID where ((Mesto like ""*" & strtextM & "*"" and (DatT2M.DatumT2M > " & DatK_od & " and DatT2M.DatumT2M < " & DatK_do & ") and (T1.DatumDK > " & DatDK_od & " and T1.DatumDK < " & DatDK_do & ") ))"

T1 和 T2 是来自 db 的链接表,

Dat2M 是查找最后更新日期的“辅助”查询:

   SELECT T2.RefID, Max(T2.Datum) AS DatumT2M
   FROM T2
   GROUP BY T2.RefID
   HAVING (((T2.RefID) Is Not Null));

和 after_update 字段我通过这个 VBA 函数保存它们:

With Me.Recordset
    .Edit
    .Fields("[uzivatel]") = uzivDB
    .Update
End With
DoCmd.RunCommand acCmdSaveRecord.

当我更新表单的某些字段时,会出现一些声音,并且在 Access 窗口的左角写着“Recordset is not updateable”。

您能告诉我,我对我的代码进行了哪些更改,以使其可更新并将值写入数据库表?

【问题讨论】:

【参考方案1】:

查询根本无法更新。因此,您必须更改更新代码,或更改用于显示和填充表单控件的代码。

一种方法是将子表的所有控件移动到子窗体中,从而可以对其进行编辑。您没有提及您的示例更新代码是尝试更新主表中的列,还是您的 sql 连接的子表。

所以,你的更新代码变成了这样:

dim rst     as dao.RecordSet
dim strSQL  as string
strSQL = "select * from DAT2M where Ref2id = " & me!id
set rst = Currentdb.OpenRecordSet(strSQL)
rst.edit
rst.Fields("[uzivatel]") = uzivDB
rst.Update
rst.close

因此,问题在于查询不可更新。也不清楚为什么您发布的代码会更新代码,然后尝试使用 runco​​mmand + saverecord 进行保存记录集。

因此,将表单基于单个表。如果您需要更新子表中的其他列,请将它们全部移动到子表单中。这意味着您不必编写一行代码。所以,表格应该基于一张表而不是两张。如果您为主表单设置链接主/子设置,则显示的子表单和记录应遵循而无需额外代码。

【讨论】:

以上是关于带有连接的记录集不可更新 - 如何正确执行 VBA的主要内容,如果未能解决你的问题,请参考以下文章

访问选择查询记录集不可更新

由 INNER JOIN-ing 3 个表产生的记录集不可更新

从表单尝试时记录集不可更新,但如果仅加载子表单,则可以正常工作

使用带有记录集的 Access VBA 和 SQL 添加和删除记录

Access 2010 VBA - 打开新记录集 - 打开之前意外保存的值

如何使用 VBA 执行插入/更新记录的存储过程?