华北科技学院powerbuilder课程设计报告--学生成绩数据库管理系统2011-2012学年第1学期PowerBuilder程序设计(专业选修课)学号:姓名:班级:答辩情况:1、程序难易程度:难(),较难(),一般(),简单();2、程序工作量:大(),较大(),一般(),较小();3、基本操作:熟练(),较熟练(),一般(),不熟练(),极不熟练();4、代码理解:准确(),较准确(),一般(),不准确(),极不准确();平时成绩:优秀(),良好(),中等(),一般()总评成绩:任课教师:2012年12月5日学生成绩数据库管理系统一、系统结构设计XSCJ数据库中包含有三个表,XS表用来存放学生基本信息,KC表用来存放课程基本信息,XS—CJ表用来存放学生课程成绩信息。
根据学校教育管理的实际要求,可以设计以下主要的交互窗口:1.登陆窗口w_load2.控制台窗口w_main3.查询子系统窗口w_query4.数据管理子系统窗口w_data5.帮助系统窗口w_help其中查询子系统包括学生成绩查询,学生基本情况查询,学生选课信息查询和交互式查询。
而数据管理子系统窗口包括资源管理,数据的更新,数据的删除,数据插入等。
二、系统开发计划(1)检查系统硬件和软件环境是否符合要求。
(2)检查XSCJ数据库的三个样本数据表,观察是否满足系统的需求。
(3)为项目创建磁盘存储区域,并创建新的工作空间。
(4)逐一创建组成系统的各个模块。
(5)采用面向对象的方式,实现模块的可重用性。
(6)完成各个模块的代码,并进行单个模块的测试。
(7)进行整个系统的测试。
(8)生成可执行文件。
(9)软件发布。
整个系统的体系结构图如图1-1所示:图1.1三、设计步骤1.创建工作空间、应用与数据库表(1)启动PowerBuilder 10.0,创建工作空间和应用—project1(2)创建的ASA数据库XSCJ.db,数据源名称Xscj,创建xs数据表,kc数据表,xs_cj数据表,其结构如:表1 XS表结构表2 KC表结构表3 XS_CJ表结构2.新建主窗口对象(1)建一个主窗口w_load,在窗口上放置了三个静态文本,两个单行文本编辑框和两个命令按钮。
在w_load窗口中新建了一个用于连接数据库的窗口函数load_connect,函数脚本为:String Is_userid,Is_password,Is_database //定义形参//将实参的值赋给形参Is_userid=trim (userid)Is_password= (password)IF Is_password="" THEN //输入密码非空RETURN -1END IFSQLCA.DBMS="ODBC"SQLCA.AutoCommit=FALSEIs_database="ConnectString='DSN=xscj;"SQLCA.dbparm=Is_database+"UID="+Is_userid+";PWD="+Is_password+"'" CONNECT USING SQLCA; //与数据库连接RETURN sqlca.SQLCode定义cb_ok中的Click事件的脚本为:SetPointer (hourglass!)IF PARENT.load_connect (sle_userid.text,sle_password.text)=-1 THEN MessageBox ("连接数据库错误","连接失败"+sqlca.sqlerrtext) HALTELSEClose (PARENT)Open (w_main)END IF保存并测试登录窗口(2)创建控制台窗口w_main放置了一个静态文本框,六个命令按纽,放置了背景图片并且将其放在底部。
按钮“退出”的Clicked事件的脚本为:Close (PARENT) (3)创建了一个新选单,该选单的树型结构如下图并且编写各个选单按钮的脚本。
(4)创建子系统的基本窗口并利用继承关系派生出各子系统的窗口1.创建基本窗口w_base,设置窗口的WindowsType类型为midhelp!、MenuName=manue,其他属性采用系统默认。
2.在w_base的基础上,通过继承的方式创建子系统窗口w_query,w_data,w_help,w_pipe,w_statistic.分别在子系统窗口上添加控件。
编辑完成后的窗口如下图。
窗口W_query图在窗口w_main中的“查询子系统”命令按钮的clicked事件中编写代码:Open(w_query)保存所做工作,运行应用程序进行测试。
窗口W_data图在窗口w_main中的“数据管理子系统”命令按钮的clicked事件中编写代码:Open(w_data)保存所做工作,运行应用程序进行测试。
窗口W_help图在窗口w_main中的“帮助子系统”命令按钮的clicked事件中编写代码:Open(w_help)保存所做工作,运行应用程序进行测试。
窗口W_pipe图在窗口w_main中的“数据通道”命令按钮的clicked事件中编写代码:Open(w_pipe)保存所做工作,运行应用程序进行测试。
窗口W_statistic图在窗口w_statistic的Open事件中输入一下脚本:gr_1.Elevation=33 //将三维图形视角旋转33度gr_1.Spacing=150 //条形图数据之间距离为本条本身宽度的150%gr_1.AddCategory("第一学期") //设置分类轴gr_1.AddCategory("第二学期")gr_1.AddCategory("第三学期")gr_1.AddCategory("第四学期")gr_1.AddCategory("第五学期")gr_1.AddCategory("第六学期")gr_1.AddCategory("第七学期")gr_1.AddSeries("计算机基础") //设置系列轴gr_1.AddSeries("程序设计语言")gr_1.AddSeries("数据结构")gr_1.AddSeries("操作系统")gr_1.AddSeries("程序设计与语言")gr_1.AddSeries("计算机原理")gr_1.AddSeries("数据库原理")gr_1.AddSeries("软件工程")gr_1.AddData(1,80,1) //添加数据gr_1.AddData(2,68,2)gr_1.AddData(4,68,5)gr_1.AddData(5,68,6)gr_1.AddData(6,85,5)gr_1.AddData(7,68,7)gr_1.AddData(9,51,7)在窗口w_main中的“统计分析”命令按钮的clicked事件中编写代码:Open(w_statistic)保存所做工作,运行应用程序进行测试。
(5)创建查询子系统的子窗口在w_base基本窗口的基础上,通过继承的方式创建w_stu,w_select,w_achievement,w_custom。
分别添加控件!窗口W_stu图窗口W_select图窗口W_achievement图窗口W_custom图3.为查询子系统的字窗口编写脚本,并建立各窗口之间的联接。
(1)建立各窗口之间的连接A.在窗口w_query中的“学生基本信息查询”命令按钮clicked的事件中编写代码:Open (w_stu)B.在w_query窗口中的“学生选课查询”命令按钮的clicked事件中编写代码:Open (w_select)C.在w_query窗口中的“学生成绩查询”命令按钮的clicked事件中编写代码:Open (w_achievement)D.在w_query窗口中的“自定义查询”命令按钮的clicked事件中编写代码:Open (w_custom)E.在窗口w_main中的“查询子系统”命令按钮的clicked事件中编写代码:Open (w_query)(2)编写窗口s_tu的脚本OPEN事件:dw_1.SetTransObject (SQLCA)查询按钮的clicked事件:String xuehaoxuehao=Trim (sle_1.text)IF xuehao="" THENMessageBox ("没有输入学号","请输入正确的查询条件!") ELSEdw_1.Retrieve (xuehao)END IFsle_1.SetFocus ()清除按钮的clicked事件:dw_1.ReSet ()sle_1.text=" "sle_1.SetFocus ()(3)编写窗口w_achievement的脚本OPEN事件:dw_1.SetTransObject (SQLCA)查询按钮clicked事件:String xh,kcxh=Trim (sle_1.text)kc=Trim (sle_2.text)IF xh="" AND kc="" THENMessageBox ("非法的条件输入","请输入正确的查询条件!") ELSEdw_1.Retrieve (xh,kc)END IFsle_1.SetFocus ()清除按钮clicked事件:dw_1.ReSet ()sle_1.text=""sle_1.text=""sle_1.SetFocus()(4)编写定义查询窗口w_custom的脚本命令按钮:Int m,nString mysql,strmysql=mle_1.text //读取查询语句lb_1.reset () //重置Ib_1DECLARE mycur DYNAMIC CURSOR FOR sqlsa;PREPARE sqlsa FROM : mysql USING sqlca;DESCRIBE sqlsa INTO sqlda;OPEN DYNAMIC mycur USING DESCRIPTOR sqlda;FETCH mycur USING DESCRIPTOR sqlda;m=sqlda.numoutputs //获取输出参数的个数,即Select中列的个数DO WHILE sqlca.sqlcode=0 //测试查询是否成功str="" //将查询结果变为一个串FOR n=1 TO m //处理所有输出参数CHOOSE CASE sqlda.outparmtype[n] //判断每个输出参数的类型CASE typeinteger!,typedecimal!,TypeDouble!//输出参数为Integer,decimal,Double型 str=str+string (sqlda.getdynamicnumber(n)) +""CASE typestring! //输出参数为String型str=str+trim (sqlda.getdynamicstring(n)) +""CASE typedate! //输出参数为Date型str=str+string (sqlda.getdynamicdate(n)) +""END CHOOSENEXTlb_1.additem (str) //显示查询结果FETCH mycur USING DESCRIPTOR sqlda;//处理下一条记录LOOPCLOSE mycur; //关闭游标4 . 创建数据管理子系统的子窗口在基本窗口的基础上,通过继承的方式创建学生信息管理窗口w_stuupdata,在窗口上添加八个命令按钮和一个静态文本控件和一个分组框控件。