学海荡舟手机网

主页 > 实用文摘 > 教育文摘_12 > > 详细内容

基于PB6和ORACLE8开发“劳动信息管理系统”_电子信息和通信论文

基于pb6和oracle8开发“劳动管理系统”

 

刘茂忠(mzliu99@hotmail.com)

 

摘要:本文介绍了用powerbuilder6.0(以下简称pb6)和oracle8开发“劳动管理系统”(以下简称“系统”)的方法和解决的技术性问题,并介绍一些开发经验。

主题词: pb6  oracle8 劳动  方法  技术

1   前言

    “劳动管理系统”一般情况下都做成数字表格、文字描述、图形显示等形式。“数字表格”即具体的人员、工资数据的结构化描述;“文字描述”即用一段文字叙述或补充说明情况等;这里的“图”包括两类,即照片图(例如bmp位图等)和动态生成的指标描述图(如折线图等)。笔者在选择开发工具和数据库方面,经过详细调研后,觉得用pb6和oracle8最为合适,现将开发和应用中的一些体会成文,供读者参考。

2   系统的运行环境

    本系统在client/server结构上运行,server平台为unix,装有oracle8数据库。client端通过hub、router与server连接,client端的开发、运行平台是win95/98/2000,前端开发工具为pb6,总体网络协议为tcp/ip。

3   系统功能介绍

    该系统包括劳动管理的维护和查询两部分,内容充实,立足于应用。表、文、图具全,对比图形由数据自动生成。同类型的数据查询采用了窗口继承的开发方法和动态数据窗口,查询界面统一、清晰。文字部分存入oracle库的long字段中,用mle(多行编辑器)作为输入、输出的中间编辑、查询界面。一些原始资料,如照片、背景图等做成了bmp图片,以blob数据方式存入oracle库中,或存至nfs(网络文件系统)的“虚”盘上,查询时调入图形框(如p_1)内。

4   技术难点及解决的方法

4.1 字符集的选择

    如果字符集选择错误,会出现汉字显示成乱字符的现象,需要从注册表中选择正确的字符集,具体方法是:在win95/98/2000下运行注册表编辑程序regedit.exe,选择hkey_local_machine,再选择software,再选择oracle,然后选择nls_lang(语言的国际支持),键入和服务器端相同的字符集。例如服务器端的字符集为american_american.us7ascii,在此也输入此项就行了。

4.2 pb6和oracle8的连接

    pb6和oracle8的连接是一项很重要的内容,很多导致调用数据库失败的原因就出于此,根据不同的用户需求和硬件环境,可灵活选择客户端的接口软件,下面举例子来说明连接方法:

4.2.1  //通过net8连接数据库,支持32位的数据访问,安装oracle8 的net8 软件

 //目前pb6支持到oracle7.3 ,但是也支持oracle8,所以设置如下

sqlca.dbms       ="o73"

    


//要访问的oracle用户名

sqlca.logid      ="lz"

sqlca.logpass    ="lzpwd"

sqlca.userid     ="lz"

//通过sql*net v2和oracle库连接

sqlca.servername="@net80"  

connect using sqlca;

4.2.2  //通过sql*net v2连接,可支持16位的数据访问,客户端可选择oracle cde的sql*net v2

sqlca.dbms       ="o71"

//要访问的oracle用户名

sqlca.logid      ="lz"

sqlca.logpass    ="lzpwd"

sqlca.userid     ="lz"

//通过sql*net v2和oracle库连接

sqlca.servername="@snv2"  

connect using sqlca;

    以上的script语句描述了和server的连接过程,也可以将上述script语句存入文件(如pb.ini)中,通过调用文件和数据库做连接。

      


    若pb6和oracle8连接不通,可查一下c:\autoexec.bat里边的路径是否包含c:\orawin95\bin(或相应的路径),如果没有此路径说明,pb6和oracle8不能连通。

4.3 文字类数据(文本)的入库和查询

    文本入库和查询可采用pb6的mle(多行编辑器)作界面,编辑完成后存入oracle8的long字段中,查询时从long字段中取出,放入mle中查询,下边是一个例子:

//文本的预处理(以去除文本文件中的回车换行符为例说明)

//将文件读入blob型变量text中fn=fileopen(txtname,streammode!)

if fn<> -1 then

fileread(fn,text)

fileclose(fn)

//将读入的数据流组合成字符串

article=string(text)

s=len(article)

for v=1 to s

t=pos(article,char(13)+char(10),v)

if t>0 then

article=replace(article,t,2,"")

else

end if

next

mle_1.text=article

//将处理后的文件c:\ldxx.txt存盘,文件中的回车换行符已全部去掉

text1=blob(article)

filname="c:\ldxx.txt"

fn=fileopen(filname,streammode!,write!,lockwrite!,replace!)  

if fn<>-1 then

filewrite(fn,text1)

fileclose(fn) 

end if

//文本入库

bigtext1=blob(mle_1.text)

updateblob ldxxwj set bigtext=:bigtext1 where bh=:varbh and rq=:varrq using sqlca;

commit;

//从库中提出放入mle中查询

selectblob bigtext into :bigtext1 from ldxxwj where bh=:varbh rq=:varrq using sqlca;

mle_1.text=blob(bigtext1)   

//从库中重新生成文本文件filename.txt并存盘

select bigtext into :varfile from ldxxwj where bh=:varbh and rq=:varrq using sqlca;

fname="c:\filename.txt”

fh=fileopen(fname,streammode!,write!,lockwrite!,replace!)  

if fh<>-1 then

filewrite(fh,filen)

fileclose(fh)    

end if

4.4  处理图象文件(大的二进制文件)

     职工照片-图象文件(例如bmp位图文件)是二进制文件,将其以数据流方式存入oracle8的long字段中,查询时从long字段中取出,放入图象框(如p_1)中查询,下边是一个例子:

//将图象文件读入blob型变量pict中

fn=fileopen(picname,streammode!)

if fn<> -1 then

fileread(fn,pict)

fileclose(fn)

//将图象放入图象框p_1内查看

setpicture(p_1,pict)

end if

//将图象存入表pic 的long字段bmpt 中

updateblob pic set bmpt=:pict ;

commit;

4.5  使用动态数据窗口

    动态数据窗口指的是在程序的运行过程中通过sql语句的改变动态地创建、修改数据窗口的内容和表现形式,它多用在对同类型的对象的描述过程中,“劳动查询系统”的一些类似的内容可用动态数据窗口来编制,表现形式一致、构造界面统一、编程效率高,当然还有其它一些优点。下边是一个创建动态数据窗口并由此绘出趋势图的例子(动

      


态数据窗口dw_1,图形框gr_1):

dw_1.create(syntaxfromsql(sqlca,"select sj,val01  from tab01 where  ytmh='"+rowcha+"' order by sj  ","style=(type=grid)",err))

//执行上述语句会动态地产生类型为grid的数据窗口dw_1。

//由下边这段程序做出趋势图:

//将数据调入数据窗口

dw_1.settransobject(sqlca) 

dw_1.retrieve()

rows = rowcount(dw_1)

if rows>0 then

gr_1.setredraw(false)

gr_1.reset(all!)

gr_1.addseries("dz1")

for  i =1  to rows

xis=mid(getitemstring(dw_1,i,1),3,2)

yis=getitemnumber(dw_1,i,2)

if isnull(yis) then

yis=0

end if

gr_1.adddata(1, yis,xis)

next

gr_1.setredraw(true)

sum=sum+sum1

st_1.text=string(sum)

end if

//图的类型可根据不同需要随意选择,如选择饼图、柱状、折线图等。

4.6  变量的定义和赋值要正确

一些整型数值尽量不要定义成int类型,因为一旦超过32767就会出错,一定要定义成long类型;带小数的数据变量要定义成double型,若定义成long类型,会自动设去小数部分,出现精度错误。

    pb6中的日期类变量赋值方式比较固定,若日期变量定义错了,执行有关的sql语句时会出错,错误现象非常隐蔽,不容易调试,这是编程过程中的常见错误,在此特别强调一下。

   举例如下:

   rqnum1=”2000-06-31”

   rqnum2=”2000-07-01”

   vardate1=string(date(em_1.text),"dd-mmm-yy")

   vardate2=string(date(em_2.text),"dd-mmm-yy")