资源描述
淮 海 工 学 院 计算机科学系
课程设计汇报
设计名称: 数据库原理及应用课程设计
姓 名: 李维清 学 号:
专业班级: 计算机科学和技术 043
系 (院): 计算机科学系
设计时间: .1.2~.1.12
设计地点: 机房和教室
成绩:
指导老师评语:
署名:
年 月 日
数据库原理及应用课程设计
一、课程设计目标
《数据库原理及应用》课程设计是计算机科学和技术专业集中实践性步骤之一,是学习完《数据库原理及应用》课程后进行一次全方面综合练习。本课程设计关键在于加深学生对数据库基础理论和基础知识了解,掌握数据库应用系统设计开发基础方法,达成深入使学生综合利用所学知识和增强实际动手能力目标。
二、课程设计任务和要求
要求学生依据本身对题目标了解情况,从给定设计题目中选择一个,以MS SQL Server作为后台数据库平台,以PowerBuilder作为前台开发工具,完成一个小型数据库应用系统系统分析、设计和开发。
三、课程设计说明书
报刊订阅管理系统
1系统需求分析
现在伴随网络、计算机和数据库快速发展,报刊订阅也不再是传统低效纸笔统计了,已经转向网络。本系统就是面向一个企业报刊订阅管理系统。此系统是一个比较智能化管理系统,它面向全部企业部门职员用户,但含有比较高安全性能。
它能够实现报刊订阅基础功效,包含新报刊信息录入、订阅、查询等操作和后台数据库备份和恢复。用户正当注册后必需输入有效密码才能成功进入此系统,能够进行订阅报刊,查询信息,统计信息等操作。对于非法操作,系统有识别和防护方法。
1.1系统功效需求分析
本系统关键面向用户有系统管理员、读者。下面分角色对该系统不一样操作范围做说明。
本系统关键有以下功效模块:
l (1)登陆功效:登陆系统为身份验证登录。分为管理员登录和通常见户登录。分别经过不一样用户名和密码进入报刊订阅管理界面。
l (2)录入新信息功效:对于管理员,包含新用户信息和新报刊信息录入功效,信息一旦提交就存入到后台数据库中;一般用户自行注册进行录入个人信息。
l (3)订阅功效:用户能够订阅报刊,系统自动计算所需金额,并显示在界面上;管理员不可订阅报刊,必需以用户身份订阅报刊。
l (4)查询功效:用户能够查询并显示自己所订阅信息;管理员能够按人员、报刊、部门分类查询。查询出信息显示在界面上。
l (5)统计功效:管理员能够按用户、部门、报刊统计报刊销售情况,并对部分关键订阅信息进行统计;一般用户能够统计出自己订阅情况。
l (6)系统维护功效:管理员能够对用户、报刊、部门、订阅等信息进行添加、删除、更改等维护工作;管理员还要常常备份数据库,以备出现故障后恢复。用户能够更改自己注册信息,但用户名不能更改。
2 系统总体设计
2.1系统总体结构设计
报刊订阅管理系统关键是由登录、录入、订阅、信息查询、统计、系统维护等关键模块组成。
本系统结构功效图:
2.2系统数据模型设计
2.2.1 E-R图
本系统采取E-R图(实体-关系图)方法进行数据库概念结构设计。
系统E-R图以下所表示:
部门
1
报刊
包含
n
订阅
n
用户
m
各实体E-R图:
部门:
部 门
部门号
部门名
用户:
订阅报刊种类数
真实姓名
用户名
家庭地址
联络电话
用 户
性 别
部门号
密码
管理员:
管理员
名字
姓名
报刊:报刊代号
报刊名
出版社
六个月订阅价
整年订阅价
类型
报 刊
出版周期
关系表E-R图:
报刊号
用户名
金额
订 阅
订阅年限
份数
2.2.2 关系模式
部门(部门号,部门名)
用户(用户名,密码,真实姓名,性别,部门号,联络电话,联络地址,订阅报刊种类数)
管理员(管理员名,密码)
报刊(报刊代号,报刊名,类型,出版报社,出版周期,六个月订约价,整年订约价)
订阅(用户名,报刊代号,订阅年限,订阅数量,所需金额)
2.2.3 数据表
(1).部门表
(表department)Dnumber为部门号,Dname为部门名
(2).用户表
(表consumer)Uname是用户名,Urealname是真实姓名,Upassword是密码,Usex是性别,Dnumber是部门号(和部门表相关系),Uphone是联络电话,Uaddress是联络地址;subscribenum是订阅报刊种类数;
(3).管理员表
(表administrator)Aname是管理员名,Apassword是密码;
(4).报刊表
(表magazine)Mnumber是报刊代号,Mname是报刊名,Mkind是类型,Mpress出版报社,Mtime出版周期,Mhalfprice六个月订阅价,Mwhole整年订阅价;
(5).订阅表
(表subscribe)Uname是用户名(和用户表主键相关系),Mnumber是报刊代号(和报刊表主键相关系),Syear是订阅年限,Snumber是订阅份数,Ssum是金额;
3.系统实施
结合PowerBuilder进行数据库应用开发特点,设计过程可按以下步骤进行:
关键开发步骤:
(1)打开PowerBuilder,新建一个工作区,取名为magazine;
(2)新建一个Application,取名app,连接数据库,并将连接数据库代码复制到app中代码;
代码:open(w_welcome)
// Profile magazine
SQLCA.DBMS = "MSS Microsoft SQL Server"
SQLCA.Database = "magazine"
SQLCA.ServerName = "3968391D9B384C0"
SQLCA.LogId = "sa"
SQLCA.AutoCommit = False
SQLCA.DBParm = ""
connect;
if sqlca.sqlcode<>0 then
messagebox("错误","数据库连接错误,请检验后重试!",stopsign!)
return
end if
close(w_welcome) open(w_login)
(3)制作等候界面w_welcome;
(4)制作登录界面w_login;
确定按钮代码:
string id,password,getpassword
id=trim(sle_1.text)
getpassword=trim(sle_2.text)
if id="" or id='' then MessageBox("系统提醒","请输入用户名!") return
elseif getpassword="" or getpassword='' then
MessageBox("系统提醒","请输入密码!") return
end if
if rb_1.checked=true then
select Aname,Apassword into :gs_operator_id,:gs_password
from administrator where Aname=:id;
if sqlca.sqlcode<>0 then
messagebox("系统提醒","无此管理员!")
sle_2.text="" sle_1.text="" sle_1.setfocus() return
end if
if getpassword<>gs_password then
messagebox("警告","口令错误!") sle_2.text="" sle_2.setfocus() return
end if
open(w_main) close(w_login)
elseif rb_2.checked=true then
select Uname,Upassword
into :gs_operator_id,:gs_password
from consumer
where Uname=:id;
if sqlca.sqlcode<>0 then
messagebox("系统提醒","无此用户!")
sle_2.text=""
sle_1.text=""
sle_1.setfocus()
return
elseif getpassword<>gs_password then
messagebox("警告","口令错误!")
sle_2.text=""
sle_2.setfocus()
return
end if
gs_operator_id=id
open(w_consumermain)
close(w_login)
elseif rb_1.checked=false and rb_2.checked=false then
messagebox("系统提醒","请选择用户类型!")
return
end if
(5)制作注册界面w_enroll;
代码:
注册按钮:
string name,realname,password,copypassword,sex,number,phone,address,number1
string n
name=trim(sle_1.text)
password=trim(sle_2.text)
copypassword=trim(sle_8.text)
realname=trim(sle_4.text)
if rb_1.checked=true then
sex="男"
elseif rb_2.checked=true then
sex="女"
end if
number=trim(sle_5.text)
phone=trim(sle_6.text)
address=trim(sle_7.text)
if name="" or name='' then
MessageBox("系统提醒","对不起!请输入用户名!不然无法注册!")
sle_1.setfocus()
return
end if
select Uname
into :n
from consumer
where Uname=:name;
if sqlca.sqlcode=0 then
MessageBox("系统提醒","对不起,此用户名已被注册!请另选一个试试!")
sle_1.text=""
return
end if
if password="" or password='' then
MessageBox("系统提醒","对不起!请输入登录密码!不然无法注册!")
sle_2.setfocus()
return
end if
if copypassword="" or copypassword='' then
MessageBox("系统提醒","对不起!请再次输入登录密码!不然无法注册!")
sle_8.setfocus()
return
end if
if password<>copypassword then
MessageBox("系统提醒","对不起!两次输入密码必需一致!不然无法注册!")
sle_8.setfocus()
return
end if
if realname="" or realname='' then
MessageBox("系统提醒","对不起!请输入真实姓名!不然无法注册!")
sle_4.setfocus()
return
end if
if number="" or number='' then
MessageBox("系统提醒","对不起!请输入部门号!不然无法注册!")
sle_5.setfocus()
return
end if
select Dnumber
into :number1
from department
where Dnumber=:number;
if sqlca.sqlcode<>0 then
messagebox("警告","您输入部门号无效!无此部门!")
sle_5.text=""
sle_5.setfocus()
return
end if
INSERT INTO consumer
(Uname,Upassword,Urealname,Usex,Dnumber,Uphone,Uaddress)
VALUES(:name,:password,:realname,:sex,:number,:phone,:address) ;
MessageBox("系统提醒","恭喜!注册成功!")
取消按钮:close(w_enroll)
(6)制作管理员主菜单mainmenu,制作管理员主界面w_main,将mainmenu放入w_main中;
菜单:
主界面:
(7)制作管理员主菜单中录入菜单:制作录入数据窗口d_magazien, d_inputconsumer;制作管理员录入报刊界面w_inputmagazine,录入用户界面w_inputconsumer;将d_magazien,d_inputconsumer分别放入w_inputmagazine,d_inputconsumer中;
录入报刊代码及界面:(录入用户代码及界面类似,不再列出)
窗口代码:dw_1.settransobject(sqlca) dw_1.retrieve()
数据窗框控制框代码:
int b_select string num,name
if dwo.name="b_2" then
b_select=messagebox("系统提醒","确定删除所选列?",exclamation!,yesno!)
if b_select=1 then
dw_1.deleterow(0)
end if
end if
if dwo.name="b_3" then
dw_1.update()
if sqlca.sqlcode<>0 then
rollback;
messagebox("操作非法!","无法保留!");
return
else
commit;
messagebox("系统提醒","信息保留成功!")
return
end if
end if
if dwo.name="b_4" then
close(parent)
end if
数据窗口:
界面:
(9)制作管理员主菜单中查询菜单:分别制作制作查询数据窗口d_consumer_ruery, d_dept_query, d_magazine_query,分别制作管理员按用户查询界面w_consumer_ruery,按部门查询界面w_dept_query,按报刊查询界面w _magazine_query;将d_consumer_ruery, d_dept_query, d_magazine_query分别放入w_consumer_query,w_dept_query, w _magazine_query中;
以下仅列出按报刊查询代码和界面(按用户、部门查询类似,不再列出);
窗口代码:dw_1.settransobject(sqlca) sle_1.setfocus()
检索按钮:string number,copynumber,name
long ll_row
number=trim(sle_1.text)
if number="" or number='' then messagebox("系统提醒","请输入报刊号!") return
end if
select Mnumber,Mname into :copynumber,:name from magazine
where Mnumber=:number;
if sqlca.sqlcode<>0 then
messagebox("系统提醒","无此报刊!") sle_1.text="" return
end if
sle_2.text=name
dw_1.setfilter("subscribe_mnumber='"+number+"'")
dw_1.filter()
ll_row=dw_1.retrieve()
if ll_row=0 then messagebox("系统提醒","无统计!") return
end if
按报刊查询数据窗口:
按报刊查询界面:
(10) 制作管理员主菜单中统计菜单:制作统计数据窗口d_consumer_stat, d_query_dept, d_stat_magazine;制作管理员按用户统计界面w_stat_consumer,按部门统计界面w_stat_department,按报刊统计界面w_stat_magazine;将d_consumer_stat, d_query_dept, d_stat_magazine分别放入w_stat_consumer, w_stat_department,w_stat_magazine中;
以下仅列出按出按部门统计代码和界面抓图(按用户、报刊统计类似,不再列出);
代码:按部门统计代码:
窗口代码:
long ll_row
dw_1.settransobject(sqlca)
dw_1.setfilter("")
dw_1.filter()
ll_row=dw_1.retrieve()
if ll_row=0 then
messagebox("系统提醒","无统计!")
return
end if
按部门统计数据窗口:
按部门统计界面:
(11)制作管理员主菜单中系统维护菜单中信息维护菜单:制作信息维护数据窗口d_maintenance_consumer,d_maintenance_dept,d_maintenance_magazine,d_maintenance_subscribe;制作管理员用户信息维护界面w_maintenance_consumer, 部门信息维护界面w _maintenance_dept,报刊信息维护界面 w _maintenance_magazine,订阅信息维护界面w _maintenance_subscribe;将d_maintenance_consumer,d_maintenance_dept,d_maintenance_magazine,d_maintenance_subscribe分别放入w_maintenance_consumer,w _maintenance_dept,w _maintenance_magazine,w _maintenance_subscribe中;
以下仅列出订阅信息维护代码和界面抓图(其它信息维护类似,不再列出)
订阅信息维护代码:
窗口代码:dw_1.settransobject(sqlca) dw_1.retrieve()
数据窗口控制框代码:int b_select
if dwo.name="b_3" then
b_select=messagebox("系统提醒","确定删除所选列?",exclamation!,yesno!)
if b_select=1 then
dw_1.deleterow(0)
end if
end if
if dwo.name="b_4" then messagebox("系统提醒","保留成功!") end if
if dwo.name="b_5" then close(parent) end if
数据窗口:
界面:
(12)制作管理员主菜单中更改登录菜单:
代码:int b_select b_select=messagebox("系统提醒","确定",exclamation!,yesno!)
if b_select=1 then open(w_login) close(w_main) end if
(13)制作用户主菜单m_consumer_menu;制作用户主界面w_consumermain,将m_consumer_menu放入其中;
用户主菜单:
用户主界面:
(14)制作用户菜单中更改信息菜单:w_modify_consumer;
代码:
窗口代码:
//定义变量,用于存放用户各字段
string name,realname,pass,sex,dept,phone,address
//查询登陆者相关信息
select Uname,Upassword,Urealname,Usex,Dnumber,uphone,Uaddress
into :name,:pass,:realname,:sex,:dept,:phone,:address
from consumer
where Uname=:gs_operator_id;
//无信息
if sqlca.sqlcode<>0 then messagebox("","") return end if
//在界面上显示信息
sle_1.text=name
sle_2.text=pass
sle_3.text=realname
sle_4.text=dept
sle_5.text=phone
sle_6.text=address
if sex="男" then
rb_1.checked=true
elseif sex="女" then
rb_2.checked=true
end if
确定按钮:
string name,realname,pass,sex,dept,phone,address
int b_select
b_select=messagebox("系统提醒","确定修改?",exclamation!,yesno!)
if b_select=1 then
name=trim(sle_1.text)
pass=trim(sle_2.text)
realname=trim(sle_3.text)
dept=trim(sle_4.text)
phone=trim(sle_5.text)
address=trim(sle_6.text)
if rb_1.checked=true then sex="男"
elseif rb_2.checked=true then sex="女"
end if
if pass="" or pass='' then
MessageBox("系统提醒","对不起!密码不能为空!") sle_2.setfocus() return
end if
if realname="" or realname='' then
MessageBox("系统提醒","对不起!真实姓名不能为空!")
sle_3.setfocus() return
end if
if sex="" or sex='' then
MessageBox("系统提醒","对不起!性别不能为空!") return
end if
if dept="" or dept='' then
MessageBox("系统提醒","对不起!部门号不能为空!") sle_2.setfocus() return
end if
update consumer
set Upassword=:pass,Urealname=:realname,
Usex=:sex,Dnumber=:dept,Uphone=:phone,Uaddress=:address
where Uname=:name;
if sqlca.sqlcode<>0 then
messagebox("系统提醒","更改错误!")
return
end if
messagebox("系统提醒","更改成功!");
end if
取消按钮:close(parent)
界面:
(15)制作用户菜单中订阅菜单:制作数据窗口d_show_magazine,制作订阅报刊界面:w_subscribe,将d_show_magazine加入其中;
代码:
窗口代码:
sle_1.setfocus()
dw_1.settransobject(sqlca)
dw_1.retrieve()
提交按钮代码:
string name,password,magazinenum,num,ctime,number,money
double year
int numb,kindnum
double halfprice,wholeprice,summoney
string num1,name1
name=trim(sle_1.text)
password=trim(sle_5.text)
magazinenum=trim(sle_2.text)
ctime=trim(sle_3.text)
number=trim(sle_4.text)
if name="" or name='' then
messagebox("系统提醒","对不起!请您输入用户名!")
return
end if
if password="" or password='' then
messagebox("系统提醒","对不起!请您输入密码")
return
end if
if magazinenum="" or magazinenum='' then
messagebox("系统提醒","对不起!请您输入报刊号!")
return
end if
if ctime="" or ctime='' then
messagebox("系统提醒","对不起!请您输入订阅年限!")
return
end if
if number="" or number='' then
messagebox("系统提醒","对不起!请您输入数量!")
return
end if
if ctime="0" or ctime="" or ctime="0.0" or ctime="0.00" then
messagebox("系统提醒","请输入有效数字!")
sle_3.text=""
return
elseif ctime="0.5" then
year=0.5
elseif ctime="1" or ctime="1.0" then
year=1.0
elseif ctime="1.5" then
year=1.5
elseif ctime="2" or ctime="2.0" then
year=2.0
elseif ctime="2.5" then
year=2.5
elseif ctime="3" or ctime="3.0" then
year=3.0
elseif ctime="3.5" then
year=3.5
elseif ctime="4" or ctime="4.0" then
year=4.0
elseif ctime="4.5" then
year=4.5
elseif ctime="5" or ctime="5.0" then
year=5.0
else
messagebox("系统提醒","订阅年限输入不正确!请根据示例方法输入:1或1.0,并不要超出5.0!")
end if
if number="0" then messagebox("系统提醒","请输入有效数字!") sle_4.text=""
return
elseif number="1" then
numb=1
elseif number="2" then
numb=2
elseif number="3" then
numb=3
elseif number="4" then
numb=4
elseif number="5" then
numb=5
else
messagebox("系统提醒","输入不正确!请根据示例方法输入:1,并不要超出5!")
return
end if
select Uname,Upassword
into :gs_operator_id,:gs_password
from consumer
where Uname=:name;
if sqlca.sqlcode<>0 then
messagebox("系统提醒","无此用户!")
sle_1.text=""
sle_5.text=""
sle_1.setfocus()
return
end if
if password<>gs_password then
messagebox("警告","口令错误!")
sle_5.text=""
sle_5.setfocus()
return
end if
select Mnumber
into :num
from magazine
where Mnumber=:magazinenum;
if sqlca.sqlcode<>0 then
messagebox("系统提醒","无此报刊!")
sle_2.text=""
return
end if
select Mhalfprice,Mwhole
into :halfprice,:wholeprice
from magazine
where Mnumber=:magazinenum;
if sqlca.sqlcode<>0 then
messagebox("系统提醒","该报刊未输入价格!")
return
end if
if year=0.5 or year=1.5 or year=2.5 or year=3.5 or year=4.5 then
summoney=(-0.5+year)*wholeprice+halfprice
summoney=summoney*numb
elseif year=1 or year=2 or year=3 or year=4 or year=5 then
summoney=year*wholeprice
summoney=summoney*numb
end if
select Uname,Mnumber
into :name1,:num1
from subscribe
where Uname=:name and Mnumber=:magazinenum;
if sqlca.sqlcode=0 then
MessageBox("系统提醒","对不起,您已经订阅过此报!")
sle_1.text="" sle_2.text="" sle_3.text="" sle_4.text=""
sle_5.text=""
return
end if
INSERT INTO subscribe
(Uname,Mnumber,Syear,Snumber,Ssum)
VALUES(:name,:magazinenum,:ctime,:number,:summoney) ;
select Ssum
into :money
from subscribe
where Uname=:name and Mnumber=:magazinenum ;
MessageBox("系统提醒","恭喜!订阅成功!所需金额为"+money)
//更新用户订阅报刊种类
select count(Uname)
into :kindnum
from subscribe
where Uname=:name ;
update consumer
set subscribenum=:kindnum
where Uname=:name ;
清空按钮代码:sle_1.text="" sle_2.text="" sle_3.text="" sle_4.text=""
sle_5.text=""
数据窗口图:
订阅图:
(16)制作用户菜单中查询菜单:制作用户查询界面:同管理员按用户查询界面;
代码:
窗口代码:dw_1.settransobject(sqlca) sle_1.setfocus()
检索按钮代码同管理员界面检索按钮基础相同,仅将不一样点列出:
dw_1.setfilter("subscribe_uname='"+name+"'")
dw_1.filter()
ll_row=dw_1.retrieve()
if ll_row=0 then
messagebox("系统提醒","无统计!")
return
end if
退出按钮代码:close(w_consumer_query)
订阅界面:
(17)制作用户菜单中统计菜单:制作用户统计界面:w_consumer_stat,将数据窗口d_consumer_stat放入 w_consumer_stat中;
代码:窗口代码:
int ll_row
dw_1.settransobject(sqlca)
dw_1.setfilter("consumer_uname='"+gs_operator_id+"'")
dw_1.filter()
ll_row=dw_1.retri
展开阅读全文