带有连接的记录集不可更新 - 如何正确执行 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
因此,问题在于查询不可更新。也不清楚为什么您发布的代码会更新代码,然后尝试使用 runcommand + saverecord 进行保存记录集。
因此,将表单基于单个表。如果您需要更新子表中的其他列,请将它们全部移动到子表单中。这意味着您不必编写一行代码。所以,表格应该基于一张表而不是两张。如果您为主表单设置链接主/子设置,则显示的子表单和记录应遵循而无需额外代码。
【讨论】:
以上是关于带有连接的记录集不可更新 - 如何正确执行 VBA的主要内容,如果未能解决你的问题,请参考以下文章
由 INNER JOIN-ing 3 个表产生的记录集不可更新
从表单尝试时记录集不可更新,但如果仅加载子表单,则可以正常工作
使用带有记录集的 Access VBA 和 SQL 添加和删除记录