首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在保持添加能力的同时,按外部字段排序记录

在保持添加能力的同时,按外部字段排序记录
EN

Stack Overflow用户
提问于 2013-06-25 16:39:35
回答 1查看 357关注 0票数 0

我有一个Access窗体,它在一个表中列出所有记录。该表中的一列引用了'device‘表,然后该表具有对'brand’列的外键引用。在表单中,由于在每一行的组合框中显示了一些魔术,所以会显示品牌名称+设备名称。

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

代码语言:javascript
复制
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;

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-25 17:58:58

您可以通过创建一个窗体,该窗体在查询中具有允许添加和更新的外键。我只是在Access 2010中做了这件事来确认。

可能是你提到的组合框的一些魔力破坏了这样做的能力。

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

不过,也有一些技巧:

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

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

代码语言:javascript
复制
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号。因此,您必须键入一个数字才能使其工作。

你想要表演的把戏是,我猜是给你带来问题的东西:

有一个“品牌”下拉列表,您可以选择一个品牌,这将限制设备下拉列表的选项。

这真的很棘手(我担心我在访问方面有点生疏,这不在问题的范围内,真的)。

你可以做什么,很容易,相反,是有一个设备下拉列表,其中包括品牌名称,并对其进行适当的排序。

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

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

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

代码语言:javascript
复制
SELECT Device.DeviceID, Brand.Brandname, Device.DeviceName
FROM Brand INNER JOIN Device ON Brand.brandID = Device.BrandID
ORDER BY Device.DeviceName;

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

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

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

表单的主要查询可以是:

代码语言:javascript
复制
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要简单得多,我认为如果你想分离你的组合框(不确定),这是你需要去做的,特别是因为这不是最初的问题。

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

祝好运。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17292765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档