Ms access 在MS Access中创建查找字段-最好有一个或多个源表?
我正在创建一个数据库来跟踪Access 2010的参与者 主数据存储在名为ParticipantMaster的表中 我想在ParticipantMaster中为几个字段分配查找值 学校(MLK高中、中央高中、东北高中…) 兴趣(视觉艺术、戏剧、体育、文学……) 颜色(红色、蓝色、绿色…) 我可以创建一个表学校、另一个表兴趣、另一个表颜色,然后将每个表的源代码设置为Ms access 在MS Access中创建查找字段-最好有一个或多个源表?,ms-access,Ms Access,我正在创建一个数据库来跟踪Access 2010的参与者 主数据存储在名为ParticipantMaster的表中 我想在ParticipantMaster中为几个字段分配查找值 学校(MLK高中、中央高中、东北高中…) 兴趣(视觉艺术、戏剧、体育、文学……) 颜色(红色、蓝色、绿色…) 我可以创建一个表学校、另一个表兴趣、另一个表颜色,然后将每个表的源代码设置为SELECT Color.ColorName FROM Color,然后SELECT School.SchoolName FROM S
SELECT Color.ColorName FROM Color
,然后SELECT School.SchoolName FROM School
,然后SELECT Interests.InterestPicker FROM Interest
。。。。我通常就是这样做事的
但后来我想知道是否可以用一个名为ParticipantData的表代替三个单独的表,其中包含名为School、Interests、Color的字段。。。然后让我的查询成为选择ParticipantData.School from ParticipantData
,和选择ParticipantData.interest from ParticipantData
,以及选择ParticipantData.Color from ParticipantData
这两种方法都有优点/缺点吗?我试过第二种方法,也不算太糟糕,但最后,我真希望我选择了第一种方法。它更容易控制和添加新项目
我希望您不打算在表中查找。您描述的查找表有点独特。大多数人不会建议你这样做
ParticipantData
+-----------------------+
| School (text) |
| Color (text) |
| Interests (text) |
+-----------------------+
下面的一个更有意义
ParticipantData
+-----------------------+
| ID (AutoNumber) |
|-----------------------|
| LookupType (number) |
| LookupValue (text) |
+-----------------------+
这样一张表的主要缺点是
实际上,我已经将这两种方法结合起来了。我现在要警告你,这可能是长篇大论,可能会被认为是杀伤力过大。然而,我发现这是一个很好的通用解决方案,可扩展性非常好 该方法共由四个表组成:
PDLists (local to the front-end)
--------
K*PDListID Long
*PDListName Text (50)
CodeLen Long
*UserCanEdit Boolean [False]
*HasActiveCheck Boolean [False]
PDChoices (linked to the back-end)
---------
K*PDChoiceID Long AUTONUMBER
*PDListID Long
PDCode Text (10)
*PDDesc Text (255)
*Seq Long
*IsActive Boolean [True]
PDChoicesLocked (local to the front-end)
---------------
K*PDChoiceID Long AUTONUMBER
*PDListID Long
PDCode Text (10)
*PDDesc Text (255)
*Seq Long
*IsActive Boolean [True]
PDFields (local to the front-end)
--------
K*PDListID Long
K*TblName Text (50) Used to enforce referential integrity for fields that use code:description pair & to restrict length of text entry
K*FldName Text (50) Used to enforce referential integrity for fields that use code:description pair & to restrict length of text entry
图例:K
:主键<代码>*:必填字段<代码>[Foo]:默认值
PDList
第一个表中的每个查找表都有一个条目。CodeLen
(代码长度)字段用于查找要存储有意义缩写的位置。例如,您可以为如下查找设置CodeLen=1
:N:North;E:东部;南部;W:West
如果UserCanEdit
为True,则下拉选项存储在后端表PDChoices中。否则,它们将存储在本地表pdchoiceslock中
我有一个helper函数,它生成要在组合框中使用的SQL语句。我将PDListID传递给它,它检查CodeLen和UserCanEdit字段,以创建适当的SELECT语句。helper函数只是将其打印到即时窗口中,我将其复制并粘贴到需要的地方
PDListID PDListName CodeLen UserCanEdit HasActiveCheck
1 Cardinal Directions 1 True False
PDChoices/PDChoices锁定
这两个表之间的唯一区别是它们的位置(如上所述)。我本来可以在后端将两个表合并为一个表,但将锁定的表设置为本地表意味着我可以在开发过程中更改此表,并且即使我将程序部署到不同的客户端,也可以保证其内容
Seq
(序列)字段用于允许对选项进行自定义排序。如果当前正在使用这些查找,IsActive
字段允许在下拉列表中隐藏选项,而不会丢失引用完整性
PDChoiceID PDListID PDCode PDDesc Seq IsActive
1 1 N North 1 True
2 1 E East 3 True
3 1 S South 2 True
4 1 W West 4 True
PDFields
此表的存在是为了强制引用完整性。这实际上无法在数据库级别完成,因此它以用户可以用来更改下拉选择的形式强制执行
PDListID TblName FieldName
1 StreetAddresses CardinalDirection
1 Locations CompassPoint
下拉列表
当用户双击带有用户可编辑选项的组合框(即,UserCanEdit=True
)时,将加载一个下拉表单。表单标题设置为PDListName
。如果CodeLen
不为空,则会显示查找代码的文本框。如果HasActiveCheck=True
,则会显示一个复选框,允许用户切换各个下拉选项的活动状态
PDListID TblName FieldName
1 StreetAddresses CardinalDirection
1 Locations CompassPoint
我有一个自定义函数,根据CodeLen
限制可以输入到PDCode
字段的字符数。但是,如果CodeLen
为空,则检查是否需要限制PDDesc
字段的长度。例如,如果某个字段的字段类型是Long,那么我假设我正在字段中保存PDChoiceID,并且我没有限制PDDesc
的长度。但是如果引用的字段是Text/Varchar字段,那么我会得到该字段的长度,并相应地限制PDDesc
的长度
当下拉表单关闭时,我会重新查询用户双击的组合框,以便他们可以立即访问他们添加的任何新选项
总结
这种方法有一个主要的缺点:首先要把它全部设置好需要很多工作。然而,很多工作是在后端提供用户可编辑的表和一个允许用户更新这些选择的表单。如果只使用这三个本地表,则无需大量工作即可获得可伸缩性和灵活性
专业人士:
- 它是灵活的;这些值可以存储在主选项卡中