基于PB6和ORACLE8開發(fā)“勞動(dòng)信息管理系統(tǒng)”
時(shí)間:2022-03-20 04:49:00
導(dǎo)語(yǔ):基于PB6和ORACLE8開發(fā)“勞動(dòng)信息管理系統(tǒng)”一文來(lái)源于網(wǎng)友上傳,不代表本站觀點(diǎn),若需要原創(chuàng)文章可咨詢客服老師,歡迎參考。
摘要:本文介紹了用POWERBUILDER6.0(以下簡(jiǎn)稱pb6)和oracle8開發(fā)“勞動(dòng)信息管理系統(tǒng)”(以下簡(jiǎn)稱“系統(tǒng)”)的方法和解決的技術(shù)性問(wèn)題,并介紹一些開發(fā)經(jīng)驗(yàn)。
主題詞:PB6ORACLE8勞動(dòng)信息方法技術(shù)
1前言
“勞動(dòng)信息管理系統(tǒng)”一般情況下都做成數(shù)字表格、文字描述、圖形顯示等形式。“數(shù)字表格”即具體的人員、工資數(shù)據(jù)的結(jié)構(gòu)化描述;“文字描述”即用一段文字?jǐn)⑹龌蜓a(bǔ)充說(shuō)明情況等;這里的“圖”包括兩類,即照片圖(例如BMP位圖等)和動(dòng)態(tài)生成的指標(biāo)描述圖(如折線圖等)。筆者在選擇開發(fā)工具和數(shù)據(jù)庫(kù)方面,經(jīng)過(guò)詳細(xì)調(diào)研后,覺得用PB6和ORACLE8最為合適,現(xiàn)將開發(fā)和應(yīng)用中的一些體會(huì)總結(jié)成文,供讀者參考。
2系統(tǒng)的運(yùn)行環(huán)境
本系統(tǒng)在CLIENT/SERVER結(jié)構(gòu)上運(yùn)行,SERVER平臺(tái)為UNIX,裝有ORACLE8數(shù)據(jù)庫(kù)。CLIENT端通過(guò)HUB、ROUTER與SERVER連接,CLIENT端的開發(fā)、運(yùn)行平臺(tái)是WIN95/98/2000,前端開發(fā)工具為PB6,總體網(wǎng)絡(luò)協(xié)議為TCP/IP。
3系統(tǒng)功能介紹
該系統(tǒng)包括勞動(dòng)管理信息的維護(hù)和查詢兩部分,內(nèi)容充實(shí),立足于應(yīng)用。表、文、圖具全,對(duì)比圖形由數(shù)據(jù)自動(dòng)生成。同類型的數(shù)據(jù)查詢采用了窗口繼承的開發(fā)方法和動(dòng)態(tài)數(shù)據(jù)窗口,查詢界面統(tǒng)一、清晰。文字部分存入ORACLE庫(kù)的LONG字段中,用MLE(多行編輯器)作為輸入、輸出的中間編輯、查詢界面。一些原始資料,如照片、背景圖等做成了BMP圖片,以BLOB數(shù)據(jù)方式存入ORACLE庫(kù)中,或存至NFS(網(wǎng)絡(luò)文件系統(tǒng))的“虛”盤上,查詢時(shí)調(diào)入圖形框(如P_1)內(nèi)。
4技術(shù)難點(diǎn)及解決的方法
4.1字符集的選擇
如果字符集選擇錯(cuò)誤,會(huì)出現(xiàn)漢字顯示成亂字符的現(xiàn)象,需要從注冊(cè)表中選擇正確的字符集,具體方法是:在WIN95/98/2000下運(yùn)行注冊(cè)表編輯程序regedit.exe,選擇HKEY_LOCAL_MACHINE,再選擇SOFTWARE,再選擇ORACLE,然后選擇NLS_LANG(語(yǔ)言的國(guó)際支持),鍵入和服務(wù)器端相同的字符集。例如服務(wù)器端的字符集為AMERICAN_AMERICAN.US7ASCII,在此也輸入此項(xiàng)就行了。
4.2PB6和ORACLE8的連接
PB6和ORACLE8的連接是一項(xiàng)很重要的內(nèi)容,很多導(dǎo)致調(diào)用數(shù)據(jù)庫(kù)失敗的原因就出于此,根據(jù)不同的用戶需求和硬件環(huán)境,可靈活選擇客戶端的接口軟件,下面舉例子來(lái)說(shuō)明連接方法:
4.2.1//通過(guò)NET8連接數(shù)據(jù)庫(kù),支持32位的數(shù)據(jù)訪問(wèn),安裝ORACLE8的NET8軟件
//目前PB6支持到ORACLE7.3,但是也支持ORACLE8,所以設(shè)置如下
SQLCA.DBMS="o73"
//要訪問(wèn)的ORACLE用戶名
SQLCA.LogID="lz"
SQLCA.LogPass="lzpwd"
SQLCA.UserID="lz"
//通過(guò)SQL*NETV2和ORACLE庫(kù)連接
SQLCA.ServerName="@net80"
Connectusingsqlca;
4.2.2//通過(guò)SQL*NETV2連接,可支持16位的數(shù)據(jù)訪問(wèn),客戶端可選擇ORACLECDE的SQL*NETV2
SQLCA.DBMS="o71"
//要訪問(wèn)的ORACLE用戶名
SQLCA.LogID="lz"
SQLCA.LogPass="lzpwd"
SQLCA.UserID="lz"
//通過(guò)SQL*NETV2和ORACLE庫(kù)連接
SQLCA.ServerName="@snv2"
Connectusingsqlca;
以上的Script語(yǔ)句描述了和SERVER的連接過(guò)程,也可以將上述Script語(yǔ)句存入文件(如pb.ini)中,通過(guò)調(diào)用文件和數(shù)據(jù)庫(kù)做連接。
若PB6和ORACLE8連接不通,可查一下C:\AUTOEXEC.BAT里邊的路徑是否包含c:\orawin95\bin(或相應(yīng)的路徑),如果沒(méi)有此路徑說(shuō)明,PB6和ORACLE8不能連通。
4.3文字類數(shù)據(jù)(文本)的入庫(kù)和查詢
文本入庫(kù)和查詢可采用PB6的MLE(多行編輯器)作界面,編輯完成后存入ORACLE8的LONG字段中,查詢時(shí)從LONG字段中取出,放入MLE中查詢,下邊是一個(gè)例子:
//文本的預(yù)處理(以去除文本文件中的回車換行符為例說(shuō)明)
//將文件讀入BLOB型變量text中fn=fileopen(txtname,streammode!)
iffn<>-1then
fileread(fn,text)
fileclose(fn)
//將讀入的數(shù)據(jù)流組合成字符串
article=string(text)
s=len(article)
forv=1tos
t=pos(article,char(13)+char(10),v)
ift>0then
article=replace(article,t,2,"")
else
endif
next
mle_1.text=article
//將處理后的文件c:\ldxx.txt存盤,文件中的回車換行符已全部去掉
text1=blob(article)
filname="c:\ldxx.txt"
fn=fileopen(filname,streammode!,write!,lockwrite!,replace!)
iffn<>-1then
filewrite(fn,text1)
fileclose(fn)
endif
//文本入庫(kù)
bigtext1=blob(mle_1.text)
updateblobldxxwjsetbigtext=:bigtext1wherebh=:varbhandrq=:varrqusingsqlca;
commit;
//從庫(kù)中提出放入MLE中查詢
selectblobbigtextinto:bigtext1fromldxxwjwherebh=:varbhrq=:varrqusingsqlca;
mle_1.text=blob(bigtext1)
//從庫(kù)中重新生成文本文件filename.txt并存盤
selectbigtextinto:varfilefromldxxwjwherebh=:varbhandrq=:varrqusingsqlca;
fname="c:\filename.txt”
fh=fileopen(fname,streammode!,write!,lockwrite!,replace!)
iffh<>-1then
filewrite(fh,filen)
fileclose(fh)
endif
4.4處理圖象文件(大的二進(jìn)制文件)
職工照片-圖象文件(例如BMP位圖文件)是二進(jìn)制文件,將其以數(shù)據(jù)流方式存入ORACLE8的LONG字段中,查詢時(shí)從LONG字段中取出,放入圖象框(如p_1)中查詢,下邊是一個(gè)例子:
//將圖象文件讀入BLOB型變量pict中
fn=fileopen(picname,streammode!)
iffn<>-1then
fileread(fn,pict)
fileclose(fn)
//將圖象放入圖象框p_1內(nèi)查看
setpicture(p_1,pict)
endif
//將圖象存入表pic的LONG字段bmpt中
updateblobpicsetbmpt=:pict;
commit;
4.5使用動(dòng)態(tài)數(shù)據(jù)窗口
動(dòng)態(tài)數(shù)據(jù)窗口指的是在程序的運(yùn)行過(guò)程中通過(guò)SQL語(yǔ)句的改變動(dòng)態(tài)地創(chuàng)建、修改數(shù)據(jù)窗口的內(nèi)容和表現(xiàn)形式,它多用在對(duì)同類型的對(duì)象的描述過(guò)程中,“勞動(dòng)信息查詢系統(tǒng)”的一些類似的內(nèi)容可用動(dòng)態(tài)數(shù)據(jù)窗口來(lái)編制,表現(xiàn)形式一致、構(gòu)造界面統(tǒng)一、編程效率高,當(dāng)然還有其它一些優(yōu)點(diǎn)。下邊是一個(gè)創(chuàng)建動(dòng)態(tài)數(shù)據(jù)窗口并由此繪出趨勢(shì)圖的例子(動(dòng)態(tài)數(shù)據(jù)窗口dw_1,圖形框gr_1):
dw_1.Create(SyntaxFromSQL(SQLCA,"SELECTsj,val01FROMtab01whereytmh=''''"+rowcha+"''''ORDERBYsj","style=(type=grid)",err))
//執(zhí)行上述語(yǔ)句會(huì)動(dòng)態(tài)地產(chǎn)生類型為grid的數(shù)據(jù)窗口dw_1。
//由下邊這段程序做出趨勢(shì)圖:
//將數(shù)據(jù)調(diào)入數(shù)據(jù)窗口
dw_1.SetTransObject(sqlca)
dw_1.Retrieve()
rows=rowcount(dw_1)
ifrows>0then
gr_1.SetRedraw(False)
gr_1.reset(all!)
gr_1.addseries("dz1")
fori=1torows
xis=mid(getitemstring(dw_1,i,1),3,2)
yis=getitemnumber(dw_1,i,2)
ifisnull(yis)then
yis=0
endif
gr_1.adddata(1,yis,xis)
next
gr_1.SetRedraw(True)
sum=sum+sum1
st_1.text=string(sum)
endif
//圖的類型可根據(jù)不同需要隨意選擇,如選擇餅圖、柱狀、折線圖等。
4.6變量的定義和賦值要正確
一些整型數(shù)值盡量不要定義成INT類型,因?yàn)橐坏┏^(guò)32767就會(huì)出錯(cuò),一定要定義成LONG類型;帶小數(shù)的數(shù)據(jù)變量要定義成DOUBLE型,若定義成LONG類型,會(huì)自動(dòng)設(shè)去小數(shù)部分,出現(xiàn)精度錯(cuò)誤。
PB6中的日期類變量賦值方式比較固定,若日期變量定義錯(cuò)了,執(zhí)行有關(guān)的SQL語(yǔ)句時(shí)會(huì)出錯(cuò),錯(cuò)誤現(xiàn)象非常隱蔽,不容易調(diào)試,這是編程過(guò)程中的常見錯(cuò)誤,在此特別強(qiáng)調(diào)一下。
舉例如下:
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")