Access前端临时表窗体Checkbox无法勾选,提示记录集不可更新
解决Access本地临时表记录集不可更新的问题
问题场景
你在Access前端创建了本地临时表[_TempPhone_tbl],后端采用SQL Server,该临时表绑定到SMS窗体的子窗体。通过INSERT语句从后端视图和表填充数据后,勾选子窗体的复选框时提示“This Recordset is not Updatable”。
排查与解决步骤
1. 检查子窗体的记录集类型
打开子窗体的设计视图,切换到数据选项卡:
- 如果「记录集类型」设为「快照」,直接改成「动态集」或者「动态集(不一致的更新)」——快照模式下记录集完全不可编辑。
2. 确认临时表的结构设置
打开[_TempPhone_tbl]的设计视图,核对以下两点:
ID字段必须是自动编号类型,且已经设为主键——Access需要明确的主键来定位可更新的单条记录。Check字段的「数据类型」是「是/否」,且「允许编辑」属性设为「是」。
3. 优化数据填充后的刷新逻辑
执行INSERT语句后,必须同步刷新临时表和子窗体的记录集,避免状态不同步:
' 执行INSERT语句 CurrentDb.Execute SQLstr, dbFailOnError ' 刷新临时表元数据 CurrentDb.TableDefs("_TempPhone_tbl").Refresh ' 强制子窗体重新加载记录集 Forms!你的SMS主窗体名!子窗体控件名称.Requery
4. 确认临时表的创建方式(动态创建时)
如果临时表是用代码动态创建的,确保创建语句正确设置了主键和字段属性,示例代码:
CurrentDb.Execute "CREATE TABLE _TempPhone_tbl (" & _ "ID AUTOINCREMENT PRIMARY KEY," & _ "CNR TEXT(50)," & _ "RelationID LONG," & _ "FullName TEXT(100)," & _ "PhoneNumber TEXT(20)," & _ "Check YESNO);"
手动创建的话,直接在设计视图里确认主键和字段类型即可。
5. 排查数据源的唯一性
填充数据的SELECT语句返回的记录如果存在重复,Access可能会把整个记录集标记为不可更新。可以给SELECT语句加上DISTINCT去重:
SQLstr = "INSERT INTO [_TempPhone_tbl]([CNR],[FullName],[PhoneNumber],[RelationID])" & _ "SELECT DISTINCT [1-04_RelationsPhoneTBT_vw].PCNR, " & _ "[1-02_ClientRelations_tbl].[FirstName]+' '+[1-02_ClientRelations_tbl].[Surname] AS RelationName," & _ "[1-04_RelationsPhoneTBT_vw].PhoneNumber,[1-04_RelationsPhoneTBT_vw].RelationID " & _ "FROM [1-02_ClientRelations_tbl] " & _ "INNER JOIN [1-04_RelationsPhoneTBT_vw] ON [1-02_ClientRelations_tbl].RelationID = [1-04_RelationsPhoneTBT_vw].RelationID " & _ "Where [1-04_RelationsPhoneTBT_vw].PCNR = " & Me.CNR & " AND [1-04_RelationsPhoneTBT_vw].Active = True "
内容的提问来源于stack exchange,提问作者Hariharan Iyer
相关产品推荐
相关产品推荐

