我有一个SQL Server作为后端,并使用ms访问作为前端。
我有两个表(persons
和managers
),manager
派生自persons
(1:1关系),因此我创建了一个视图{{1这基本上是:
managersFull
SELECT *
FROM `managers` `m`
INNER JOIN `persons` `p`
ON `m`.`id` = `p`.`id`
中的{p> id
是自动递增的,persons
中的主键id
是主键和外键,引用managers
。{{ 1}}
现在我希望能够插入一个带有ms访问形式的新数据集,但我无法使其工作。没有错误信息,没有状态行,没有。没有插入新行,我必须按下escape才能取消我的更改以返回ms访问中的设计视图。
我说的是persons
表单,我希望能够以单一形式同时输入经理和个人信息
我现在的问题是:我可以在这里做什么?如果没有,是否有一个“简单”的解决方法使用插入触发器或一些vba代码行?
提前致谢
答案 0 :(得分:2)
问题是您的视图跨多个表。如果您访问多个表,则只能更新或插入其中一个表。
另请查看MSDN以获取有关限制的详细信息以及proper strategies for view updates
答案 1 :(得分:1)
假设ODBC,需要考虑一些事项:
确保在person表中有一个时间戳字段,并在管理器视图中返回该字段。您可能还需要管理器视图中人员表的真实PK(我假设您的视图采用用于自联接的FK并将其作为ID字段别名 - 我不会自己这样做,因为它令人困惑。相反,我会在管理器视图中使用真正的外键名称,并让PK凭借其真实名称独立存在。)
在您的记录源中尝试Jet / ACE特定的DISTINCTROW谓词。使用Jet / ACE后端,这通常可以在不可能的情况下插入两个表中。我不确定Jet是否会足够智能告诉SQL Server做正确的事情。
如果这些都不起作用,请将表单更改为使用基于人员表的记录源,并使用基于管理器视图的组合框作为控件,使用该控件编辑记录以将人员关联到经理。
答案 2 :(得分:0)
Ilya Kochetov指出,您只能更新一个表,但解决方法是将更新应用于一个表上的字段,然后再应用于另一个表。此解决方案假定您对这两个表的唯一访问是通过此视图,并且不允许您创建存储过程来处理此问题。
答案 3 :(得分:0)
要在访问中建模和维护两个相关表,请不要使用作为两个表的连接的查询或视图。你要做的是使用一个主窗体,并放入一个基于子表的子窗体。如果正确设置了子表单中的链接主设置和子设置,则无需编写任何代码,访问权限将在链接字段中插入此人的ID。
所以,不要在这里使用连接表。只需使用表单+子表单设置,您就可以编辑和维护相关子表中的数据和数据。
这意味着您将表单基于表格而不是视图。并且您将子表单基于子表。所以,不要在这里使用视图。