设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2014|回复: 7
打印 上一主题 下一主题

[其它] 请问关于有效性规则

[复制链接]
跳转到指定楼层
1#
发表于 2006-12-24 22:42:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个Access的mdb文件中,有表t_社团简况(主键:社团编号),另一个表t_社团组成(主键是:社团编号和学号),和表t_学生简况(主键:学号)。新成立的社团应该是先有社团编号无负责人,然后到t_社团组成至少插入一条记录(负责人的),因为我们要求负责人为社员。然后再把t_社团简况.负责人学号由空值添上当前值。
实际操作中我想了三个办法好像都行不通(在t_社团简况中设置):
I把t_社团简况.负责人学号,做成查阅向导,再限定列表内。
SELECT t_学生简况.学号, t_学生简况.姓名, t_社团组成.加入日期 FROM t_学生简况 INNER JOIN t_社团组成 ON t_学生简况.学号=t_社团组成.学号 WHERE (t_社团组成.社团编号=This.社团编号);
II字段约束。
t_社团简况.负责人学号 In (SELECT t_社团组成.学号 FROM t_社团组成 WHERE (t_社团组成.社团编号=This.社团编号))
III表约束。
t_社团简况.负责人学号, t_社团简况.社团编号 In (SELECT t_社团组成.学号, t_社团组成.社团编号 FROM t_社团组成)
怎么办啊?谢谢指点!

我又尝试了多字段表间关系,不实施参照完整性,就毫无意义(负责人取值仍可为社团外),实施参照完整性之后,新成立社团又会遇到先有鸡还是先有蛋的问题(t_社团简况需要参照t_社团组成已有的学生社团关系插入,t_社团简况.社团编号和t_社团简况.负责人学号;t_社团组成要插入新纪录,又要求t_社团简况中有相关社团)。要是t_社团简况中插入新纪录时,t_社团简况.负责人学号允许取空值就好了——可惜实施参照完整性之后就不行了。多字段表间关系设定后,社团的删除倒是可以用级联删除勉强解决。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2006-12-25 17:40:00 | 只看该作者
建议:

1、把《社团组成》表中的主键去掉。该表不再与其他表链接所以可以不设主键。把字段“社团编号”与“学号”设为组合字段,具体的请参阅Access的Help主题为“禁止组合字段中输入重复值”。

2、在《社团组成》表的字段“社团编号”通过“查询向导……”完成与《社团简况》表的链接。应为“SELECT t_社团简况.社团编号,t_社团简况.社团名称 FROM t_社团简况”。同样的,字段“学号”应为“SELECT t_学生简况.学号,t_学生简况.姓名 FROM t_学生简况”

3、最好把主键设为“自动编号”长整型数字类型。说白了主键不是给我们看的,而是用于链接表的,只要数据库看得懂就可以了。数据库中的四大数据类型,在转换成内码时,数字类型是最简单的,而长整型又是数字类型中最简单的。
3#
 楼主| 发表于 2006-12-27 00:25:00 | 只看该作者
以下是引用浩雨在2006-12-25 9:40:00的发言:


建议:

1、把《社团组成》表中的主键去掉。该表不再与其他表链接所以可以不设主键。把字段“社团编号”与“学号”设为组合字段,具体的请参阅Access的Help主题为“禁止组合字段中输入重复值”。

2、在《社团组成》表的字段“社团编号”通过“查询向导……”完成与《社团简况》表的链接。应为“SELECT t_社团简况.社团编号,t_社团简况.社团名称 FROM t_社团简况”。同样的,字段“学号”应为“SELECT t_学生简况.学号,t_学生简况.姓名 FROM t_学生简况”

3、最好把主键设为“自动编号”长整型数字类型。说白了主键不是给我们看的,而是用于链接表的,只要数据库看得懂就可以了。数据库中的四大数据类型,在转换成内码时,数字类型是最简单的,而长整型又是数字类型中最简单的。

谢谢您的回答,您是说1《社团组成》表主键取消(好像还要加进一个自动编号型主键?)原主键建立唯一索引;2查阅向导,这个我原先就做了。可是这些好像与我的问题无关吧?我的问题是想要约束负责人,使得他必为社团成员之一。
4#
发表于 2006-12-27 00:36:00 | 只看该作者
在t_社团组成表中增加一个字段:职务,这样就很好处理负责人的问题
5#
 楼主| 发表于 2006-12-28 06:50:00 | 只看该作者
以下是引用一点通在2006-12-26 16:36:00的发言:
在t_社团组成表中增加一个字段:职务,这样就很好处理负责人的问题

是个好办法,感谢!但是,我这个数据库不是用来处理实际问题的,所以不是以变通解决为导向的,我是想学习Access。我是不了解如何做表约束,和表间约束(负责人要求为该社团成员之一)。


我还想做个窗体用来设定负责人(必须为该社团成员之一),默认视图设置为“单个窗体”,但是随着社团记录的变动,组合框下拉内容却不刷新。这个组合框绑定到“负责人学号”,其行来源为——SELECT t_成员简况.学号, t_成员简况.姓名, t_成员简况.性别, t_班级简况.班级名称, t_社团组成.加入日期 FROM (t_班级简况 INNER JOIN t_成员简况 ON t_班级简况.班级代号=t_成员简况.班级代号) INNER JOIN t_社团组成 ON t_成员简况.学号=t_社团组成.学号 WHERE (((t_社团组成.社团编号)=[forms]![f_任命社团负责人]![社团编号]));
但是,我用窗体导航按钮,切换记录时,组合框下拉内容却不刷新。如我在1号社团先浏览了组合框下拉内容,比如说是9条记录(即1号社团有9个社员),这时无论切换到哪个社团,组合框下拉内容永远都是这9条记录;必须关闭窗体重开,然后若在2号社团先浏览组合框下拉内容,比如说是5条记录(即2号社团有5个社员),这时无论切换到哪个社团,组合框下拉内容永远都是这5条记录。
还有这个组合框我已经设置了“限于列表”为是,打开时还是可以手动编辑文本。如何杜绝?
我还想限定每个学生只能参加3个社团(即t_社团组成中,同样一个学号的记录不超过三条)
用如下表的有效性规则怎么不行啊?(SELECT t_社团组成.学号, Count(t_社团组成.学号) AS 参加社团数 FROM t_社团组成 WHERE ((t_社团组成.退出日期) Is Null) GROUP BY t_社团组成.学号 HAVING ((Count(t_社团组成.学号))>3)) As 参超三社的学号 Is Empty
6#
 楼主| 发表于 2006-12-28 07:27:00 | 只看该作者
以下是引用parozjlll在2006-12-24 14:42:00的发言:


一个Access的mdb文件中,有表t_社团简况(主键:社团编号),另一个表t_社团组成(主键是:社团编号和学号),和表t_学生简况(主键:学号)。新成立的社团应该是先有社团编号无负责人,然后到t_社团组成至少插入一条记录(负责人的),因为我们要求负责人为社员。然后再把t_社团简况.负责人学号由空值添上当前值。
实际操作中我想了三个办法好像都行不通(在t_社团简况中设置):
I把t_社团简况.负责人学号,做成查阅向导,再限定列表内。
SELECT t_学生简况.学号, t_学生简况.姓名, t_社团组成.加入日期 FROM t_学生简况 INNER JOIN t_社团组成 ON t_学生简况.学号=t_社团组成.学号 WHERE (t_社团组成.社团编号=This.社团编号);
II字段约束。
t_社团简况.负责人学号 In (SELECT t_社团组成.学号 FROM t_社团组成 WHERE (t_社团组成.社团编号=This.社团编号))
III表约束。
t_社团简况.负责人学号, t_社团简况.社团编号 In (SELECT t_社团组成.学号, t_社团组成.社团编号 FROM t_社团组成)
怎么办啊?谢谢指点!

我又尝试了多字段表间关系,不实施参照完整性,就毫无意义(负责人取值仍可为社团外),实施参照完整性之后,新成立社团又会遇到先有鸡还是先有蛋的问题(t_社团简况需要参照t_社团组成已有的学生社团关系插入,t_社团简况.社团编号和t_社团简况.负责人学号;t_社团组成要插入新纪录,又要求t_社团简况中有相关社团)。要是t_社团简况中插入新纪录时,t_社团简况.负责人学号允许取空值就好了——可惜实施参照完整性之后就不行了。多字段表间关系设定后,社团的删除倒是可以用级联删除勉强解决。

当然,这里的This.社团编号是我参照C++想当然造出来的东西,我的意图就是同一张表里,某个查阅向导型字段,在不同的元组里下拉框有不同的内容。
后来我改造这个数据库,是折衷地,把负责人学号拿出来,创建一张t_社团负责人一览表(主键:社团编号。还有一个字段是负责人学号,两个字段均做查阅向导),这可以满足某社团暂无负责人的情况,但也默认了每个社团负责人不超过一。然后用多字段联接,把t_社团负责人一览表和t_社团组成联接起来,且实施参照完整性,但是t_社团负责人一览表.负责人学号查阅的下拉框为t_成员简况(原t_学生简况,在把负责人学号独立拿出来后,建的新数据库中取不同的名字而已)的所有记录,还是想做成不同元组不同下拉内容。
7#
 楼主| 发表于 2006-12-28 07:53:00 | 只看该作者
以下是引用parozjlll在2006-12-27 23:27:00的发言:



当然,这里的This.社团编号是我参照C++想当然造出来的东西,我的意图就是同一张表里,某个查阅向导型字段,在不同的元组里下拉框有不同的内容。
后来我改造这个数据库,是折衷地,把负责人学号拿出来,创建一张t_社团负责人一览表(主键:社团编号。还有一个字段是负责人学号,两个字段均做查阅向导),这可以满足某社团暂无负责人的情况,但也默认了每个社团负责人不超过一。然后用多字段联接,把t_社团负责人一览表和t_社团组成联接起来,且实施参照完整性,但是t_社团负责人一览表.负责人学号查阅的下拉框为t_成员简况(原t_学生简况,在把负责人学号独立拿出来后,建的新数据库中取不同的名字而已)的所有记录,还是想做成不同元组不同下拉内容。

而且,通过多字段联接,把t_社团负责人一览表和t_社团组成联接起来,且实施参照完整性,并无法限定t_社团负责人一览表.负责人学号只能在(t_社团组成.退出日期) Is Null的社员中取。只能在窗体f_任命社团负责人中,组合框绑定到“负责人学号”,行来源设定为——SELECT t_成员简况.学号, t_成员简况.姓名, t_成员简况.性别, t_班级简况.班级名称, t_社团组成.加入日期 FROM (t_班级简况 INNER JOIN t_成员简况 ON t_班级简况.班级代号=t_成员简况.班级代号) INNER JOIN t_社团组成 ON t_成员简况.学号=t_社团组成.学号 WHERE (((t_社团组成.社团编号)=[forms]![f_任命社团负责人]![社团编号]) AND ((t_社团组成.退出日期) Is Null));
8#
 楼主| 发表于 2006-12-28 22:44:00 | 只看该作者
命令按钮,怎么做成分情况的?如“参加社团”命令按钮,学生与社团记录若不在t_社团组成中,则添加记录,t_社团组成.加入日期为当前日期Date();t_社团组成.退出日期设成Null。若在t_社团组成中,当t_社团组成.退出日期为Null时,跳出MessageBox提示该学生已为成员;当t_社团组成.退出日期非Null时(重新入社),t_社团组成.加入日期更新为当前日期Date();t_社团组成.退出日期置为Null。而“退出社团”命令按钮,学生与社团记录若在t_社团组成中,且t_社团组成.退出日期为Null时,t_社团组成.退出日期置为当前日期Date();当t_社团组成.退出日期非Null时,甚至该学生与社团记录不在t_社团组成中,跳出MessageBox提示该学生不是社团成员。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-9-21 10:47 , Processed in 0.109900 second(s), 32 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表