1、数据库系统原理实验五数据库设计临沂大学信息学院学生上机(实验)报告20142015学年度第1学期 课程名称:数据库系统原理 指导教师: 学生姓名: 学 号:一、实验名称数据库设计二、实验目的1、理解数据库设计的含义 2、通过实践,掌握所学的数据库设计方法和步骤。 3、学会在一个实际的RDBMS软件平台上创建数据库;4、练习基于数据库支持的管理信息系统的开发方法;三、实验环境1、实验仪器设备。至少具有如下配置的计算机:计算机主频至少133MHZ;计算机内存至少32MB以上;至少85MB以上的硬盘空间;VGA或更高分辨率的显示器。2、软件环境。操作系统:Windows 7或Windows XP。D
2、BMS: Visual FoxPro。四、实验内容设计一管理信息系统:学生选课管理信息系统。五、实验步骤1、需求分析。 (1)学生选课的数据流图如下所示:课程 f3 f1 f2 选课学生 图5-1 学生选课数据流 (2)数据字典 1)数据项 数据项名 含义 数据类型 长度 小数位数 XH 学生学号 字符 10 XM 学生姓名 字符 8 AGE 学生年龄 数值 2 0 XB 学生性别 字符 2 SDEPT 学生系别 字符 20 CH 课程号 字符 2 CM 课程名 字符 20 G 课程成绩 数值 4 1 XF 课程学分 数值 1 0 2)数据结构 名称 含义说明 编号 输入的数据流 输出的数据流
3、 组成S 学生 1 无 f1 XH,XM,AGE,XB,SDEPT COURSE 课程 2 无 f3 CH,CM,XF SC 选课 3 f2 无 XH,CH,G 3)数据流 数据流名 说明 数据流来源 数据流去向 组成 f1 学生数据流 学生 选课(处理) XH f2 选课数据流 选课(处理) 选课 XH,CH,G f3 课程数据流 课程 选课(处理) CH 4)数据存储 名称 含义说明 编号 输入的数据流 输出的数据流 组成S 学生 1 无 f1 XH,XM,AGE,XB,SDEPT COURSE 课程 2 无 f3 CH,CM,XF SC 选课 3 f2 无 XH,CH,G 5)处理过程
4、处理过程的名:SC 说明: 学生的选课处理 输入的数据流:f1,f3 输出的数据流:f2 简要说明: 输入学生的学号,输入课程的课程号,进行选课 (3)功能分析 输入学生信息,可实现添加、删除、修改, 输入课程信息,可实现添加、删除、修改,输入学生的学号,可以查询学生的详细信息和选课的详细信息;输入学生的学号和和课程号,进行选课,可以显示学生选课的详细信息;输入学生的学号和和课程号可以退课。2、概念结构设计。 根据以上分析的结果得出概念模型如下所示课程 学生 m n 图5-2选课E-R图 3、逻辑结构设计。 根据以上概念模型得出如下的关系模型 S(学生)(XH,XM,AGE,XB,SDEPT)
5、 COURSE(课程)(CH,CM,XF) SC(选课)(XH,CH,G) 4、数据库物理设计。 本数据库采用Visual FoxPro提供的物理结构,存取方法采用索引存取,本数据库的索引有:S表:XHINDEX(主索引),COURSE表:CHIDEX(主索引),SC表:SCXHINDEX(普通索引)、SCCHINDEX(普通索引)。5、数据库实施。(1)规划 1)在D盘上建一个子目录,为201309270122-牟军宇 2)在设置系统的默认目录,在命令窗口下执行:Set default to D: /201309270122-牟军宇(2)创建项目在D:201309270122-牟军宇目录下建
6、立一项目文件xuanke.pjx,1)打开VFP,单击“文件”菜单中的“新建”选项出现如图5-3所示。 2)在“新建”对话框中选中“项目”后,单击“新建文件”出现如图5-4所示的对话框。3)在“项目创建对话框”中选择“D:”,在项目文件文本框中输入xuanke.pjx后,单击“保存”。出现图5-5所示界面。(3)创建数据库 在图5-5中选择“数据”选项卡,选中“数据库”,如图5-6所示,单击“新建”出现如图5-7所示的对话框,单击“新建数据库”出现图5-8所示对话框,选择“D:学号-姓名”,在数据库名对话框中输入”student.dbc”,单击“保存”,出现图5-9所示的界面。4)创建数据表
7、在图5-9中右键单击,单击“新建表“出现图5-10对话框,单击”新建表“,出现图5-11所示对话框,选择D:学号-姓名”,输入表名文本框中输入:s.dbf后,单击“保存“后,出现如图5-12所示的界面,输入S表的相应字段的参数。在图5-12中单击“索引“选项卡,输入索引名:xhindex,类型:主索引,表达式:xh,排序升序,如图5-13所示。输入完毕后单击”确定“出现如图5-14所示界面。和前面的步骤类似,依次建立SC表、COURSE表,在SC表中建立两个索引,索引名为SCXHINDEX ,类型为:普通索引,表达式为:XH,排序:升序;索引名为SCCHINDEX ,类型为:普通索引,表达式为
8、:CH,排序:升序。在Ccourse表中建立一个索引,索引名为CHINDEX ,类型为:主索引,表达式为:CH,排序:升序。设置完毕后,在图5-9中右键单击,选择“添加表“,把S、SC、COURSE表添加到当前数据库中,出现如图5-15所示的界面。 COURSE和SC表的结构如下: course表:表5.1 course表属性名类型宽度小数位CH字符型2CM字符型20XF数值型10 CH:课程号,CM:课程名,XF:学分,CH为主键 sc表:表5.2 sc表属性名类型宽度小数位XH字符型10CH字符型2G数值型41XH:学号,CH:课程号,G:成绩, 分别在三个表中输入如图5-16、图5-17
9、、图5-18数据所示数据图5-16 S表数据 图5-17 SC表数据图5-18 COURSE数据(3)建立表单 1)建立选课表单(xk.scx)打开xuanke.pjx,单击“文挡“选项卡,选中表单,单击”新建“,在弹出的对话框中单击”新建表单“,出现图5-19所示的界面。以下表单的建立方法类似。设置数据环境:在图5-19中右键单击,单击“数据环境”,弹出图5-20所示对话框,依次选中S、SC、COURSE表添加到当前数据环境中,如图5-21所示。然后关闭“数据环境”。 图5-20 添加表图5-21数据环境选课表单的属性:CAPTION:学生选课信息表-学号-姓名 AUTOCENTER:.T.
10、 CLOSABLE: .F. MAXBUTTON: .F. MINBUTTON: .F.选课表单的过程Activate event()的代码如下所示。 thisform.grid3.linkmaster= thisform.grid3.recordsource= thisform.grid3.recordsourcetype=1 thisform.grid3.relationalexpr= thisform.grid3.childorder= thisform.refresh 在表单xk.scx上添加如下图5-22所示的控件:表格控件GRID1:此表格显示学生的详细信息。 表格控件GRID1属
11、性:grid1.recordsource=s grid1.readonly=.t. 表格控件GRID1的事件thisform.grid1.column1.header1.click()代码如下所示: thisform.text1.value=thisform.grid1.column1.text1.value表格控件GRID2:显示课程的详细信息表格控件GRID2属性:grid2.recordsource=course grid2.readonly=.t. 表格控件GRID2的事件thisform.grid2.column1.header1.click()代码如下所示: thisform.te
12、xt1.value=thisform.grid2.column1.text1.value 表格控件GRID3:显示选课的详细信息表格控件GRID3属性:grid3.recordsource=scgrid3.readonly=.t. 文本框TEXT1控件:用来输入学号或单击学生信息表中某一个学号来完成输入;文本框TEXT2控件:用来输入学生的课程号或单击课程表中某一个课程号来完成输入。 命令按钮控件 有五个命令按钮:查询、选课、退课、关闭、清除按钮。查询按钮:用户在文本框TEXT1输入学号,或在文本框在TEXT2输入课程号,可查询相关选课信息,查询结果在GRID3中显示。其click()代码如下
13、所示: num1=alltrim(thisform.text1.value)num2=alltrim(thisform.text2.value)if num1=.and.num2= messagebox(请输入查询条件)else if num2=.and.not.num1 thisform.grid3.linkmaster=s thisform.grid3.recordsource=sc thisform.grid3.relationalexpr=xh thisform.grid3.childorder=scxhindex select s locate for s.xh=num1 if .n
14、ot.found() messagebox(无此学生) else thisform.refresh thisform.grid1.setfocus endif endif if num1= .and.not.num2 thisform.grid3.linkmaster=course thisform.grid3.recordsource=sc thisform.grid3.relationalexpr=ch thisform.grid3.childorder=scchindex select course locate for ch=num2 if .not. found() messageb
15、ox(没有此课程) else thisform.refresh thisform.grid2.setfocus endif endif endif 选课按钮:用户输入学号和课程号,单击选课,在选课信息表中显示该学生选课的详细信息。其CLICK()代码如下所示: num1=alltrim(thisform.text1.value)num2=alltrim(thisform.text2.value)if num1=.and.num2= messagebox(请输入选课的学号和课程号) else select s locate for s.xh=num1 if .not.found() messag
16、ebox(此学号不存在请重新输入学号) else num1=alltrim(thisform.text1.value) select course locate for course.ch=num2 if .not.found() messagebox(此课程号不存在请重新输入课程号) else num2=alltrim(thisform.text2.value) thisform.grid3.linkmaster= thisform.grid3.recordsource= thisform.grid3.recordsourcetype=1 thisform.grid3.relationale
17、xpr= thisform.grid3.childorder= thisform.refresh select sc locate for sc.xh=num1 and sc.ch=num2 if found() messagebox(此选课记录已存在) else insert into sc(xh,ch) values(num1,num2) thisform.grid3.linkmaster= thisform.grid3.recordsource=sc thisform.grid3.recordsourcetype=1 thisform.grid3.relationalexpr= this
18、form.grid3.childorder= thisform.refresh thisform.grid3.setfocus endif endif endifendif退课按钮:用户输入相应的学号和课程号,单击退课,可实现学生的退课。其CLICK()代码如下所示:num1=alltrim(thisform.text1.value)num2=alltrim(thisform.text2.value)if num1=.and.num2= messagebox(请输入退课的学号和课程号) else num1=alltrim(thisform.text1.value) num2=alltrim(t
19、hisform.text2.value) thisform.grid3.linkmaster= thisform.grid3.recordsource= thisform.grid3.recordsourcetype=1 thisform.grid3.relationalexpr= thisform.grid3.childorder= thisform.refresh select sc locate for sc.xh=num1 and sc.ch=num2 if .not.found() messagebox(此选课记录不存在) else delete from sc where sc.x
20、h=num1 and sc.ch=num2 messagebox(退课完成) use sc exclusive pack thisform.grid3.linkmaster= thisform.grid3.recordsource= thisform.grid3.recordsourcetype=1 thisform.grid3.relationalexpr= thisform.grid3.childorder= thisform.refresh thisform.grid3.setfocus endif endif 关闭按钮:单击关闭,可关闭选课表单。其CLICK()代码如下所示:y=.f.
21、z=.f.thisform.release 清楚按钮:单击清楚,可清楚TEXT1、TEXT2和选课信息表格的内容。其CLICK()代码如下所示: thisform.text1.value= thisform.text2.value= thisform.grid3.linkmaster= thisform.grid3.recordsource= thisform.grid3.recordsourcetype=1 thisform.grid3.relationalexpr= thisform.grid3.childorder= thisform.refresh thisform.grid3.set
22、focus2)建立学生表单(xs.scx) 建立一个学生表单,在学生表单中添加如图5-23所示的控件:图5-23学生信息表单学生表单的属性:CAPTION:学生基本信息 AUTOCENTER:.T. CLOSABLE: .F. MAXBUTTON: .F. MINBUTTON: .F.学生表单的Activate event()事件代码如下所示: thisform.grid1.readonly=.t. 学生表单的load event()事件代码如下所示:use s exclusive在学生表单上添加如下控件: 表格控件grid1:显示学生基本信息 属性: recordsource: s 表格控件
23、grid1的VALID()事件代码如下所示:thisform.grid1.readonly=.t. 命令按钮:新增、删除、修改、关闭 新增按钮:单击“新增“,用户在表格中新增一个学生记录,其CLICK()代码如下所示:thisform.grid1.readonly=.f.append blankthisform.grid1.setfocus 删除按钮:用户选中表格一记录,单击“删除“可删除此记录,其CLICK()代码如下所示: thisform.grid1.linkmaster= thisform.grid1.recordsource= thisform.grid1.recordsourcet
24、ype=1 thisform.grid1.relationalexpr= thisform.grid1.childorder= thisform.refresh delete pack thisform.grid1.linkmaster= thisform.grid1.recordsource=s thisform.grid1.recordsourcetype=1 thisform.grid1.relationalexpr= thisform.grid1.childorder= thisform.refreshthisform.grid1.setfocusthisform.grid1.read
25、only=.t. 修改按钮:单击“修改“,用户可修改表格中的任一记录,其CLICK()代码如下所示: thisform.grid1.readonly=.f. 关闭按钮:单击“关闭“,用户可关闭学生表单,其CLICK()代码如下所示: x=.f.thisform.release3)建立课程表单(kc.scx) 建立一个课程表单,在课程表单中添加如图5-24所示的控件:图5-24课程信息表单课程表单的属性:CAPTION:课程基本信息表 AUTOCENTER:.T. CLOSABLE: .F. MAXBUTTON: .F. MINBUTTON: .F.选课表单的Activate event()事件
26、代码如下所示: thisform.grid1.readonly=.t. 选课表单的load event()事件代码如下所示:use course exclusive在学生表单上添加如下控件: 表格控件grid1:显示学生基本信息 属性:recordsource: course 表格控件grid1的VALID()事件代码如下所示:thisform.grid1.readonly=.t. 命令按钮:新增、删除、修改、关闭 新增按钮:单击“新增“,用户在表格中新增一个学生记录,其CLICK()代码如下所示:thisform.grid1.readonly=.f.append blankthisform.
27、grid1.setfocus 删除按钮:用户选中表格一记录,单击“删除“可删除此记录,其CLICK()代码如下所示: thisform.grid1.linkmaster= thisform.grid1.recordsource= thisform.grid1.recordsourcetype=1 thisform.grid1.relationalexpr= thisform.grid1.childorder= thisform.refresh delete pack thisform.grid1.linkmaster= thisform.grid1.recordsource=COURSE th
28、isform.grid1.recordsourcetype=1 thisform.grid1.relationalexpr= thisform.grid1.childorder= thisform.refreshthisform.grid1.setfocusthisform.grid1.readonly=.t. 修改按钮:单击“修改“,用户可修改表格中的任一记录,其CLICK()代码如下所示: thisform.grid1.readonly=.f. 关闭按钮:单击“关闭“,用户可关闭学生表单,其CLICK()代码如下所示: x=.f.thisform.release4)建立主表单(main.s
29、cx) 新建一主表单,该主表单的作用是用来向其添加菜单,如图5-25所示。 主表单的主要属性为:CAPTION:学生选课信息管理系统 CLOSABLE: .F. MAXBUTTON: .F. MINBUTTON: .F. Showwindow: 2Windowstate: 2图5-25学生选课信息主表单的init()事件代码如下所示:public x,y,z *x,y,z用来定义菜单中的三个选项是否可用。x=.f.y=.f.z=.f.do mainmenu.mpr with this,.t. 主表单的unload()事件代码如下所示:clear events(4)建立菜单(mainmenu.mnx) 在图5-5中单击“其他“选项卡,选中菜单选项,单击新建,出现如图5-26所示界面。 图5-26菜单设计器在菜单设计