PowerBuilder程序设计
(专业选修课)
学号: 姓名: 班级:
答 辩 情 况:
1、程序难易程度:难( ),较难( ),一般( ),简单( );
2、程序工作量: 大( ),较大( ),一般( ),较小( );
3、基本操作: 熟练( ),较熟练( ),一般( ),不熟练( ),
极不熟练( );
4、代码理解: 准确( ),较准确( ),一般( ),不准确( ),
极不准确( );
平 时 成 绩: 优秀( ),良好( ),中等( ),一般( )
总 评 成 绩: 任 课 教 师:
2010年12月
学生成绩管理系统
一、系统分析与设计
在任何高等院校,学生的成绩管理都是学校教务管理的重要环节之一。随着学校学生人数的增加,学生成绩管理的任务更加繁重,必须借助现代化的管理工具和手段提高学生成绩管理效率。学生成绩管理系统广泛适用于高校教务管理部门的学生成绩管理,其作用和功能也是学生比较熟悉和容易理解的。
1、系统功能分析
系统功能分析阶段的任务就是确定该系统所要解决的问题及其具体要求。需要通过与用户的交流和沟通明确用户对系统的功能要求,最终列出系统可以实现的功能由用户确认。
⑴ 班级信息的输入和存储,包括班级编号、班级名称、所属专业、入校时间和学制等。
⑵ 对已经输入的班级信息的修改、查询。
⑶ 学生基本信息的输入和存储,包括学号、姓名、性别、出生日期、班级等。
⑷ 学生基本信息的修改和查询。
⑸ 每学期初各班所开设课程的输入,包括课程名、学期、学时等。
⑹ 各班所开设课程信息的修改和查询。
⑺ 学期末输入每个学生的考试成绩。
⑻ 学生成绩的修改。
⑼ 查询某个学生某学期的各科成绩。
⑽ 查询并打印某班某学期所有学生的各科成绩。
⑾ 查询并打印某班某学期某科成绩。
⑿ 系统具有用户和密码的管理。
2、系统功能模块设计
通过对上述各项功能的分析、分类、综合,按照模块化程序设计的要求,得到如图1.1所示的功能模块图。
二、数据库设计与实现
数据库在一个管理信息系统中占有非常重要的地位,数据库结构的好坏将直接影响到应用系统的实现效果和数据操作效率以及能否保证数据的一致性、完成性和安全性。
1、数据库设计
根据学生成绩管理系统的功能要求,通过分析系统要涉及的相关实体以及要收集、存
储和操纵的数据信息,得到如图2.1所示的系统E-R图。
根据系统E-R图得到以下关系模式。
班级(班级编号,班级名称,所属专业,学制,入学时间,人数)。
学生基本信息(学号,姓名,性别,出生日期,家庭住址,班级编号)。
课程(班级编号,学期,课程名称,学时,教师)。
成绩(学号,学期,课程名称,成绩)。
为了系统的使用安全,要建立用户管理,而用户使用权限分为管理员和一般用户两类,因此需要建立一个存储用户信息的关系。
用户(姓名,密码,权限)。
2、创建数据库
根据关系模式,确定需要建立的数据库和表。
首先,在D盘根目录下建立本实例的工作文件夹“xscj”,再在“D:\\xscj”文件夹下建立文件夹“data”,用于存储数据库文件。
在PowerBuilder开发环境中打开数据库画板,使用【ODB ODBC】接口建立Adaptive Server Anywhere 9.0(ASA 9.0)的数据库D:\\xscj\\data\\xscj.db,然后依次建立以下5个表和1个视图。
1) “班级”表
表名:banji
主键:bjbh
各个列的属性见表2-1。
2)“学生基本信息”表
表名:jiben
主键:xh
各个列的属性见表2-2。
3)“课程”表
表名:bjkc
主键:(bjbh,xq,kcmc)
各个列的属性见表2-3。
4)“成绩”表
表名:xscj
主键:(xh,xq,kcmc)
各个列的属性见表2-4。
5)“用户”表
表名:users
主键:name
各个列的属性见表2-5。
各个表之间通过外键形成如图2.3所示的关联关系。
图2.3表的关联关系
6)视图
为了访问数据库方便,还建立了1个视图“xsbj”,该视图由学生基本信息表和班级
表连接而成,对应的SQL语句如下。
CREATE VIEW xsbj(xh,xm,xb,csrq,bjbh,bjmc,zymc)AS
SELECT
jiben.xh,jiben.xm,jiben.xb,jiben.csrq,jiben.bjbh,banji.bjmc,banji.zym
c
FROM jiben,banji
WHERE(banji.bjbh=jiben.bjbh);
完成数据库和表的创建后,可以在数据库画板中向数据库输入部分数据。其中,“用户”表中必须输入一条记录(“管理员”,“admin”,“管理员”),作为进入系统默认的管理员,即姓名为“管理员”,密码为“admin”。
三、创建应用对象
完成数据库的设计和系统功能设计之后,可以开始各个功能模块的实现。在PowerBuilder中开发应用程序时,就是创建各种对象、为对象设置属性以及编写事件脚本的过程。但不是简单的顺序过程,有时需要返回为前面创建的对象补充脚本。下面开始本实例在PowerBuilder中的实现。
⑴ 创建新的工作空间,工作空间文件路径及名称设为“d:\\xscj\\xscj.pbw”。
⑵ 创建应用对象,应用对象名设为“app_xscj”,应用库文件路径及名称设为“d:\\xscj\\xscj.pbl”,目标文件路径及名称设为“d:\\xscj\\xscj.pbt”。
⑶ 打开应用对象画板,应用对象app_xscj的Icon属性设置为“d:\\xscj\图标.ICO”。图标.ICO是预先准备的图标文件。
⑷ 为应用对象app_xscj的Open事件编写代码如下。
//连接数据库
SQLCA.DBMS="ODBC"
SQLCA.AutoCommit=False
SQLCA.DBParm="Connectstring='DSN=xscj;UID=dba;PWD=sql'"
CONNECT;
if SQLCA.sqlcode<>0 then
messagebox("提示数据库连接失败!")
else
//open(w_login)//打开登录窗口
end if
注意:由于登录窗口w_login还没有设计,代码行“open(w_login)//打开登录窗口”先注释掉,在设计好登录窗口时,再去掉本行代码前面的注释符。执行此应用时,首先链接数据库“xscj”,成功后打开登录窗口。
四、设计系统管理模块
本模块实现用户登录控制、用户自己的密码修改和用户管理,其中用户管理包括修改用户信息、添加新用户、删除用户,只有管理员级用户有此权限。
1、设计登录窗口
登录窗口如图4.1所示。
图4.1登陆窗口
1)创建窗口并设置属性
创建登录窗口w_login,调整其大小,在窗口上放置1个图片控件(p_1)、3个静态文本
控件(st_1、st_2、st_3)、1个下拉列表控件(ddlb_1)、2个单行编辑器控件(sle_1、sle_2)、2个命令按钮控件(cb_1、cb_2),各个控件的位置和大小参照图4.1调整。其他需要修改的性
见表4-1,表中未列出的属性保留其默认值。
2)编写脚本
⑴ 定义全局变量。
string gs_username,gs_password,gs_admin
分别存储登录用户的姓名、密码和权限。
⑵ 定义实例变量。
int li_n
存储登录时用户输入密码错误的尝试次数,控制在最多3次机会不能是局部变量。
⑶ 登录窗口w_login的Open事件脚本如下。
li_n=3
初始化变量li_n,出错次数为3次。
⑷【确定】按钮cb_1的Clicked事件脚本如下。
⑸【放弃】按钮cb_2的Clicked事件脚本如下。
halt//退出程序
2、设计密码修改窗口
密码修改窗口如图4.2所示。
1)创建窗口并设置属性
创建密码修改窗口w_change,调整其大小,在窗口上放置3个静态文本控件(st_1、st_2、st_3)、3个单行编辑器控件(sle_1、sle_2、sle_3)、2个命令按钮控件(cb_1、cb_2),各个控件的位置和大小参照图4.2调整。其他需要修改的属性见表4-2,表中未列出的属性保留其默认值。
图4.2 密码修改窗口
2)编写脚本
(1)【确定】按钮cb_1的Clicked事件脚本如下。
(2)【取消】按钮cb_2的Clicked事件脚本如下。
close(parent)
3、设计用户管理的数据窗口和窗口
用户管理窗口如图4.3所示。
图4.3 用户管理窗口
1)设计数据窗口
创建数据窗口“d_zhgl”,显示风格为“Grid”,数据源类型为“Quick Select”,布局如图4.4所示。其中列控件“admin”的编辑风格改为“DropDownListBox”,码表(CodeTable)如图4.4所示。
数据窗口d_yhgl生成的SQL Select语句为:
SELECT"users"."name
2)创建窗口并设置属性
创建用户管理窗口w_zhgl,调整其大小,在窗口上放置1个数据窗口控件(dw_1)、4
个命令按钮控件(cb_1、cb_2、cb_3、cb_4),各个控件的位置和大小参照图4.3调整,其
他需要修改的属性见表4-3,表中未列出的属性保留其默认值。
3)编写脚本
(1) 用户管理窗口w_zhgl的Open事件脚本如下。
dw_1.settransobject(sqlca)
dw_1.retrieve()
(2) 用户管理窗口w_zhgl的Closequery事件脚本如下。
//判断是否有未保存的修改,提醒保存
(3) 数据窗口控件dw_1的Itemchanged事件脚本如下。
cb_3.enabled=true//激活“保存”按钮
(4)【添加】按钮控件cb_1的Clicked事件脚本如下。
integer row
row=dw_1.insertrow(0)
dw_1.scrolltorow(row)
(5)【删除】按钮控件cb_2的Clicked事件脚本如下。
dw_1.deleterow(0)
cb_3.enabled=true
(6)【保存】按钮控件cb_3的Clicked事件脚本如下。
(7)【退出】按钮控件cb_4的Clicked事件脚本如下。
close(parent)
五、设计主窗口和菜单
主窗口和菜单是系统工作的主界面,本例的主窗口为带帮助的多文档框架窗口。
1、创建菜单对象
菜单结构如图5.1所示。菜单对象名为“m_main”,菜单栏中的菜单项设置了访问
键(AccessKey),常用的菜单项设置了快捷键(如【退出系统】的快捷键为【Alt+F4】,【录
入班级信息】的快捷键为【Ctrl+A】),最常用的菜单项在工具条上建立了按钮。菜单项属
性的具体设置不再赘述。
下面编写各个菜单项的脚本。对于这些代码行,在对应的窗口没有建立之前先注释掉,
在对应的窗口建立后再去掉其注释符。
(1)【系统】菜单下【密码修改】菜单项的Clicked事件脚本如下。
open(w_mmxg)
(2)【系统】菜单下【用户管理】菜单项的Clicked事件脚本如下。
open(w_yhgl)
(3)【系统】菜单下【退出系统】菜单项的Clicked事件脚本如下。
close(parentwindow)
(4)【班级管理】菜单下【录入班级信息】菜单项的Clicked事件脚本如下。
opensheet(w_banji_shuru,w_main,6,Original!)
图5.1 菜单结构
其功能是在主窗口(w_main)中,以输入班级信息窗口w_banji_shuru的原来大小(Original!参数指定)打开,并在第6个菜单(即【窗口】菜单)下列出该窗口的名称。
(5)【班级管理】菜单下【修改班级信息】菜单项的Clicked事件脚本如下。
opensheet(w_banji_xiugai,w_main,6,Original!)
(6)【班级管理】菜单下【浏览班级信息】菜单项的Clicked事件脚本如下。
opensheet(w_banji_liulan,w_main,6,Original!)
(7)【学生管理】菜单下【录入学生信息】菜单项的Clicked事件脚本如下。
opensheet(w_jiben_shuru,w_main,6,Original!)
(8)【学生管理】菜单下【修改学生信息】菜单项的Clicked事件脚本如下。
opensheet(w_jiben_xiugai,w_main,6,Original!)
(9)【学生管理】菜单下【查询学生信息】菜单项的Clicked事件脚本如下。
opensheet(w_jiben_chaxun,w_main,6,Original!)
(10)【课程管理】菜单下【录入/修改开设课程】菜单项的Clicked事件脚本如下。
opensheet(w_bjkc_shuruxiugai,w_main,6,Original!)
(11)【课程管理】菜单下【查询开设课程信息】菜单项的Clicked事件脚本如下。
opensheet(w_bjkc_chaxun,w_main,6,Original!)
(12)【成绩管理】菜单下【录入修改成绩】菜单项的Clicked事件脚本如下。
opensheet(w_xscj_shuru,w_main,6,Original!)
(13)【成绩管理】菜单下【查询个人成绩】菜单项的Clicked事件脚本如下。
opensheet(w_xscj_grcx,w_main,6,Original!)
(14)【成绩管理】菜单下【查询班级成绩】菜单项的Clicked事件脚本如下。
opensheet(w_xscj_bjcx,w_main,6,Original!)
(15)【成绩管理】菜单下【查询课程成绩】菜单项的Clicked事件脚本如下。
opensheet(w_xscj_kccx,w_main,6,Original!)
(16)【窗口】菜单下【层叠窗口】菜单项的Clicked事件脚本如下。
w_main.arrangesheets(cascade!)
功能是将主窗口中打开的子窗口以层叠方式排列。
(17)【帮助】菜单下【关于】菜单项的Clicked事件脚本如下。
open(w_help)
2、设计主窗口
图5.2 主窗口界面如图
窗口对象w_main的Open事件脚本如下。
if gs_admin='n'then
m_main.m_系统.m_用户管理.enabled=false
end if
其功能是非管理员用户进入系统时关闭【用户管理】菜单项。
六、设计班级管理模块
本模块实现班级信息的输入、修改和查询。
1、设计访问班级信息的数据窗口
1)设计输入班级信息的数据窗口
创建数据窗口d_banji_shuru,显示风格为“Freeform”,数据源类型为“Quick Select”,
其布局如图6.1所示。
数据窗口d_banji_shuru生成的SQL Select语句为:
SELECT"banji"."bjbh
2)设计修改班级信息的数据窗口
创建数据窗口d_banji_xiugai,显示风格为“Grid”,数据源类型为“Quick Select”,
其布局如图6.2所示。
数据窗口d_banji_xiugai生成的SQL Select语句为:
SELECT"banji"."bjbh
FROM"banji"
ORDER BY"banji"."bjbh"ASC
2、设计访问班级信息的窗口
首先设计两个通用的输入窗口和修改窗口作为父对象,实现一般输入和修改的功能,
窗口中的数据窗口控件不设定具体的数据窗口对象,在继承的窗口对象中再设定。通过继
承可以简化程序设计,实现代码重用。
1)设计输入窗口
创建窗口对象w_shuru,调整其大小,放置1个数据窗口控件(dw_1)、8个命令按钮控
件(cb_1~cb_8),窗口布局如图6.3所示。窗口及其控件的属性设置见表6-1。
图6.3 班级信息录入
设置完属性后开始编写脚本代码,其中窗口w_shuru的Open事件和Closequery事件、命令按钮(【添加】、【删除】、【保存】和【退出】)的Clicked事件同账户管理窗口w_zhgl的相应事件脚本,在此不再重复。其他命令按钮的事件脚本如下。
(1)【|<<】按钮的Clicked事件脚本如下。
dw_1.scrolltorow(1)
(2)【<】按钮的Clicked事件脚本如下。
dw_1.scrollpriorrow()
(3)【>】按钮的Clicked事件脚本如下。
dw_1.scrollnextrow()
(4)【>>|】按钮的Clicked事件脚本如下。
dw_1.scrolltorow(dw_1.rowcount())
2)设计修改窗口
创建窗口对象w_xiugai,调整其大小,放置1个数据窗口控件(dw_1)、4个命令按钮
控件(cb_1~cb_4),窗口布局如图6.4所示。
窗口及其控件的属性设置见表6-2。
图6.4 班级信息修改
窗口和控件的事件脚本与以上输入窗口的对应部分相同。
3)设计输入班级信息窗口
通过继承输入窗口w_shuru生成输入班级信息窗口w_banji_shuru,将数据控件dw_1的DataObject属性设置为d_banji_shuru,将窗口的Title属性改为“录入班级信息”,此窗口设计便完成了。
4)设计修改班级信息窗口
通过继承修改窗口w_xiugai生成修改班级信息窗口w_banji_xiugai,将数据控件dw_1的DataObject属性设置为d_banji_xiugai,将窗口的Title属性改为“修改班级信息”,此窗口设计便完成了。
5)设计浏览班级信息窗口
创建窗口对象w_banji_liulan,调整其大小,放置1个数据窗口控件dw_1,调整窗口布局如图6.5所示。
图6.5 浏览班级信息
窗口及其控件的属性设置见表6-3。
窗口的Open事件脚本如下。
dw_1.settransobject(sqlca)
dw_1.retrieve()
七、设计学生基本信息管理模块
本模块实现学生基本信息的输入、修改和查询。
1、设计访问学生基本信息的数据窗口
1)设计输入学生基本信息的数据窗口
创建数据窗口d_jiben_shuru,显示风格为“Freeform”,数据源类型为“Quick Select”,其布局如图7.1所示。
其中,列控件“xb”的编辑风格改为“RadioButtons”,码表如图10.15中所示;列控件“bjbh”的编辑风格改为“DropDownDW”,其DataWindow属性设置为“d_banji_xiugai”,Display Column属性和Data Column属性都设置为“bjbh”,Width of DropDown(%)属性设置为“300”,Lines in DropDown属性设置为“6”,VScrollBar属性设置为“True”。数据窗口d_jiben_shuru生成的SQL Select语句为:
SELECT"jiben"."xh
FROM"jiben"
2)设计修改学生基本信息的数据窗口
创建数据窗口d_jiben_xiugai,显示风格为“Grid”,数据源类型为“Quick Select”,
其布局如图7.2所示。
其中,列控件“xb”的编辑风格改为“DropDownListBox”,列表项为“男”,“女”;
列控件“bjbh”的编辑风格改为“DropDownDW”,其DataWindow属性设置为
“d_banji_xiugai”,Display Column属性和Data Column属性都设置为“bjbh”,Width o
DropDown(%)属性设置为“300”,Lines in DropDown属性设置为“6”,VScrollBar属性
设置为“True”。
数据窗口d_jiben_xiugai生成的SQL Select语句为:
SELECT"jiben"."xh
"jiben"."csrq
FROM"jiben"
ORDER BY"jiben"."xh"ASC
图7.2 数据窗口d_jiben_xiugai
3)设计查询学生基本信息的数据窗口
创建数据窗口d_jiben_chaxun,显示风格为“Grid”,数据源类型为“SQL Select”,
其布局如图7.3所示。
其中,定义3个String型检索参数变量mxh、mxm、mbj,分别表示学号、姓名、班级,形成带检索参数的数据窗口。
该数据窗口的修改属性为默认值即“不允许修改”。
数据窗口d_jiben_chaxun生成的SQL Select语句为:
SELECT"banji"."bjmc
"jiben"."csrq
FROM"jiben
WHERE("banji"."bjbh"="jiben"."bjbh")AND(("jiben"."xh"like:mxh
AND
("jiben"."xm"like:mxm)AND("banji"."bjmc"like:mbj))
ORDER BY"jiben"."xh"ASC
2、设计访问学生基本信息的窗口
1)设计输入学生基本信息的窗口
通过继承输入窗口w_shuru生成输入学生基本信息窗口w_jiben_shuru,将数据控件
dw_1的DataObject属性设置为d_jiben_shuru,将窗口的Title属性改为“录入学生基本信
息”,此窗口设计便完成了。
2)设计修改学生基本信息的窗口
通过继承修改窗口w_xiugai生成修改学生基本信息窗口w_jiben_xiugai,将数据控件
dw_1的DataObject属性设置为d_jiben_xiugai,将窗口的Title属性改为“修改学生基本信
息”,此窗口设计便完成了。
3)设计查询学生基本信息的窗口
要求此窗口中能够根据学生的姓名或学号查询出学生的基本信息,能够根据班级名称查询出该班所有学生的基本信息。
查询学生基本信息窗口如图7.4所示。
图7.4 查询学生基本信息
首先创建一个窗口对象w_jiben_chaxun,调整大小,在窗口中放置2个静态文本控件(st_1,st_2)、1个下拉列表框控件(ddlb_1)、1个单行编辑器控件(sle_1)、1个命令按钮(cb_1)、1个数据窗口控件(dw_1)和一个线形控件(ln_1),调整各个控件的位置和大小。设置窗口及其控件的属性见表7-1。
【查询】按钮的Open事件脚本如下。
dw_1.settransobject(sqlca)
if ddlb_1.text=""or sle_1.text=""then
messagebox("提示查询列和查询内容不能空!")
return
end if
string str
str=trim(sle_1.text)
choose case ddlb_1.text
case"学号"
dw_1.retrieve(str,"%
case"姓名"
dw_1.retrieve("%",str,"%")
case"班级名称"
dw_1.retrieve("%
end choose
代码中根据查询依据的不同,以不同参数方式检索数据。
八、设计课程管理模块
本模块实现各班开设课程的输入、修改和查询。
1、设计访问课程信息的数据窗口
1)设计输入班级课程信息的数据窗口
创建数据窗口d_bjkc_shuru,显示风格为“Grid”,数据源类型为“Quick Select”,
其布局如图8.1所示。
其中,列控件“bjbh”的编辑风格改为“DropDownDW”,其DataWindow属性设置
为“d_banji_xiugai”,Display Column属性和Data Column属性都设置为“bjbh”,Width of
DropDown(%)属性设置为“300”,Lines in DropDown属性设置为“6”,VScrollBar属性
设置为“True”。
数据窗口d_bjkc_shuru生成的SQL Select语句为:
SELECT"bjkc"."bjbh
"bjkc"."xs
FROM"bjkc"
2)设计查询班级课程信息的数据窗口
创建数据窗口d_bjkc_chaxun,显示风格为“Grid”,数据源类型为“SQL Select”,
其布局如图8.2所示。
其中,定义2个String型检索参数变量mxq、mbjmc,分别表示学期、班级,形成带
检索参数的数据窗口。
该数据窗口的修改属性为默认值即“不允许修改”。
数据窗口d_bjkc_chaxun生成的SQL Select语句为:
SELECT"bjkc"."kcmc
FROM"bjkc
WHERE("banji"."bjbh"="bjkc"."bjbh")AND
(("bjkc"."xq"=:mxq)AND
("banji"."bjmc"=:mbjmc))
2、设计访问课程信息的窗口
1)设计输入修改班级课程信息的窗口
班级课程的输入和修改都通过此窗口完成,输入修改班级课程信息的窗口的布局如图
8.3所示
图8.3 班级课程录入修改
首先,从祖先窗口w_xiugai继承生成窗口对象w_bjkc_shuruxiugai,调整其大小。然
后将数据窗口控件dw_1的DataObject属性设置为d_bjkc_shuru,此窗口设计即完成。
2)设计查询班级开设课程的窗口
要求此窗口能够根据输入的学期和班级查询出该班此学期开设的课程。
查询班级开设课程的窗口如图8.4所示。
图8.4 班级课程查询
首先创建一个窗口对象w_bjkc_chaxun,调整其大小,在窗口中放置2个静态文本控件(st_1,st_2)、2个下拉列表框控件(ddlb_1,ddlb_2)、1个命令按钮(cb_1)、1个数据窗口控件(dw_1),调整各个控件的位置和大小。设置窗口及其控件的属性见表8-1。
下面书写各个对象的事件脚本。
(1)窗口w_bjkc_chaxun的Open事件脚本如下。
dw_1.settransobject(sqlca)//连接事务对象sqlca
//定义局部变量
int li_xq,li_bjmc,n
string ls_xq,ls_bjmc
//动态生成学期下拉列表框的列表项
SELECT count(distinct xq)INTO:li_xq
FROM bjkc;
DECLARE xqcursor CURSOR FOR
SELECT xq FROM bjkc GROUP BY xq;
OPEN xqcursor;
FOR n=1 TO li_xq
FETCH NEXT xqcursor INTO:ls_xq;
ddlb_1.additem(ls_xq)
NEXT
CLOSE xqcursor;
//动态生成班级下拉列表框的列表项
SELECT count(distinct bjmc)INTO:li_bjmc
FROM banji;
DECLARE bjmccursor CURSOR FOR
SELECT banji.bjmc
FROM bjkc,banji
WHERE bjkc.bjbh=banji.bjbh GROUP BY banji.bjmc;
OPEN bjmccursor;
FOR n=1 TO li_bjmc
FETCH NEXT bjmccursor INTO:ls_bjmc;
ddlb_2.additem(ls_bjmc)
NEXT
CLOSE bjmccursor;
(2)【查询】按钮的Clicked事件脚本如下。
dw_1.retrieve(ddlb_1.text,ddlb_2.text)
九、设计成绩管理模块
本模块实现成绩的输入、修改和多种方式的查询与打印。
1、设计访问成绩信息的数据窗口
1)设计输入成绩的数据窗口
创建数据窗口d_xscj_shuru,显示风格为“Grid”,数据源类型为“SQL Select”,其
局如图9.1所示。数据来源于成绩表xscj和视图xsbj,其中,学号、学期、课程名称
成绩为成绩表xscj的列,姓名是视图xsbj的列。
选择【Rows】|【Update Properties】命令,打开数据窗口的修改属性对话框,如图9.2
所示,设置数据窗口的修改属性,即只有成绩表xscj的成绩列(xscj_cj)可以在数据窗口中
修改,关键字为成绩表xscj的主关键字(xh,xq,kcmc)。然后,单击工具条上的【Tab Orde
图标,将列控件xscj_cj的Tab Order值设为10,再单击【Tab Order】图标回到原设计状态。
数据窗口的检索参数为mxq、mbjmc、mkcmc,分别对应于学期、班级名称和课程
名称。
数据窗口d_bjkc_shuru生成的SQL Select语句为:
SELECT"xscj"."xh
FROM"xsbj
WHERE("xsbj"."xh"="xscj"."xh")and
(("xscj"."xq"=:mxq)AND
("xsbj"."bjmc"=:mbjmc)AND
("xscj"."kcmc"=:mkcmc))
ORDER BY"xscj"."xh"ASC
2)设计查询学生个人某学期各科成绩的数据窗口
创建数据窗口d_xscj_grcx,显示风格为“Grid”,数据源类型为“Quick Select”,其
布局如图9.3所示。在【Summary】条中添加一个计算域控件,计算数据窗口中成绩
总和。
数据窗口的检索参数为mxh、mxq,分别对应于学号和学期。
数据窗口d_bjkc_shuru生成的SQL Select语句为:
SELECT"xscj"."kcmc
FROM"xscj"
WHERE("xscj"."xh"=:mxh)AND
("xscj"."xq"=:mxq)
3)设计查询某班级某学期全体学生各科成绩的数据窗口
创建数据窗口d_xscj_bjcx,显示风格为“Cross Tab”,数据源类型为“SQL Select”,
其布局如图9.4所示。数据来源于成绩表xscj和视图xsbj,其中,学号、课程名称和成
绩为成绩表xscj的列,姓名是视图xsbj的列。
在【Header[1]】条中添加2个计算域控件,对应的表达式分别为mbjmc和mxq,3个
文本控件,其文本分别为“成绩单”、“班级:”和“学期:”。
数据窗口的检索参数为mxq和mbjmc,分别对应于学期和班级名称。修改属性取默认
值(不允许修改)。
数据窗口d_bjkc_shuru生成的SQL Select语句为:
SELECT"xscj"."xh
"xsbj"."bjmc"
FROM"xscj
WHERE("xscj"."xh"="xsbj"."xh")and
(("xscj"."xq"=:mxq)AND
("xsbj"."bjmc"=:mbjmc))
ORDER BY"xscj"."xh"ASC
4)设计查询某班级某学期全体学生某科成绩的数据窗口
创建数据窗口d_xscj_kccx,显示风格为“N_Up”,栏数为2,数据源类型为
“SQL Select”,其布局如图9.5所示。数据来源于成绩表xscj和视图xsbj,其中,学
号和成绩为成绩表xscj的列,姓名是视图xsbj的列。
在【Header】条中添加2个计算域控件对应的表达式分别为mbjmc和mkcmc,3个文
本控件,其文本分别为“成绩单”、“班级:”和“课程:”。
数据窗口的检索参数为mxq、mbjmc和mkcmc,分别对应于学期、班级名称和课程名
称。修改属性取默认值(不允许修改)。
数据窗口d_bjkc_shuru生成的SQL Select语句为:
SELECT"xscj"."xh
FROM"xscj
WHERE("xscj"."xh"="xsbj"."xh")and
(("xscj"."xq"=:mxq)AND
("xsbj"."bjmc"=:mbjmc)AND
("xscj"."kcmc"=:mkcmc))
ORDER BY"xscj"."xh"ASC
2、设计访问成绩信息的窗口
1)设计输入成绩的窗口
输入成绩的窗口如图9.6所示。首先创建窗口对象w_xscj_shuru,在窗口上放置1
个分组框控件、3个静态文本控件、3个下拉列表框控件、3个命令按钮控件和1个数据窗
口控件。
根据图9.6的布局调整窗口和控件的大小、位置及有关属性。其中,【保存】按钮
的enabled属性设为False;数据窗口控件调整到只显示学号、姓名和成绩3列,VScrollBar
属性设为True,数据窗口对象为d_xscj_shuru;3个下拉列表框控件的列表项为空,由代码
动态生成。
各个窗口和控件的事件脚本如下。
(1)窗口的Open事件脚本如下。
dw_1.settransobject(sqlca)
//定义局部变量
int li_xq,li_bjmc,li_kcmc,n
string ls_xq,ls_bjmc,ls_kcmc
//生成学期下拉列表框的列表项
SELECT count(distinct xq)INTO:li_xq
FROM bjkc;
DECLARE xqcursor CURSOR FOR
SELECT xq FROM bjkc GROUP BY xq;
OPEN xqcursor;
FOR n=1 TO li_xq
FETCH NEXT xqcursor INTO:ls_xq;
ddlb_1.additem(ls_xq)
NEXT
CLOSE xqcursor;
//生成班级下拉列表框的列表项
SELECT count(distinct bjbh)INTO:li_bjmc
FROM bjkc;
DECLARE bjmccursor CURSOR FOR
SELECT banji.bjmc
FROM bjkc,banji
WHERE bjkc.bjbh=banji.bjbh GROUP BY banji.bjmc;
OPEN bjmccursor;
FOR n=1 TO li_bjmc
FETCH NEXT bjmccursor INTO:ls_bjmc;
ddlb_2.additem(ls_bjmc)
NEXT
CLOSE bjmccursor;
图9.6录入学生成绩
(2)窗口的Closequery事件脚本如下。
integer rt
dw_1.accepttext()
if dw_1.modifiedcount()=0 then
return 0
else
rt=messagebox("提示添加修改内容未保存,确实退出吗?",Question!,YesNo!)
if rt=1 then
return 0
end if
end if
return 1
(3)课程的下拉列表框的Getfocus事件脚本如下。
int li_kcmc,n
string ls_kcmc,ls_xq,ls_bjmc
ls_xq=ddlb_1.text
ls_bjmc=ddlb_2.text
if not(ls_xq=""or ls_bjmc="")then
//求选定班级和学期的课程门数
SELECT count(distinct bjkc.kcmc)INTO:li_kcmc
FROM bjkc,banji
WHERE(bjkc.bjbh=banji.bjbh)and(banji.bjmc=:ls_bjmc)and
(bjkc.xq=:ls_xq);
//生成课程的下拉列表框的列表项
DECLARE kcmccursor CURSOR FOR
SELECT bjkc.kcmc
FROM bjkc,banji
WHERE(bjkc.bjbh=banji.bjbh)and(banji.bjmc=:ls_bjmc)and
(bjkc.xq=:ls_xq)
GROUP BY bjkc.kcmc;
ddlb_3.reset()
OPEN kcmccursor;
FOR n=1 TO li_kcmc
FETCH NEXT kcmccursor INTO:ls_kcmc;
ddlb_3.additem(ls_kcmc)
NEXT
CLOSE kcmccursor;
end if
(4)【确定】按钮的Clicked事件脚本如下。
int li_xh,n
string ls_kcmc,ls_xq,ls_bjmc,ls_xh
ls_xq=ddlb_1.text
ls_bjmc=ddlb_2.text
ls_kcmc=ddlb_3.text
if ls_xq=""or ls_bjmc=""or ls_kcmc=""then
messagebox("提示选择项不能空!")
else
//用SQL语句插入所选班级每个学生的选定课程和学期的成绩记录
//成绩列为空值,由数据窗口输入
SELECT count(distinct xh)INTO:li_xh
FROM xsbj
WHERE xsbj.bjmc=:ls_bjmc;
DECLARE xhcursor CURSOR FOR
SELECT xh
FROM xsbj
WHERE xsbj.bjmc=:ls_bjmc;
OPEN xhcursor;
FOR n=1 TO li_xh
FETCH NEXT xhcursor INTO:ls_xh;
INSERT INTO"xscj"("xh
VALUES(:ls_xh,:ls_xq,:ls_kcmc,null);
NEXT
CLOSE xhcursor;
dw_1.retrieve(ls_xq,ls_bjmc,ls_kcmc)
end if
(5)【保存】按钮的Clicked事件脚本如下。
if dw_1.update(true,false)=1 then
dw_1.resetupdate()
commit;
cb_2.enabled=false
else
rollback;
messagebox("错误保存数据失败!")
end if
(6)【退出】按钮的Clicked事件脚本如下。
close(parent)
(7)数据窗口的Itemchanged事件脚本如下。
cb_2.enabled=true
2)设计查询学生个人成绩的窗口
查询学生个人成绩的窗口如图9.7所示。数据窗口控件连接的数据窗口对象为
d_xscj_grcx。
(1)【查询】按钮的Clicked事件脚本如下。
dw_1.settransobject(sqlca)
if sle_1.text=""or sle_2.text=""then
messagebox("提示学号和学期不能为空")
else
dw_1.retrieve(sle_1.text,sle_2.text)
cb_2.enabled=true
end if
(2)【打印】按钮的Clicked事件脚本如下。
dw_1.print(true)
(3)【另存为】按钮的Clicked事件脚本如下。
dw_1.saveas()
(4)【退出】按钮的Clicked事件脚本如下。
close(parent)
图9.7 个人成绩查询
3)设计查询班级成绩的窗口
查询班级成绩的窗口如图9.8所示。数据窗口控件的DataObject属性为d_xscj_bjcx。
图9.8 查询班级成绩信息
此窗口的Open事件脚本与输入成绩窗口的Open事件脚本相同,【打印】按钮【另存为】按钮和【退出】按钮的Clicked事件脚本略。【查询】按钮的Clicked事件脚本如下。
dw_1.settransobject(sqlca)
if sle_1.text=""or sle_2.text=""then
messagebox("提示学号和学期不能为空")
else
dw_1.retrieve(sle_1.text,sle_2.text)
cb_2.enabled=true
end if
4)设计查询课程成绩的窗口
查询课程成绩的窗口如图9.9所示。数据窗口控件的DataObject属性为d_xscj_kccx。
图9.9班级课程成绩查询
此窗口的Open事件脚本、“课程”的下拉列表框的Getfocus事件脚本与输入成绩窗口的对应事件脚本相同,【打印】按钮,【另存为】按钮和【退出】按钮的Clicked事件脚本略。
【查询】按钮的Clicked事件脚本如下。
dw_1.settransobject(sqlca)
if ddlb_1.text=""or ddlb_2.text=""or ddlb_3.text=""then
messagebox("提示班级、学期和课程不能为空")
else
dw_1.retrieve(ddlb_2.text,ddlb_1.text,ddlb_3.text)
cb_2.enabled=true
end if
十、系统的编译和发布
到此为止,系统的实现工作就完成了。在每个模块的实现过程中,对其每个功能要进
行仔细的测试和调试,最后对整个应用程序做系统的测试,在测试工作完成后可以进行应
用程序的编译和发布步骤如下。
1、创建工程对象
单击工具条上的【New】图标,打开【New】对话框,在对话框中选择【Project】标
签页,再选择【Application Wizard】图标,单击【Ok】按钮,开始工程的向导,最后出现,如图10.1所示的工程对象。
图10.1创建工程对象
2、编译生成可执行程序
单击工程画板工具条上的【Deploy】图标,开始编译过程。编译通过后,生成可执行
文件xscj.exe。
3、测试分布
对可执行程序做系统的测试,最后便可发布了。