1、(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窗口中新建了一个
2、用于连接数据库的窗口函数load_connect,函数脚本为:String Is_userid,Is_password,Is_database /定义形参/将实参的值赋给形参Is_userid=trim (userid)Is_password= (password)IF Is_password= THEN /输入密码非空 RETURN -1END IFSQLCA.DBMS=ODBCSQLCA.AutoCommit=FALSEIs_database=ConnectString=DSN=xscj;SQLCA.dbparm=Is_database+UID=+Is_userid+;PWD=+Is_pa
3、ssword+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) HALTELSE Close (PARENT) Open (w_main)保存并测试登录窗口(2)创建控制台窗口w_main放置了一个静态文本框,六个命令按纽,放置了背景图片并且将其
4、放在底部。按钮“退出”的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中的“查询子系统”命
5、令按钮的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 /将三维图形视角旋转3
6、3度gr_1.Spacing=150 /条形图数据之间距离为本条本身宽度的150%gr_1.AddCategory(第一学期) /设置分类轴第二学期第三学期第四学期第五学期第六学期第七学期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、,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窗口中
8、的“学生选课查询”命令按钮的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 xuehaoxu
9、ehao=Trim (sle_1.text)IF xuehao= THEN没有输入学号请输入正确的查询条件! ELSE dw_1.Retrieve (xuehao) END IF sle_1.SetFocus ()清除按钮的clicked事件:dw_1.ReSet ()sle_1.text= sle_1.SetFocus ()(3)编写窗口w_achievement的脚本 查询按钮clicked事件:String xh,kcxh=Trim (sle_1.text)kc=Trim (sle_2.text)IF xh= AND kc=非法的条件输入 dw_1.Retrieve (xh,kc) 清除
10、按钮clicked事件: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 s
11、qlda;m=sqlda.numoutputs /获取输出参数的个数,即Select中列的个数DO WHILE sqlca.sqlcode=0 /测试查询是否成功 str= /将查询结果变为一个串 FOR n=1 TO m /处理所有输出参数 CHOOSE CASE sqlda.outparmtypen /判断每个输出参数的类型 CASE typeinteger!,typedecimal!,TypeDouble! /输出参数为Integer,decimal,Double型 str=str+string (sqlda.getdynamicnumber(n) + CASE typestring!
12、/输出参数为String型 str=str+trim (sqlda.getdynamicstring(n) + CASE typedate! /输出参数为Date型 str=str+string (sqlda.getdynamicdate(n) + END CHOOSE NEXT lb_1.additem (str) /显示查询结果 FETCH mycur USING DESCRIPTOR sqlda;/处理下一条记录 LOOP CLOSE mycur; /关闭游标4 . 创建数据管理子系统的子窗口在基本窗口的基础上,通过继承的方式创建学生信息管理窗口w_stuupdata,在窗口上添加八个命
13、令按钮和一个静态文本控件和一个分组框控件。通过继承w_stuupdata创建w_course.在基本窗口w_base的 基础上通过继承的的方式创建窗口w_achieveupdata.窗口W_stuupdata图窗口W_course图窗口W_achieveupdata图5为数据管理的子系统的子窗口编写脚本,并建立各窗口之间的连接。创建帮助子系统的子窗口,并建立各窗口之间的连接及相应的脚本.(1)建立各窗口之间的连接A. 在窗口w_data中的“学生信息管理”命令按钮clicked的事件中编写代码:Open (w_stuupdata)B. 在w_data窗口中的“课程信息管理”命令按钮的click
14、ed事件中编写代码:Open (w_course)C. 在w_data窗口中的“学生成绩信息管理”命令按钮的clicked事件中编写代码:Open (w_achieveupdata)(2)编写窗口w_stuupdata的脚本OPEN事件:增加记录按钮cb_2的clicked事件:Long rowRow=dw_1.InsertRow(0)dw_1.SetRow(row)dw_1.ScrollToRow(row)dw_1.SetFocus()插入记录按钮cb_5的clicked事件:row=dw_1.InsertRow(dw_1.GetRow()删除记录按钮cb_4的clicked事件:dw_1.
15、DeleteRow(dw_1.GetRow()显示记录按钮cb_6的clicked事件:dw_1.Retrieve()更新记录按钮cb_3的clicked事件:dw_1.Update()dw_1.ReSet()返回按钮cb_1的clicked事件:close(parent)下一记录按钮cb_7的clicked事件:dw_1.ScrollNextRow()dw_1.SelectRow(dw_1.GetRow() -1,false)dw_1.SelectRow(dw_1.GetRow() ,true)上一记录按钮cb_8的clicked事件:dw_1.ScrollPriorRow()dw_1.Se
16、lectRow(dw_1.GetRow() +1,false)6创建数据窗口对象一共创建了5个数据窗口对象(1) 在w_stu的dw_1的数据窗口对象d_1(2)在w_select的dw_1的数据窗口对象d_2 (3)在W_achievement中新建了一个数据窗口d_3,主要用于XS_CJ表,KC表及XS中按学号和课程号检索学生的课程与成绩信息.(4)在窗口w_stuupdata中新建一个数据窗口对象d_4主要用于管理XS表中的信息。(5)在w_course窗口中新建一个数据窗口d_5对象,主要用于管表KC中的信息。7创建帮助子系统的子窗口,并建立各窗口之间的连接及编写相应的脚本(1)建立帮
17、助子系统的子窗口:在基本窗口的基础之上,通过继承的方式创建使用帮助窗口。(2)建立窗口之间的连接。 在窗口w_main中的“使用帮助”命令按钮clicked的事件中编写代码:Open (w_help)。8 . 创建数据通道系统的子窗口,并编写相应的脚本 窗口w_pipe图编写窗口w_pipe的脚本 (1)在窗口w_mian中的“数据通道”命令按钮clicked事件中编写代码: (2)创建服务器数据库cour_pro,并配置其数据源。创建两个数据管道:pipe_0,pipe_1。Pipe_0:将XSCJ数据库中的表XS中的数据上传到数据库cour_pro中以更新数据;Pipe_1:将cour_p
18、ro中的表stu中的数据下载到XSCJ数据库中。(3)在窗口w_pipe中定义函数Connectserver()表示连接服务器数据库、error(integer ret)错误处理、sartpipe(Transation sourcetrans, Transaction desttrans,string p_object)开始管道操作。(4)编写代码在窗口w_pipe中,声明以下InstanceVariables对象实例:/定义事务处理对象serverdb/serverdb用来连接服务器数据库Transaction serverdb/定义数据管道对象u_pipePipeline u_pipe在窗
19、口w_pipe的open事件中编写代码:/定义事务处理对象实例变量serverdbserverdb=Create Transaction/定义数据管道对象实例变量u_pipe=Create pipeline在窗口w_pipe的close事件中编写代码:/释放数据管道对象DESTROY u_pipe;/释放事务处理对象DISCONNECT USING sqlca;DESTROY sqlca;DISCONNECT USING serverdb;DESTROY serverdb;在“取消”命令的clicked事件中编写代码:Int retret=u_pipe.Cancel() /终止管道运行IF r
20、et=1 THEN MessageBox(取消操作成功终止管道运行ELSE 取消操作失败未能终止管道运行在“返回”命令按钮cb_return的clicked事件中编写代码:Close(PARENT)在连接服务器数据库的函数Connectserver()中编写代码:/该函数无参数,返回值为sqlcode/连接服务器数据库/这里为方便实验,选用了另一个本地库cour_proserverdb.autocommit=trueserverdb.DBMS = odbcserverdb.database = cour_proserverdb.userid = dbaserverdb.dbpass = sql
21、serverdb.servername = serverdb.logid=serverdb.logpass=serverdb.dbparm = CONNECTstring=dsn=stu;uid=dba;pwd=sqlCONNECT USING serverdb;RETURN serverdb.sqlcode在错误处理函数error(integer ret)中编写代码:/该函数的入口参数ret,表示执行数据管道操作返回的错误代码。/该函数无返回值。String msgCHOOSE CASE ret CASE -1 msg = 打不开数据管道 CASE -2 列数太多 CASE -3要创建的表已
22、经存在 CASE -4要增加数据的表不存在 CASE -5未建立与数据库的连接 CASE -6参数错误 CASE -7列不匹配 CASE -8访问源数据库的SQL语句致命错误 CASE -9访问目标数据库的SQL语句致命错误 CASE -10已经达到指定的最大错误数 CASE -12不正确的表语法 CASE -13需要关键字、但未指定关键字 CASE -15数据管道已经在运行 CASE -16源数据库出错 CASE -17目标数据库出错 CASE -18目标数据库处于只读状态,不能写入数据END CHOOSEMessageBox(数据管道运行出错, msg, StopSign!,ok!在执行管
23、道操作的函数startpipe(Transaction sourcetrans,Transaction desttrans,string p_object)中编写代码:/该函数有三个入口参数sourcetrans、desttrans、p_object/参数sourcetrans表示源事务处理对象/参数desttrans表示目标事务处理对象/参数p_object表示在数据库画板中创建的数据管道对象Integer retu_pipe.DataObject = p_object /设置数据管道对象ret=u_pipe.Start(sourcetrans, desttrans, w_pipe.dw_1
24、)IF ret 1 THEN error(ret) /转错误处理程序数据管道运行成功, 操作成功sle_2.text= String(u_pipe.RowsRead) /显示已读数据行数sle_1.text= String(u_pipe.RowsWritten) /显示已写数据行数sle_3.text= String(u_pipe.RowsInError) /显示出错数据行数 四、课程设计总结和体会在本次课程设计中通过学生管理系统实例介绍了用PowerBuilder开发数据库应用程序的过程,介绍了开发应用系统时的系统分析,功能设计,数据库设计以及数据库的实现,具体描述了实例中各种PowerBuilder对象的设计方法,较为系统、全面的总结了PowerBuilder的应用。个人在设计调试整个系统的时候遇到许多问题,并通过书上的解说和请教老师来解决我在设计时所面临的问题。本人从中学习到了很多知识,并在以后的学习中希望能学到很多,来完成自己所设计的系统。在这里衷心感谢王老师的耐心指导。