为什么我的访问表单在保存时会更改我的字段?
Why is my Access Form Changing my Fields when I save it?
我对 Access 比较陌生,我正在为一个体育联盟构建一个数据库。我有 2 个表格,如下所示:
Table 1 - 团队:
- Team_ID(自动编号,主键)
- 姓名(短文本)
Table 2 - 结果:
- Game_ID(自动编号,主键)
- Home_Team_ID(来自 Table 1 的外键)
- Away_Team_ID(来自 Table 1 的外键)
- Winning_Team_ID(来自 Table 1 的外键)
我制作了一个表格来显示来自 Table 的 Home/Away/Winning_Team_ID 2 但是我真的很难显示团队名称(从 link 到 Table 1).
在表单的记录源中,我 linked Table 2 到 Table 1 的三个副本,然后 linked 主键的从三个 Table 1 到外键 (Home/Away/Winning_Team_ID's) 到 Table 2,如下所示。
这为我提供了查看此查询的结果时所需的确切数据。
问题是,当我尝试 "Add Existing Fields" 进入表单的设计视图然后保存时,所有 3 个(主场、客场和获胜)都显示相同的值(主场值)。
保存之前 - 正是我需要的:
保存后 - 右侧的字段已更改:
(注:上面2张图的区别是右边的"Teams_1.Name"
变成了"Teams.Name"
)
不知道为什么,我保存的时候,自动变成了上面的样子。如果我添加字段但不保存而只是转到布局视图,它会完美运行,但一旦我保存它,它会将所有字段更改为相同的字段。
出现这个问题的原因是因为这三个字段在构成表单记录源的SQL代码中具有相同的字段名称(尽管table限定符不同),所以当MS Access 验证窗体上每个控件的控件源,它忽略 table 限定符并分配记录源中具有匹配字段名称的第一个字段。
有两种方法可以解决这个问题:
为表单的记录源中的另外两个 Name
字段指定一个别名,例如:
select
Teams.Name as Home_Team,
Teams_1.Name as Away_Team,
Teams_2.Name as Winning_Team
from
(
(
Results left join Teams on
Results.Home_Team_ID = Teams.Team_ID
)
left join Teams as Teams_1 on
Results.Away_Team_ID = Teams_1.Team_ID
)
left join Teams as Teams_2 on
Results.Winning_Team_ID = Teams_2.Team_ID
创建一个保存的查询,其中包含您希望在表单上显示的数据,然后将保存的查询指定为表单的记录源 - 使用此方法可以避免将别名分配给字段。
就我个人而言,我建议使用上述第一种方法,因为窗体上控件的控件源将更具描述性并且更易于维护。
我对 Access 比较陌生,我正在为一个体育联盟构建一个数据库。我有 2 个表格,如下所示:
Table 1 - 团队:
- Team_ID(自动编号,主键)
- 姓名(短文本)
Table 2 - 结果:
- Game_ID(自动编号,主键)
- Home_Team_ID(来自 Table 1 的外键)
- Away_Team_ID(来自 Table 1 的外键)
- Winning_Team_ID(来自 Table 1 的外键)
我制作了一个表格来显示来自 Table 的 Home/Away/Winning_Team_ID 2 但是我真的很难显示团队名称(从 link 到 Table 1).
在表单的记录源中,我 linked Table 2 到 Table 1 的三个副本,然后 linked 主键的从三个 Table 1 到外键 (Home/Away/Winning_Team_ID's) 到 Table 2,如下所示。
这为我提供了查看此查询的结果时所需的确切数据。
问题是,当我尝试 "Add Existing Fields" 进入表单的设计视图然后保存时,所有 3 个(主场、客场和获胜)都显示相同的值(主场值)。
保存之前 - 正是我需要的:
保存后 - 右侧的字段已更改:
(注:上面2张图的区别是右边的"Teams_1.Name"
变成了"Teams.Name"
)
不知道为什么,我保存的时候,自动变成了上面的样子。如果我添加字段但不保存而只是转到布局视图,它会完美运行,但一旦我保存它,它会将所有字段更改为相同的字段。
出现这个问题的原因是因为这三个字段在构成表单记录源的SQL代码中具有相同的字段名称(尽管table限定符不同),所以当MS Access 验证窗体上每个控件的控件源,它忽略 table 限定符并分配记录源中具有匹配字段名称的第一个字段。
有两种方法可以解决这个问题:
为表单的记录源中的另外两个
Name
字段指定一个别名,例如:select Teams.Name as Home_Team, Teams_1.Name as Away_Team, Teams_2.Name as Winning_Team from ( ( Results left join Teams on Results.Home_Team_ID = Teams.Team_ID ) left join Teams as Teams_1 on Results.Away_Team_ID = Teams_1.Team_ID ) left join Teams as Teams_2 on Results.Winning_Team_ID = Teams_2.Team_ID
创建一个保存的查询,其中包含您希望在表单上显示的数据,然后将保存的查询指定为表单的记录源 - 使用此方法可以避免将别名分配给字段。
就我个人而言,我建议使用上述第一种方法,因为窗体上控件的控件源将更具描述性并且更易于维护。