0

我有一个列出表中所有记录的 Access 表单。该表中的一列引用“设备”表,然后该表具有对“品牌”列的外键引用。在表格中,品牌名称 + 设备名称由于某种魔法而显示在每行的组合框中。

问题:如何按品牌名称对该表格进行排序,同时仍保留创建新记录的能力?这是我当前的查询:

SELECT ehs.*
FROM ehs, brand, device
WHERE brand.ID=device.brand_id AND ehs.device_id=device.ID
ORDER BY brand.brand_name, device.model;

显然(并且可以理解),当查询中有连接时,您无法添加记录。排序列表的更好方法是什么?

4

1 回答 1

1

可以在允许添加和更新的查询中创建具有外键的表单。我刚刚在 Access 2010 中完成此操作以确认。

您提到的组合框的某些魔法可能破坏了这样做的能力。

注意:我刚刚注意到我使用DeviceName了你使用过的地方model——你需要调整下面的 SQL。

不过也有一些技巧:

  • 确保所有表都有主键(在 Access 中很难避免)
  • 确保所有外键都被索引(所以设备表中的brand_id和ehs表中的device_id) - 可以重复。
  • 使用关系图来绘制这些表之间的关系

然后我创建了一个查询 - 我只是使用了查询设计器,所以 Access 有趣的括号排列是它自己做的:

SELECT ehs.*
FROM (Brand INNER JOIN Device ON Brand.brandID = Device.BrandID) INNER JOIN ehs ON Device.DeviceID = ehs.DeviceID
ORDER BY Brand.Brandname, Device.DeviceName;

如果您在数据表视图中查看它,您应该能够添加一条记录。这很重要,如果你不能有问题,如果你能,那么我们就在路上。

如果这可行,那么我建议基于此查询创建一个新表单并验证新表单是否允许您添加记录。这个新表格基本上会有一个 device_id 的 id 号。因此,您必须输入一个数字才能使其工作。

您要执行的技巧是,我猜是导致您出现问题的事情:

要有一个“品牌”下拉菜单,您可以选择一个品牌,然后限制设备下拉菜单的选项。

这真的很棘手(而且我担心我在 Access 中有点生疏,这不是问题,真的)。

相反,您可以轻松地为设备提供一个下拉列表,其中包括品牌名称,并对其进行适当的排序。

我在表单中添加了一个组合框。向导会引导您使用表或查询,我只是选择了设备表(我们稍后会调整)和字段 - 您需要 device_id 模型和品牌 ID,以及要显示的内容(模型和品牌 ID - 我们将调整它)并且它隐藏了主键。当它说“您要保存以供以后使用还是将其存储在此字段中,请选择将其存储在此字段中并选择 device_id (在 ehs 表中)。

向导完成后,单击新组合框,并获取它的属性。切换到数据选项卡,旁边有一个构建器 [...] 按钮RowSource。单击它,您将获得一个查询生成器。添加 Brand 表并显示brand_name 字段并隐藏brand-id 字段。(我们只是选择了它,所以组合框有两列)。随意排序。

当你关闭它时,它会询问你是否要保存它,所以说是。您的 SQL 将类似于(由于我的错误而更改了适当的字段名称):

SELECT Device.DeviceID, Brand.Brandname, Device.DeviceName
FROM Brand INNER JOIN Device ON Brand.brandID = Device.BrandID
ORDER BY Device.DeviceName;

您的表单现在应该有一个组合框,在未选择时显示设备名称,在您选择下拉列表时显示设备名称和品牌名称。

然后,您可以从表单中删除原始的 device_id 文本框。

您还可以将品牌名称添加到源查询中,并将其作为文本字段添加到表单上,这样您就可以在设备旁边看到品牌,即使它不在下拉列表中。

表单的主要查询可以是:

SELECT ehs.*, Brand.Brandname
FROM (Brand INNER JOIN Device ON Brand.brandID = Device.BrandID) INNER JOIN ehs ON Device.DeviceID = ehs.DeviceID
ORDER BY Brand.Brandname, Device.DeviceName;

您可以将 BrandName 添加为文本框 - 您不需要设备名称(型号),因为它显示在组合框中。

而且您应该仍然可以添加记录。

所以,并不理想,但比编写一堆 VBA 代码要简单得多,如果你想分离你的组合框(不确定),我认为你需要去那里,特别是因为这不是最初的问题。

我建议您执行每个步骤并验证它在每个阶段仍然有效。

祝你好运。

于 2013-06-25T09:58:58.057 回答