科研管理系统毕业论文
摘 要
科研管理系统是面向山东大学计算机科学与技术学院开发的用于科
研项目信息管理的系统,主要用于管理学院的科研成果。系统使用PowerBuilder 6.5开发, 数据库为Oracle ,采用C/S体系结构。系统设计的目标主要是让使用人员能高效率的完成科研项目信息以及教师基本信息的规范化管理,并达到操作过程中的直观、方便、实用和安全的要求:为了使用户操作起来更加方便,增设了工具栏;考虑到用户对教师的名字并不是很清楚,在教师信息查询中,特设了按姓氏查询和按姓名拼音的首字母查询;为了防止用户误删一些数据,在用户对数据删除前,都对用户操作进行提示。在系统开发过程中用到的关键技术有:自动生成序列号,自动生成拼音码,模糊查询,以及查询结果排序以及窗口居中显示等。
目 录
一.前 言 ··································································(1) 二.正 文 ··································································(1)
(一)系统简介·························································(1) (二)功能简介·························································(2) (三)开发工具以及开发环境简介·······························(3) (四)数据库设计·····················································(4) (五)系统的源代码··················································(5) (六)开发中的难点和关键技术··································(24)
三.结 论 ·································································(27) 四.谢 辞 ·································································(27) 五.参考文献·································································(28)
科 研 管 理 系 统
(一) 前 言
科研信息管理是高校管理工作中的重要组成部分,随着信息技术的发展和广泛应用,利用计算机实现高校中的教师信息管理和科研项目信息管理势在必行。科研管理系统是山东大学计算机科学与技术学院98级毕业实习题目之一,由闫中敏老师指导,侯素玲和王澄澄共同开发。本系统用于管理山东大学计算机科学与技术学院科研成果,主要实现两部分功能:科研项目管理以及教师基本信息管理。其中,科研项目管理部分由王澄澄负责完成。下面,谨就整个系统功能、结构和教师基本信息管理开发过程中的一些问题进行详细阐述。
(二)正 文
一. 系统简介
1. 系统目标设计
科研管理系统可以用于支持学院完成科研管理工作,有如下3个方面的目标:
● 使科研信息管理实现规范化;
● 使管理人员高效率完成科研管理的日常业务,包括新项目加入时资
料的建立,项目完成时相关信息的删除等;
● 将规定日期之前的科研项目查询出来,及时通知各项目负责人。 2. 开发设计思想
● 系统应符合科研信息管理的规定,满足科研管理工作的需要,并达
到操作过程中的直观、方便、实用、安全等要求。
● 系统采用C/S体系结构,客户端负责提供表达逻辑、显示系统界面
信息,访问数据库服务器;服务器端负责提供数据。
● 系统采用模块化程序设计方法,既便于系统功能的各种组合和修改,
又便于未参与开发的技术维护人员补充、维护。
● 系统应具备数据库维护功能,及时根据用户需求进行数据的添加、
删除、修改等操作。
二.功能简介
现将系统功能详细介绍如下: 1. 功能分析
科研管理系统主要完成如下功能:
● 教师信息的输入,包括教师姓名,家庭电话、办公电话、Email 、手机、
备注等;教师编号和拼音码自动生成。 ● 教师信息的修改、删除等日常维护。
● 按照某种条件,查询、统计符合条件的教师信息。
● 科研项目信息的输入,项目名称,项目分类,项目负责人,截止日期,
备注。
● 科研项目维护:包括信息浏览、删除记录、修改记录、以及保存所作修
改等。浏览项目信息时可以点击相应记录查看项目负责人信息。 ● 按照某种条件,查询、统计符合条件的项目信息。 2.系统模块图
在系统功能分析的基础上,考虑PowerBuilder 程序编制的特点,得到如图所示的功能模块图:
● 系统模块:包括
✧ 登陆系统; ✧ 退出系统
● 教师信息管理模块:包括
✧ 教师信息录入 ✧ 教师信息维护
✧ 教师信息查询
● 科研项目信息管理模块:包括
✧ 科研项目信息录入 ✧ 科研项目信息维护 ✧ 科研项目信息查询 ● 帮助模块 :
✧ 关于系统的版权信息
三.开发工具以及开发环境简介 ● PowerBuilder 简介
PowerBuilder 是Sybase 的子公司PowerSoft 推出的数据库应用开发工具,能够设计传统的高性能、基于客户/服务器体系结构的应用系统。 PowerBuilder 支持应用系统同时访问多种数据库,包括诸如Oracle 、此外,PowerBuilder 开发环境随带的Sybase SQL Anywhere本身就是一个功能强大的DBMS ,对小型应用来说,直接使用这个数据库就是个质优价廉的选择。
为了方便用户开发,PowerBuilder 提供了大量控件,这既丰富了应用程序的表达能力,也加快了项目的开发进度。PowerBuilder 是面向对象的编程,数据窗口是PowerBuilder 中功能最强大的一个对象,通过它可以操作数据库中的数据,并对数据进行各种处理,例如排序分组等,可以设计数据输入输出格式以及统计图表和多种屏幕显示风格是PowerBuilder 成为客户/服务器体系数据库开发领先地位的一个重要原因。PowerBuilder 支持多种平台,并能生成机器代码的可执行文件。 ● Oracle 简介
Oracle 数据库管理系统是目前世界上最流行的关系数据库管理系统之一,是以高级结构化查询语言(SQL)为基础的大型关系数据库。相对于其他数据库,Oracle 在性能、系统可靠性、分布式处理能力等方面有独特的优越性,并在数据库管理功能、数据完整性控制、数据库查询能力、数据安全性等方面都有重大改善。
Oracle 数据库在物理上是存储于硬盘的各种文件,它是活动的,可
扩充的,随着数据的添加和应用程序的增大而变化。Oracle 数据库在逻辑上是由许多表空间构成,主要分为系统表空间和非系统表空间。非系统表空间内存储着各项应用的数据、索引、程序等相关信息。 ● 开发环境
硬件环境:PC 机一台,主频1.7GHz,128M 内存,服务器为202.194.23.2 软件环境:操作系统为Windows2000, 数据库管理系统为Oracle7.3, 开
发工具为PowerBuilder 6.5。
四. 数据库设计
● 数据库分析
通过对高校教师管理和项目管理内容和过程的分析,设计数据项和数据结构如下:
教师基本情况。包括有教师编号、教师姓名、家庭电话、办公电话、手机、Email 、拼音、备注。
项目基本情况。包括有项目编号、项目名称、项目分类、负责人、截止
日期、备注。
教师实体和项目实体之间的关系:教师担任项目负责人。 ● 数据库结构
表1: tab_teacher 教师基本信息表(主关键字 teacher_id)
表2: tab_project项目基本信息表(主关键字project_id)
五. 系统的源代码
1. 创建应用程序对象 a_ky
PowerBuilder 中应用程序对象是应用程序的系统入口。应用程序首先运行的脚本就是应用程序对象的open 事件。
在应用对象的open 事件中输入如下的程序代码: SQLCA.DBMS = "O73 ORACLE 7.3" SQLCA.LogPass = "******" SQLCA.ServerName = "@ORAC" SQLCA.LogId = "ky" SQLCA.AutoCommit = False SQLCA.DBParm = "" connect;
Open(w_login) //打开程序登陆窗口
在应用程序对象的变量定义窗口中定义科研管理系统的两个全局变量:
string teacher_id string project_id
2.登陆窗口w_login的设计
果连接成功,则打开应用程序主窗口,关闭登陆窗口;如果不成功,则会弹出一个对话框,显示用户输入有误。其clicked 事件脚本如下:
按钮【确认】的功能是利用用户输入的用户名和口令来连接数据库。如
if sle_1.text = "" then
//pop a message box
messagebox("注意!"," 用户名不能为空!") //sle_1 get the focus sle_1.setfocus()
elseif sle_2.text = "" then
//pop a message box
messagebox("注意!"," 密码不能为空!") //sle_2 get the focus sle_2.setfocus()
else
//get the user name and password SQLCA.LogID = sle_1.text SQLCA.LogPass = sle_2.text //connect the database connect; //deal with error
if SQLCA.SQLCODE=0 then
open(w_main) close(w_login)
else
MESSAGEBOX("警告"," 输入有误!") sle_1.setfocus()
end if end if
● 按钮【退出】的功能是终止应用程序的运行,其clicked 事件脚本如下:
halt
3.主窗口对象w_main
系统应用程序的主要功能都是在主窗口w_main及在其下打开的众多窗口中完成的。主窗口的类型设立为MDI Frame with Microhelp是为了在其下以特定方式打开其他窗口。主窗口的运行界面如下
:
4.菜单对象m_mdimain的设计 4.1菜单“系统”
● “重新登陆”的clicked 事件的脚本:
disconnect; open(w_login) close(w_main)
其功能是先断开与数据库的连接,打开登陆窗口,关闭应用程序主窗口。
● “退出系统”的clicked 事件的脚本:
close(w_main)
其功能是关闭主窗口w_main。 4.2菜单“教师信息管理”
● “教师信息输入”的clicked 事件的脚本: opensheet (w_insert_teacher,w_main,4,layered!)
其功能是在主窗口w_main上以平铺方式层叠打开窗口w_insert_teacher,并指定在第四个菜单(‘窗口’菜单)标题下增加一个以w_insert_teacher命名的菜单。
● “教师信息维护”->“逐条浏览”的clicked 事件的脚本:
opensheet (w_weihu_teacher_free,w_main,4,layered!)
其功能是在主窗口w_main上以平铺方式层叠打开窗口w_weihu_teacher_free,并指定在第四个菜单(‘窗口’菜单)标题下增加一个以w_weihu_teacher_free命名的菜单。
● “教师信息维护”->“表格浏览”的clicked 事件的脚本:
opensheet (w_weihu_teacher,w_main,4,layered!)
其功能是在主窗口w_main上以平铺方式层叠打开窗口w_weihu_teacher,并指定在第四个菜单(‘窗口’菜单)标题下增加一个以w_weihu_teacher命名的菜单。 ● “教师信息查询”的clicked 事件的脚本:
opensheet (w_lookfor_teacher,w_main,4,layered!)
其功能是在主窗口w_main上以平铺方式层叠打开窗口w_lookfor_teacher,并指定在第四个菜单(‘窗口’菜单)标题下增加一个以w_lookfor_teacher命名的菜单。 4.3 菜单“项目信息管理” 见王澄澄毕业论文 4.4 菜单“窗口”
● 菜单“窗口” -> “层叠”的clicked 事件的脚本:
w_main.ArrangeSheets(Cascade!)
其功能是将所有打开的窗口以层叠的方式排列。 ● 菜单“窗口”->“平铺”的clicked 事件的脚本:
w_main.ArrangeSheets(Layer!)
其功能是将所有打开的窗口以平铺的方式排列。 4.5菜单“帮助”
● “关于”的clicked 事件的脚本:
Open(w_about_keyan)
其功能是打开帮助窗口w_about_keyan。
5. 数据窗口对象的创建
在应用程序中,根据需要共创建了三个数据窗口:
● 数据窗口d_teacher_insert,选择Quick Select数据源、Freedom 形式,连
接表Tab_teacher,与窗口w_insert_teacher关联。
● 数据窗口d_teacher_grid,选择SQL Select 数据源,Grid 形式,连接表
Tab_teacher,与窗口w_lookfor_teacher和w_weihu_teacher关联。 ● 数据窗口d_teacher, 选择Quick Select 数据源、Freedom 形式,连接表
Tab_teacher,与窗口w_weihu_teacher_free关联。 6. 窗口对象w_insert_teacher
此窗口功能是实现教师信息的录入,由主窗口的“教师信息管理”菜单的“教师信息录入”调用。运行界面如下: ● 窗口w_insert的open 脚本
dw_insert_teacher.settransobject(sqlca) dw_insert_teacher.retrieve() long row_number
w_insert_teacher.dw_insert_teacher.reset()
row_number=insertrow(w_insert_teacher.dw_insert_teacher,0)
【保存】按钮控件的clicked 事件用于对输入信息进行保存,若保存失
败,系统会给予提示。脚本如下:
string vxm,vxmpy string vhm
select to_char(ky.teacher_shunxuhao.nextval) into :vhm from dual;
if sqlca.sqlcode0 then
messagebox("错误!!!"," 生成顺序号失败!") return
end if
dw_insert_teacher.SetItem(1,'teacher_id',vhm) dw_insert_teacher.SetFocus()
vxm=dw_insert_teacher.getitemstring(1,'teacher_name') select getpy(:vxm) into :vxmpy from dual;
if sqlca.sqlcode0 then
messagebox("错误!!!"," 生成拼音失败!") return
end if
dw_insert_teacher.setitem(1,'teacher_spell',vxmpy)
if update(w_insert_teacher.dw_insert_teacher,true,false)=1 then
//保存修改成功,提交修改
w_insert_teacher.dw_insert_teacher.resetupdate() commit;
w_insert_teacher.dw_insert_teacher.reset()
row_number=insertrow(w_insert_teacher.dw_insert_teacher,0) else
//保存修改失败,取消所作的修改 rollback;
//弹出一个对话框警告
messagebox("错误!!!"," 数据保存失败!")
end if
【退出】按钮控件的clicked 事件用于关闭该输入窗口。在关闭窗口之
前,首先判断用户是否对数据窗口中的记录做了修改而没有保存到数据库中,如果又这样的记录,则出现对话框询问用户是否保存所作的修改,脚本如下:
int MCount //修改后没有保存的行数 int UpdateOrNot //是否修改 //得到修改后没有保存的行数
MCount=w_insert_teacher.dw_insert_teacher.ModifiedCount() if MCount=0 then
//没有未保存的修改
close(w_insert_teacher) elseif Mcount>0 then
//询问是否保存所做的修改
UpdateOrNot=MessageBox("保存修改"," 您修改了数据窗口中的数据,现在是否保存?",Question!,YesNoCancel!)
if UpdateOrNot=1 then
//保存
if update(w_insert_teacher.dw_insert_teacher,true,false)=1 then
//保存修改成功,提交修改
w_insert_teacher.dw_insert_teacher.resetupdate() commit;
close(w_insert_teacher)
else
//保存修改失败,取消所作的修改 rollback;
//弹出一个对话框警告
messagebox("错误!!!"," 数据保存失败!")
end if
elseif UpdateOrNot=2 then
//不保存 rollback;
close(w_insert_teacher)
end if
end if
7. 窗口对象w_weihu_teacher
此窗口实现教师信息的表格浏览,由主窗口的“教师信息管理”菜单的“教师信息维护”的“表格浏览”调用,可对信息进行修改、删除等操作。 运行界面如下:
. 数据窗口的clicked 事件,其功能是单击标题栏时实现对教师信息排序。
脚本如下:
string col_name //列名 string col_text //列标题 int length
//列标题长度
if sortway=" d" then //sortway 实例变量
sortway=" a"
else
sortway=" d"
end if
col_text=dwo.name; length=len(col_text);
col_name=left(col_text,length - 2) if not isnull(col_name) then
if dw_weihu_teacher.setsort(col_name+sortway)=1 then
dw_weihu_teacher.sort()
//dwo系统变量
end if
end if
● 【保存】按钮控件的clicked 事件用于对修改厚的信息进行保存,若保
存失败,系统会给予提示。脚本如下:
if update(w_weihu_teacher_free.dw_weihu_teacher_free,true,false)=1 then
//保存修改成功,提交修改
w_weihu_teacher_free.dw_weihu_teacher_free.resetupdate() commit;
else
//保存修改失败,取消所作的修改 rollback;
//弹出一个对话框警告
messagebox("错误!!!"," 数据保存失败!")
dw_weihu_teacher_free.retrieve() end if
● 【删除】按钮控件的clicked 事件用于删除当前光标所在的那条记录。
如果该教师是某项目负责人,则根据参照完整性规则,该记录不能被删除。脚本如下: long current_rownumber int UpdateOrNot //是否删除
//询问是否确定删除
UpdateOrNot=MessageBox("删除记录?"," 您确定要删除数据窗口中的数据?",Question!,YesNo!)
if UpdateOrNot=1 then //删除
current_rownumber=w_weihu_teacher.dw_weihu_teacher.getrow()
deleterow(w_weihu_teacher.dw_weihu_teacher,current_rownumber) if update(w_weihu_teacher.dw_weihu_teacher,true,false)=1 then
//保存修改成功,提交修改
w_weihu_teacher.dw_weihu_teacher.resetupdate() commit;
else
rollback;
//弹出一个对话框警告
messagebox("错误!!!"," 数据删除失败!") dw_weihu_teacher.retrieve()
end if
elseif UpdateOrNot=2 then
//不删除 //rollback;
end if
【退出】按钮控件的clicked 事件用于关闭该窗口。在关闭窗口之前,
首先判断用户是否对数据窗口中的记录做了修改而没有保存到数据库中,如果又这样的记录,则出现对话框询问用户是否保存所作的修改。脚本如下:
int MCount //修改后没有保存的行数 int UpdateOrNot //是否修改 //得到修改后没有保存的行数 dw_weihu_teacher.acceptText()
MCount=w_weihu_teacher.dw_weihu_teacher.ModifiedCount() if MCount=0 then
//没有未保存的修改 close(w_weihu_teacher) elseif Mcount>0 then
//询问是否保存所做的修改
UpdateOrNot=MessageBox("保存修改"," 您修改了数据窗口中的数据,现在是否保存?",Question!,YesNoCancel!)
if UpdateOrNot=1 then
//保存
if update(w_weihu_teacher.dw_weihu_teacher,true,false)=1 then
w_weihu_teacher.dw_weihu_teacher.resetupdate() commit;
close(w_weihu_teacher)
else
//保存修改失败,取消所作的修改 rollback;
//弹出一个对话框警告
messagebox("错误!!!"," 数据保存失败!") dw_weihu_teacher.retrieve()
end if
elseif UpdateOrNot=2 then
//不保存 rollback;
close(w_weihu_teacher)
end if
end if
8. 窗口对象w_weihu_teacher_free
此窗口实现教师信息的逐条浏览,由主窗口的“教师信息管理”菜单的“教师信息维护”的“逐条浏览”调用,可对信息进行修改、删除等操作。运行界面如下:
● 按钮控件【第一条】的clicked 事件用于显示第一条教师信息。脚本如
下:
w_weihu_teacher_free.ScrollToRow(0)
● 按钮控件【前一条】的clicked 事件用于显示当前记录的前一条记录,
脚本如下:
integer row_current //定义参数当前行行数 //数据窗口向前滚动一条纪录
row_current=dw_weihu_teacher_free.ScrollPriorRow() //如果已经到达第一条纪录,则弹出一个对话框警告 if row_current=1 then
MessageBox("警告!"," 已经是最前一条记录!")
end if
● 按钮控件【后一条】的clicked 事件用于显示当前记录的后一条记录,
脚本如下:
integer row_count //定义参数 表的总行数 integer row_current //定义参数 当前行 //数据窗口向后滚动一条纪录
row_current=dw_weihu_teacher_free.ScrollNextRow()
//得到表的总行数
row_count=dw_weihu_teacher_free.RowCount() //判断是否是最后一条记录 if row_current= row_count then
MessageBox("警告!"," 已经是最后一条记录!") end if
● 按钮控件【最后一条】的clicked 事件用于显示最后一条教师记录。脚
本如下:
//定义参数 表的总行数 integer row_count //得到表的总行数
row_count=dw_weihu_teacher_free.RowCount() //数据窗口滚动到表的最后一条记录
dw_weihu_teacher_free.ScrollToRow(row_count)
● 按钮控件【删除】的clicked 事件用于删除当前所显示的那条记录。脚
本如下:
long current_rownumber int UpdateOrNot //是否删除
//询问是否确定删除
UpdateOrNot=MessageBox("删除记录?"," 您确定要删除数据窗口中的数据?",Question!,YesNo!)
if UpdateOrNot=1 then //删除
current_rownumber=w_weihu_teacher_free.dw_weihu_teacher_free.getrow() deleterow(w_weihu_teacher_free.dw_weihu_teacher_free,current_rownumber) if update(w_weihu_teacher_free.dw_weihu_teacher_free,true,false)=1 then
//保存修改成功,提交修改
w_weihu_teacher_free.dw_weihu_teacher_free.resetupdate() commit;
else
//保存修改失败,取消所作的修改 rollback;
//弹出一个对话框警告
messagebox("错误!!!"," 数据删除失败!") dw_weihu_teacher_free.retrieve()
end if
elseif UpdateOrNot=2 then
//不删除 //rollback;
end if
● 按钮控件【保存修改】的clicked 事件用于提交和确认对该数据库表格
中记录所作的修改,如果提交失败,则取消修改。脚本如下: if update(w_weihu_teacher_free.dw_weihu_teacher_free,true,false)=1 then
//保存修改成功,提交修改
w_weihu_teacher_free.dw_weihu_teacher_free.resetupdate() commit; else
//保存修改失败,取消所作的修改 rollback;
//弹出一个对话框警告
messagebox("错误!!!"," 数据保存失败!")
dw_weihu_teacher_free.retrieve() end if
● 按钮控件【退出】的clicked 事件用于关闭该窗口。在关闭窗口之前,
首先判断用户是否对数据窗口中的记录做了修改而没有保存到数据库中,如果又这样的记录,则出现对话框询问用户是否保存所作的修改。脚本如下:
int MCount //修改后没有保存的行数 int UpdateOrNot //是否修改
//得到修改后没有保存的行数 dw_weihu_teacher_free.acceptText()
MCount=w_weihu_teacher_free.dw_weihu_teacher_free.ModifiedCount() if MCount=0 then
//没有未保存的修改 close(w_weihu_teacher_free)
elseif Mcount>0 then
//询问是否保存所做的修改
UpdateOrNot=MessageBox("保存修改"," 您修改了数据窗口中的数据,现在是否保存?",Question!,YesNoCancel!)
if UpdateOrNot=1 then
//保存
if update(w_weihu_teacher_free.dw_weihu_teacher_free,true,false)=1 then
//保存修改成功,提交修改
w_weihu_teacher_free.dw_weihu_teacher_free.resetupdate() commit;
close(w_weihu_teacher_free)
else
//保存修改失败,取消所作的修改 rollback;
//弹出一个对话框警告
messagebox("错误!!!"," 数据保存失败!") dw_weihu_teacher_free.retrieve()
end if
elseif UpdateOrNot=2 then
//不保存 rollback;
close(w_weihu_teacher_free)
end if end if
9. 窗口w_lookfor_teacher
此窗口实现教师信息的查询,由主窗口的“教师信息管理”菜单的“教师信
息查询”调用,可以按姓名查询、按教师编号查询、按拼音查询、姓氏查询。运行界面如下:
● 窗口w_lookfor_teacher 的open 事件脚本如下:
dw_lookfor_teacher.SetTransObject(sqlca) //第一个下拉式列表框控件得到焦点 ddlb_1.setfocus()
dw_lookfor_teacher.retrieve()
//获取数据窗口中最初的SQL Select语句 oldsql=dw_lookfor_teacher.getsqlselect()
● 按钮控件【查询】根据用户所选择查询列、查询符号、输入的查询内容,
形成一个条件查询语句newsql ,使用select 查询条件过滤数据窗口,其clicked 事件脚本如下:
string lookforItem1 //定义参数:要查询的列 string lookforHow1 //定义参数:查询的符号 string lookforWhat1
//定义参数:查询的内容
//设置数据窗口为最初条件
dw_lookfor_teac7her.setsqlselect(oldsql)
dw_lookfor_teacher.retrieve() //查询符号的选择
lookforHow1=ddlb_2.text
//查询字段1和查询内容1的选择 if ddlb_1.text="教师编号" then lookforItem1="teacher_id" lookforwhat1="'"+sle_1.text+"'"
elseif ddlb_1.text="教师姓名" then
lookforItem1="teacher_name" lookforwhat1="'"+sle_1.text+"'"
elseif ddlb_1.text="拼音" then lookforItem1="teacher_spell"
lookforWhat1="'"+sle_1.text+"'"
end if string wheresql string newsql //查询条件的综合
if ddlb_1.text="" or ddlb_2.text="" then //用户没有输入查询条件 else //用户输入一个查询条件 wheresql="where tab_teacher."&
+lookforItem1+lookforHow1+""+lookforwhat1+""
//合成新的SQL Select语句 newsql=oldsql+wheresql //数据窗口进行查询
dw_lookfor_teacher.setsqlselect(newsql) dw_lookfor_teacher.retrieve() end if
//以下对查询结果进行统计 int i_totalrow
i_totalrow=dw_lookfor_teacher.retrieve()
if i_totalrow=-1 then
st_msg.text="查询失败。"
else
st_msg.text="查询出了"+string(i_totalrow)+"条记录符合条件."
end if
● 按钮控件【退出】用于退出教师信息查询窗口,其clicked 事件脚本如
下:
close(w_lookfor_teacher)
● 数据窗口dw_lookfor_teacher的clicked 事件用于实现对查询结果进行排
序。脚本如下:
string col_name //列名 string col_text //列标题 int length
//列标题长度
if sortway=" d" then //sortway 实例变量
sortway=" a"
else
sortway=" d"
end if
col_text=dwo.name; length=len(col_text);
col_name=left(col_text,length - 2) if not isnull(col_name) then
dw_lookfor_teacher.sort()
//dwo系统变量
end if
end if
9. 窗口对象w_about_keyan
窗口W_about_keyan用于显示系统的版权信息,由主窗口的“帮助”菜单调用。运行界面如下:
● 窗口W_about_keyan的open 事件脚本,以下脚本使窗口居中显示:
Environment l_env int l_ScrWidth,l_ScrHeight setredraw(false) //关闭窗口刷新 //取得屏幕的高度和宽度 getEnvironment(l_env)
l_ScrWidth=PixelsToUnits(l_env.ScreenWidth,XpixelsToUnits!) l_ScrHeight=PixelsToUnits(l_env.ScreenHeight,YpixelsToUnits!) //移动窗口到屏幕中间
Move((l_scrwidth - this.width)/2,(l_scrheight - this.height)/2) //打开窗口刷新 setredraw(true)
六.开发中的难点和关键技术
● 自动生成拼音码
为了减少录入时的工作量,开发中在录入教师信息时,采用了自动生成拼音码技术,具体实现如下: 1.在sqlplus 中执行
create or replace function getpy( chnstr in char) return varchar2 Is pytable long; no integer;
py varchar2 (200); str varchar2(200); pyi integer; ch1 varchar2(2); len integer; begin
pytable:= 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
||'aaaabbbbbbbbbbbbbbbbbbbbbbbbbbbb'
······
||'?????????????????????????????????';
//限于篇幅,pytable 从略。 str:=chnstr; pyi:=1; py:='';
len:=length(str); while pyi
ch1:=substr(str,pyi,1); pyi:=pyi+1;
if ascii(ch1)>=176 then
no:=ascii(ch1)-16704-162*trunc(ascii(ch1)/256); if no>0 then
py:=py||substr(pytable,no,1); end if; else
if ascii(ch1)>32 and ascii(ch1)='A' and ch1
end if; end loop; return (rtrim(py)); end;
drop public synonym getpy;
create public synonym getpy for si0001.getpy; grant execute on getpy to public;
2.在输入教师信息窗口的【保存】按钮中输入如下代码:
string vxm,vxmpy
vxm=dw_insert_teacher.getitemstring(1,'teacher_name') select getpy(:vxm) into :vxmpy from dual;
if sqlca.sqlcode0 then
messagebox("错误!!!"," 生成拼音失败!") return
end if
dw_insert_teacher.setitem(1,'teacher_spell',vxmpy)
姓氏查询
不同于按教师编号、按姓名查询,姓氏查询属于模糊查询之列,其具体方法如下:
1. 定义实例变量 string oldsql;
2. 在窗口w_lookfor_teacher 的open 事件输入如下脚本:
//获取数据窗口中最初的SQL Select语句 oldsql=dw_lookfor_teacher.getsqlselect()
3. 【姓氏查询】按钮的clicked 事件脚本:
//设置数据窗口为最初条件
dw_lookfor_teacher.setsqlselect(oldsql) dw_lookfor_teacher.retrieve() string wheresql string newsql
//设置模糊查询的WHERE 条件
wheresql="where tab_teacher.teacher_name like '"+sle_2.text+"%'" //合成新的SQL Select语句 newsql=oldsql+wheresql //数据窗口进行查询
dw_lookfor_teacher.setsqlselect(newsql) dw_lookfor_teacher.retrieve() //以下对查询结果进行统计 int i_totalrow
i_totalrow=dw_lookfor_teacher.retrieve() if i_totalrow=-1 then
st_msg.text="查询失败。" else
st_msg.text="查询出了"+string(i_totalrow)+"条记录符合条件." end if
三. 结 论
科研管理信息系统是一个小型的应用系统,开发时间大约用了6个周的时间。该系统具有一定的实用价值,将应用程序生成可执行文件可以脱离开发环境运行。因作者水平有限,实习时间较短,不足之处在所难免,希望用户在使用过程中不断提出意见,以便于以后功能的进一步提高与完善。
四.致 谢
作者在软件开发过程中,得到了闫中敏老师的指导与帮助,对于论文的写作,从内容到组织方式,闫中敏老师也提出了许多中肯的建议,在此对闫中敏老师表示衷心的感谢。
另外,还要感谢计算中心为毕业实习提供实习环境。
五.参 考 文 献
1.《数据库系统概论》(第三版)萨师煊 王珊 著 高等教育出版社
2.《Oracle 数据库技术》刘瑞挺 樊成 编著 国防工业出版社
3.《ORACLE 7 使用技巧》北方交通大学自动化系统研究所编著 科学出版社
4.《Power Builder 8.0数据库系统开发实例导航》 何旭洪 余建英 编著 人民邮电出版社
5.《Power Builder 6.0应用开发指南(函数篇)》 沃得工作室 编著 人民邮电出版社
6.《PowerBuilder 6.0/6.5教程》 熊居然 等编著 电子工业出版社
7.《PowerBuilder 7.0编程实战新招》刘秉毅 编著 西安交通大学出版社