【问题标题】:Selecting records in MS Access form based on combo box contents根据组合框内容在 MS Access 表单中选择记录
【发布时间】:2018-12-06 11:53:43
【问题描述】:

我有一个包含两个表的访问数据库,一个用于用户,另一个用于用户权限。

users 表有一个具有唯一 ID 的用户名列表:

ID | Name
1  | Joe Bloggs
2  | Steve Smith
3  | A Another

权限表有一个用户 ID 列表和他们允许访问的区域:

ID | Zone1 | Zone 2
1  | X     |
2  |       | X
3  | X     | X

我已经创建了一个表单,用于根据权限表更新用户的权限,手动前进和后退都可以正常工作,在这个表单上我有一个组合框,列出了第一个表中的所有用户。

我的问题是,如何让它导航到权限表中的记录?我知道我需要在组合框的“更新后”字段中放置一些代码,并在组合框显示 User.ID 字段而不是 User.Name 时设法让它工作。我还设置了两个用户 ID 字段之间的关系,但这也不起作用。

总而言之,我想从用户名下拉框中选择“另一个”,它在用户表中的 ID 为 3,然后从权限表中导航到记录 ID 3。

提前致谢

【问题讨论】:

  • 您不工作的组合包含行源查询中的 ID 字段(除了用户名之外)并绑定到它。显示行源、绑定列和更新后事件代码。
  • 看来我误解了您的需求。您不想从组合中选择一个用户然后显示其区域?
  • 我做到了,我发现子表单解决了这个问题。我创建了一个显示区域的子表单,然后主表单选择要使用的用户记录。我的答案有点像 Zacks,但略有不同,因为我希望复选框为用户添加或删除完成的权限
  • 子表单功能强大,但您可以解决最初的问题,只需显示用户名,但返回 ID。 .只显示行源、绑定列和更新后事件代码..

标签: ms-access vba


【解决方案1】:

首先,您的表结构没有很好地规范化或结构化。如果您有多个用户可能有权访问的区域,则将每个区域权限存储为一列是低效的。很难获得有关用户可能有权访问的区域的信息(区域元数据),并且为每个额外的区域添加一个新列会大大增加您的数据库大小并使查询变得麻烦。

更好的方法是拥有 3 个表:

  • Users(ID, Name)
  • Zones(zone_id, additional_zone_attributes)
  • user_zone_permissions(user_id, zone_id, additional_permission_attributes)

使用这种结构,您仍然可以使用@LeeMac 使用子表单的答案:父表单将列出用户详细信息,子表单将列出区域权限:

使用这种结构,添加额外的特权属性也很简单(也许您想添加特权的生效日期)。

只需确保正确设置主键和外键(使用关系)屏幕:

现在,说了这么多,如果你不能重构你的结构,你根本不需要使用子表单。由于您的userspermissions 表似乎具有一对一的关系,因此您可以将所有内容存储在一个表单中(或者将所有内容放在一个表中,或者将表单绑定到组合数据的查询)。但是,就像我说的,如果可以的话,你最好改变你的结构。

【讨论】:

  • 感谢 Zack,我当然可以更改权限表的结构以反映您所显示的内容。我选择了这个现有的结构,因为直接在表级别管理它是最简单的,但我意识到这不是未来扩展等的最佳格式。我现在就试试你的建议
【解决方案2】:

在表单中插入一个子表单,其中 Master Field 设置为 Users 表中的 ID,Child Field 设置为 @987654322 中的 ID @表。

这样,不需要事件处理程序,显示的记录将自动更改。

【讨论】:

  • OP 想要使用组合“导航”,因此当用户被选中时,他需要一个用于组合导航的事件(通常是 AfterUpdate)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多