| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 538 人关注过本帖
标题:棘手!
取消只看楼主 加入收藏
yz15785157
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2007-4-8
收藏
 问题点数:0 回复次数:0 
棘手!
题:学生注册收费系统数据库设计(microsoft sql server 2000)
要求:
1.实现学生所属院系、专业、班级的管理。
2.实现学生信息登记,当新增、删除学生信息或修改学生所在班级时,必须自动修改班级人数(使用触发器实现);
3.实现学生注册收费项目的管理,每一个收费项目设有一个启用标记,其取值为‘0’或‘1’,请定义check约束,保证其完整性;
4.实现学生注册登记,每个学年学期必须注册一次;
5.实现学生收费登记,收费时根据收费项目及每个项目的收费金额,自动计算应收金额;
6.定义一个视图查询指定学年学期注册过的学生信息;
7.定义存储过程查询全校各院系、专业的学生人数;
8.定义存储过程查询每个学年学生的交费情况(应交费人数、实际交费人数,应收金额、实收金额);
9.建立数据库相关表之间的参照完整性约束。

以下是我建的表:
表student(学生信息表)
列名     数据类型     长度 主键    外键 可否为空
Sname     char       10     否        
Sno     char       10      是        
Ssex     char        2      否        
sbirthday datetime      8     否        
Class     char        10     否        
Dc     char        10      否     是     是

表department(院系信息表)
列名    数据类型    长度    主键  外键 可否为空
dc    char            10            
dno    char            10            
sc    char            10            

表register(注册信息表)
列名    数据类型       长度    主键    外键    可否为空
sname    char            20      否      否      是
sno    char            10      是      是      否
rgdate    datetime      8      是      否      否

表fare_item(收费项目表)
列名    数据类型    长度    主键    外键 可否为空
dc    char            10     是        
flag    bit            1     否     否    
item    char            10            
amount    float          8     否        

表fare_record(收费登记表)
列名    数据类型    长度    主键    外键   可否为空
Id    int         4      否      否      否
sname    Char       10      否      否      是
sno    Char        10      否      是      否
charged    Float      8      否      否      是
charge    Float     8      否      否      是
chartime Datetime    8      是      否      否


其中各列名含义如下:
sname 学生姓名;
sno   学生学号;
ssex  学生性别;
sbirthday 学生出生日期;
class 学生所在班级号;
dc     学生所属院系代号;
rgdate 学生注册日期;
dno    系名;
sc     学院名;
flag   启用标记;
item   收费项目;
amount 收费金额;
charge 应收金额;
charged 已收金额;
chargtime 缴费时间;

做到第五小题时,问题出来了:
代码如下:
use reg    /*本题使用作用在fare_record表上的触发器完成"自动计算"的功能(数据库名为reg)*/
go
create view vieww6     /*创建视图vieww6包含学生学号和应收金额两列信息,便于在触发器中使用*/
as
select sno,sum(distinct amount) as 'charge' from student,fare_item
where student.dc=fare_item.dc and fare_item.flag=1
group by sno
select * from vieww6
go
create default con3 as '2005-01-01'  /*创建默认对象con3*/
go
exec sp_bindefault 'con3','fare_record.chargtime' /*将默认对象con3绑定到列chartime上意即指定chargtime默认值*/
go
create trigger g3 on fare_record /*在fare_record表中创建触发器g3*/
after insert,update
as
update fare_record set fare_record.charge=(select vieww6.charge from vieww6,inserted where inserted.sno=vieww6.sno and  fare_record.id=inserted.id)
go
通过编译,插入一条记录如下:
insert fare_record(sname,sno,charged,chargtime) select  ‘mike’,’20050101’,2500.’2005-09-03’
显示结果为:
id   sname   sno      charged    charge    chargtime
1    mike   20050101  2500       4020      2005-9-3
这一条的结果是满足题意的,但是继续插入一条记录:
insert fare_record(sname,sno) select 'joe','20050206'
显示结果为:
id   sname   sno      charged    charge    chargtime
1    mike   20050101  null      4020      2005-9-3
2    joe    20050206  null      3800      2005-1-1
这里,第一条的记录中charged这一列信息怎么又变成null了呢?
以后的结果都是这样,就是只有当前最近一条刚刚执行的语句
能通过触发得到正确结果,而之前的记录却都自动变成null.
问题究竟出在哪儿呢?
搜索更多相关主题的帖子: microsoft 数据库设计 注册登记 收费项目 server 
2008-04-16 12:11
快速回复:棘手!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021958 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved