在保持添加能力的同时按外地排序记录

时间:2013-06-25 08:39:35

标签: ms-access-2013

我有一个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;

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

1 个答案:

答案 0 :(得分: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中有些生疏,而且这不是问题,真的)。

CAN 所做的事情,很容易就是设备的下拉菜单,其中包括品牌名称,并进行适当的排序。

我在表单中添加了一个组合框。该向导将指导您使用表格或查询,我只是选择了设备表(我们稍后会对其进行调整)和字段 - 您需要device_id模型和brand_id,以及要显示的内容(model和brand_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添加为文本框 - 您不需要devicename(模型),因为它显示在组合框中。

你仍然可以添加记录。

所以,不理想,但比编写一堆VBA简单得多,如果你想分开你的组合框(不确定),我认为你需要去的地方,特别是因为那不是原来的无论如何问题。

我建议你做每一步,并确认它仍然在每个阶段都有效。

祝你好运。