Mik*_* B. 5 ms-access database-design lookup-tables relational-database
我正在开发基于Microsoft Access 2013的信息系统.客户端的要求之一是通过使用具有可用值的组合框来简化数据输入过程.
例如,代替进入agentID客户端要求让用户从组合框中选择代理名称,与其他类似字段的逻辑相同.
简而言之:
我需要尽可能地避免输入值ID,并让用户从组合框中选择它们.
微软Access有一个内置的查询向导,允许用户与特定字段的表字段从另一个表绑定,例如链接cityID从tblVoyage用tblCities/ cityID通过查找向导中键入具体,并让用户从下拉列表框中选择这个城市,而不是城市ID进入该领域.
一切看起来都很棒,但有一个令人困惑的时刻.在数据库课程中,我了解到,为了构建数据库并使用它,我们必须定义表之间的关系(1:1,1:M,M:N),但如果我这样做,我就无法使用查找向导,因为我已经定义了表之间的关系.因此,用户必须手动键入所有ID,而不是从组合框中选择它们.
所以,我想:
这里的普遍共识似乎是应该避免使用Lookup字段.它们实际上只是拥有"正确"查找表的捷径,它们隐藏了表级别的实际情况.例如,假设您有[Size]的Lookup字段,其值为'Small','Medium'和'Large'.当你看到桌子时,你会看到这些单词,但表格确实包含1,2和3等数字的可能性很大.你去了
UPDATE tblName SET Size="Large"
Run Code Online (Sandbox Code Playgroud)
并且查询失败,因为它实际上需要做的是
UPDATE tblName SET Size=3
Run Code Online (Sandbox Code Playgroud)
(当您维护一个"正确的"单独查找表时,主表中的字段显示字段中的实际内容:查找表中所选项目的PK值.您仍然可以设计表单以填充组合框查找表并绑定到主表中的字段.)
更令人困惑的是,查找向导提供了"允许多个选择"选项,因此字段可以包含多个值(排序).这显然已添加,因此Access可以更好地与SharePoint一起工作,而这实际上是应该使用该功能的唯一时间.在绝大多数其他情况下,最好显式维护一个单独的子表来存储多个选择.
组合框向导将指导您完成将组合框链接到其记录源(查找表)并将其值绑定到数据表中的字段的过程.例如,假设您已经为[Agents]设置了查找表
ID AgentName
-- ---------
1 Gord
2 Angie
Run Code Online (Sandbox Code Playgroud)
...和[帐户]的数据表
ID agentID AccountName
-- ------- -----------
Run Code Online (Sandbox Code Playgroud)
您使用[Accounts]表创建一个新表单Record Source.当您向表单添加组合框时,向导应该运行并询问您"您希望组合框如何获取其值?".您选择"我希望组合框从另一个表或查询中获取值".

在下一步中,您选择[Agents]表:

接下来,告诉向导您要显示[AgentName]:

选择排序顺序(如果需要)后,您可以确认列宽.保持"隐藏键列(推荐)".

最后,您可以选择复选框值的变化.这是您将它"绑定"到[Accounts]表中[agentID]字段的位置:

请注意,组合框将显示[agentName]供用户选择,但.Value它将是数字[Agents].[ID],这将是存储的内容[Accounts].[agentID].