根据组合框内容选择MS Access表单中的记录

时间:2018-12-06 11:53:44

标签: vba ms-access access-vba

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

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。

预先感谢

2 个答案:

答案 0 :(得分:3)

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

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

  • Users(ID, Name) <-这与您现在拥有的相同。
  • Zones(zone_id, additional_zone_attributes)
  • user_zone_permissions(user_id, zone_id, additional_permission_attributes)

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

使用这种结构,添加其他特权属性(可能要在要添加特权的有效日期的行下方)也很简单。

只需确保正确设置主键和外键(使用“关系”)屏幕: enter image description here

现在,毕竟,如果您无法重构结构,则实际上根本不需要使用子表单。由于您的userspermissions表似乎是一对一的关系,因此您可以将所有内容存储在一个表单中(将所有内容都放在一个表中,或者将表单绑定到结合了数据)。但是,就像我说的那样,如果可以的话,最好改变一下结构。

答案 1 :(得分:0)

在表单中插入一个子表单,将主字段设置为Users表中的ID,将子字段设置为表单中的ID Permissions表。

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