MgS*_*Sam 1 ms-access ms-access-2010
我正在尝试在Access中为用户构建可更新的视图.基本上,基础表看起来像这样:
Accounts
--------
accountId
accountName
accountHolder
TransactionStatements
------------
statementId
accountId
received
month
year
Run Code Online (Sandbox Code Playgroud)
用户想要一个如下所示的Query(view):
StatementView
-------------
accountName
accountHolder
year
janReceived
febReceived
marReceived
etc...
Run Code Online (Sandbox Code Playgroud)
使用转置实现此目的的SQL非常简单,但生成的视图不可更新.
我也试过明确地做多个连接来完成这个:
PARAMETERS [Enter Year:] Long;
SELECT accountName, accountHolder, year,
FROM ((Accounts a
INNER JOIN TransactionStatements ts1 ON a.accountID = ts.accountID) 'AND month = 1 (This isn't allowed for some reason?)
INNER JOIN TransactionStatements ts2 ON a.accountID = ts.accountID) 'AND month = 2 (This isn't allowed for some reason?)
WHERE ts1.month = 1 AND ts2.month = 2 AND ts1.year = ([Enter Year:]) AND ts2.year = ([Enter Year:])
Run Code Online (Sandbox Code Playgroud)
但是,只要我添加第二个INNER JOIN,结果就会再次变为不可更新.我看过这个MS帮助页面,但它没有帮助我找到正确的方法来做到这一点.
它建议使用Forms作为替代方案,但在Access中构建自定义表单似乎比编写视图更加神秘和复杂.
有什么建议?
Joh*_*nes 20
看看为什么记录集不可更新的这个非常全面的原因列表:
当记录集始终可更新时
在以下情况下,记录集始终可更新:
当记录集永远不可更新时
在以下情况下,记录集永远不可更新:
记录集在某些条件下可更新
某些查询,特别是那些涉及Join的查询,在某些情况下不会更新,但会在其他条件下更新.在其他查询中,即使查询本身是可更新的,也不会有一些字段.以下是查询问题及其相应解决方案的案例.
基于没有关系的表的连接进行查询.
•问题:如果查询基于两个或多个未建立关系的表(启用了参照完整性),则查询将不可更新.
•解决方案:在"单侧"表上的"加入"中使用的所有字段上创建主键或唯一索引.需要说明的是,这意味着基于所有字段的一个主键或唯一索引,而不是每个字段上的单独索引.在基于具有一对多关系(1:M)的表的连接的查询中,您可能无法在一个或多个字段中编辑数据.
从"一"方加入字段
•问题:如果在两个表之间创建了1:M关系,则无法更改关系"one"侧表的主键字段(在Join中使用).
•解决方案:在两个表之间启用级联更新.
如果"许多"侧连接字段未出现在数据表中,则新记录
•问题:在基于1:M关系的查询中,您可以创建新记录并填写来自"一个"边表的字段,但是如果"很多"边表中的连接字段不可见在查询(即外键)中,您无法将数据添加到"多个"字段.
•解决方案:将"多"边表(即外键)中的连接字段添加到查询中以允许添加新记录.
"一"侧的新记录与其他"一"侧记录重复.
•问题:添加新记录时,如果尝试键入"一个"侧字段,则将尝试创建新记录.即使您使用相同的主键值,也会出现错误.
•解决方案:将值添加到与已存在记录的"一"侧连接字段(主键)匹配的"多"侧连接字段(外键).只会出现"一"侧值.
在"一"侧更新数据后,从"多"方加入字段
•问题:如果您当前正在编辑关系"一"侧的字段,则无法更改"多"侧连接字段(外键).
•解决方案:保存记录; 然后你就可以对"多"侧连接字段进行更改.
如果未输出ODBC表的完整唯一键,则为新记录
•问题:这与Never Updateable下的#5不同.在这种情况下,链接的ODBC表的主键存在,但不会添加到查询中.
•解决方案:选择ODBC表的所有主键字段以允许插入它们.
查询没有更新数据权限
•问题:未授予更新数据权限的查询(或基础表).
•解决方案:要修改数据,必须分配权限.
查询没有删除数据权限
•问题:未授予"删除数据"权限的查询(或基础表)
•解决方案:要删除数据,必须分配权限.结论
不可更新记录集的原因是多种多样的.有些人有解决方案,有些则没有.希望这份清单可以帮助您了解其中的差异.
以上是从以下博客中逐字逐句采取的:此记录集不可更新.为什么? 我认为最好复制并完全归因而不是试图解释,以便提供所有信息.
我建议你看看的第一件事可能是你的表有适当的索引,并且他们的关系设置正确.这些通常是我首先提出的两件事,他们倾向于解决我自己的大多数"不可更新的查询"问题.