2

我在 Access 2002 中遇到了一些问题...

我有两张表,一张包含大约 60k 次出现,一张包含一列和用于连接的外键。在我的表单中,我将源设置为连接了这两个表的查询(在空表上左连接)。基本上,我最终得到了我的 60k 次出现和我的新专栏。

现在,我需要允许我的用户在我的表单中编辑这个字段。我发现当我的空表中存在相应的数据时,我可以很好地编辑该字段,但是由于我们需要这个空表只包含我们需要添加新列的事件,所以我不能简单地制作一个我所有事件的新条目。

这是两个表的架构:

表格1:

ID    Sequence    Col1    Col2    Col3    Col5
60k

表 2:

ID    Sequence    Col6
0

我的查询:

SELECT tblOne.*, tblTwo.Col6
FROM tblOne 
LEFT JOIN tblTwo ON (tblOne.Sequence=tblTwo.Sequence) AND (tblOne.ID=tblTwo.ID); 
4

2 回答 2

2

如果您愿意考虑不同的方法,那么使用表单/子表单方法可能会更容易。

主窗体基于tblOne,子窗体基于tblTwo。使用SequenceandID作为主/子链接字段(您可以在子窗体控件的属性表中找到该设置)。

使用这种设计,子表单将显示tblTwo与主表单的当前行匹配的现有tblOne行。您可以在子表单的新记录中添加一个新的匹配tblTwo行——它将“继承”当前主表单行的SequenceID值。

顺便说一句,Sequence是一个保留字。如果可能,重命名该字段。如果必须保留该名称,则可以通过将名称括在方括号中或在 SQL 语句中使用表名(或别名)限定字段名来避免混淆 db 引擎的风险。

于 2013-09-19T21:25:10.007 回答
1

如果您有一个不可更新的查询,请查看 Allen Browne 关于可能导致此问题的提示:http: //allenbrowne.com/ser-61.html

MS Access 有一个缺点。如果您希望在类似列表的视图中编辑数据,通常最好将其显示在与存储在表中的基本相同的结构中。编辑:参考 Yawar 留下的关于这不是 Access 缺点的评论,我想指出,在 .NET 中开发时,数据库结构与所使用的数据模型类完全不同并不少见在您的应用程序中。在这种情况下,GUI 建立在数据模型之上,因此数据库看起来可能与您的数据模型/GUI 有所不同(或事件完全不同)。

回到 MS Access,当您使用表连接为数据表表单或连续表单创建记录源/记录集时,我的理解是只有一个表是可更新的。换句话说,只有连接的一侧是可更新的。在许多情况下,由于 DAO 引擎被混淆,记录集根本不可更新。更新:我从下面的链接推断出我上面写的似乎比使用 JET/ACE 后端更适用于 SQL Server。

正如 HansUp 所建议的,最常见的解决方案是使用表单/子表单方法。实际上,您可以将数据表子表单作为另一个数据表子表单的子表单,这在您的情况下非常有效。每条记录的最左侧只有一个可扩展的加号,因此您可以在 tblTwo 中添加/编辑/删除记录。

另一种选择是使用 ActiveX 网格控件,例如 10tec 的 iGrid,这意味着您将为各种事情编写相当多的代码,例如加载记录集、将更改/添加/删除写回数据库、处理格式细胞等

另一种选择是使用伪造的 ADO 记录集。这是一种非常笨拙的方法,我不能说我真的见过它在使用中,主要是尝试过它并从理论上阅读它。问题是您必须创建一个与您生成的记录集几乎相同的虚构记录集,然后您必须循环遍历并将所有记录从生成的记录集中复制到您的虚构记录集中。这是一个巨大的开销,尤其是对于这么多的记录。然后,您必须再次编写代码以将所有添加/更改/删除写回数据库。处理新主键的创建可能很棘手。这种特殊的方法并不容易或简单,我不建议 VBA 初学者处理。

如果您使用的是 SQL Server,您应该查看 Microsoft 网站上的以下文章。它涵盖了各种材料,包括从单个记录源/视图更新多个表。http://technet.microsoft.com/en-us/library/bb188204%28v=sql.90%29.aspx

于 2013-09-19T22:20:42.687 回答