国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

在PB中利用DDE

2024-07-21 02:10:20
字體:
來源:轉載
供稿:網友
在pb中利用dde
華中科技大學電子與信息工程系 郭小兵

powerbuilder(以下稱pb)是一種強有力的企業級數據庫應用系統開發工具,利用它可以方便地開發出數據庫系統的前臺應用軟件。但由于用pb所開發的報表具有一定的局限性:報表的表頭、列寬等都不能在應用程序中由用戶來進行調整,所以若用戶報表的格式有所變動,則必須在原程序中對報表進行調整,這在很大程度上降低了軟件的靈活性。excel是microsoft公司的表格處理軟件,由于其簡單易用,近年來在各單位的報表處理中得到廣泛的應用。那么,在應用程序中是否可以調用excel,讓用戶在用pb開發的應用程序中管理數據庫中的數據,而在用戶熟悉的excel表格處理軟件中調整并打印報表呢?答案是肯定的,本文介紹如何利用動態數據交換dde(dynamic data exchange)技術,在pb中把數據庫中的數據傳送到excel應用程序中,以便由用戶在excel中調整打印報表。dde用于在windows平臺上的兩個正在運行的應用程序之間動態交換數據,它是一種在windows操作系統中基于消息的協議。動態數據交換總是發生在兩個正在運行的程序之間,在這兩個應用程序之間相互發送和接收命令及數據。這兩個正在運行的程序分別稱為客戶程序和服務器程序,客戶程序就是請求服務的程序,而提供服務的程序稱為服務器程序。
實現方法
dde應用程序在開始交換數據以前必須由客戶端發出初始請求,建立與服務器端的dde連接(又稱為通道或會話)。在建立連接后客戶端可以連續向服務器發送數據請求和命令請求。在本文的應用程序中,我們用excel做dde應用服務器程序,在pb中進行dde連接。1.啟動dde服務器應用程序excel.exe可以在windows環境下單獨啟動,也可以在pb中用run函數啟動。pb中run函數的語法格式為:run(string{,windowstate})●string:字符型,要執行的程序文件名;●windowstate:枚舉型,程序啟動后的窗口狀態,可以是最小化(minimized!)、最大化(maxized!)或原尺寸(normal!)。在本文中,我們從客戶程序pb中啟動服務器應用程序excel.exe,并假設excel.exe的路徑為:c:/program files/microsoft office/office/excel .exe在pb中啟動服務器應用程序的命令為:run(“c:/program files/microsoft office/office/excel.exe”, minimized!)2.建立dde連接在客戶程序和服務器程序均啟動之后,就必須建立客戶程序和服務器程序之間的連接。在客戶程序pb中,可以使用openchannel函數建立這種連接,打開一個從客戶程序到服務器程序的通道。pb中openchannel函數的格式為:openchannel(appname,topicname{,windowhandle }))●appname:服務器程序的應用程序名;●topicname:主題名,即客戶端要使用的實例,如word文檔或excel文檔;●windowhandle:客戶端的窗口句柄,如果客戶端程序打開了多個窗口,需要指定其中一個作為客戶端窗口。建立dde連接的方式分為冷連接、暖連接和熱連接:●冷連接:是指運行中的客戶程序和服務器程序進行直接的數據交換,不需要建立通道或連接,每次操作都要指定應用程序名和項目名;●暖連接:是指用openchannel函數建立的連接,它可以利用openchannel函數返回的句柄對指定的應用進行操作;●熱連接:是指用starthotlink建立的連接。無論是冷連接還是暖連接都無法在客戶端知道服務器端是否修改了數據,同樣,在服務器端也無法知道客戶端的數據修改情況。而用熱連接就可以使服務器端和客戶端彼此知道數據是否被修改。在本文中,只是在pb中調用excel報表,并向其中傳遞數據庫數據,并不需要知道excel中對數據的修改處理情況,所以選用暖連接方式比較合適。3.從客戶端向服務器端發送數據在建立起客戶程序和服務器程序的連接之后,就可以在客戶程序pb中用setremote函數向服務器應用程序的報表中發送數據庫數據,以生成完整的報表。根據dde連接方式的不同,setremote函數有兩種格式分別用于冷連接和暖連接。冷連接:setremote(location,value,applname,topicname)暖連接:setremote(location,value,handle{,windowhandle})我們可以利用該函數讀取數據庫中的數據并寫入到excel的報表文件中以待打印。4.通過客戶端執行服務器端命令在客戶程序向服務器excel發送完數據后,用戶可以在excel中對報表做適當的調整,然后打印調整過的報表,并且關閉excel。在應用程序的客戶端中可以以遠程方式執行服務器應用程序(excel.exe)中的命令,執行遠程命令的函數為execremote。該函數也是根據dde連接方式的不同有冷連接和暖連接兩種格式。冷連接:execremote ( command , appname, topicname)暖連接:execremote (command ,handle,{ windowhandle })利用這個命令可以在pb客戶端執行excel程序的保存、打印和關閉等操作。5.結束dde連接當完成dde的數據處理后,使用closechannel函數關閉dde連接。該函數的語法格式為:closechannel ( handle, { windowhandle } )
編程實例
假設有某學校的成績管理系統,學生的成績報表格式如圖1。
xx班級考試成績一覽表
2000年xx月
姓名語文數學英語物理化學總分平均                        全班平均       首先在excel中按照上述格式做好報表grade1.xls,并且把全班的平均成績和表頭之間空余100行(假設班級的學生人數不超過100人)。然后在excel中設計好全班平均成績、個人總成績和個人平均成績的計算公式,以自動計算所需要的數值。最后從數據庫中檢索出數據并填充在數據窗口控件dw_1中。部分源代碼如下:int i,handle,nstring excel,road_excel//得到excel的路徑registryget(“hkey_current_user oftware/microsoft/office/8.0/”+&“excel/microsoft excel ”,“gallerypath”,regstring!, road_excel)excel=road_excel+“/excel.exe”//啟動服務器程序,并打開報表grade1.xlsrun(excel+“ grade1.xls ”)//建立到服務器程序的連接通道handle=openchannel(“excel”,“ grade1.xls ”)n= dw_1.count()//向excel報表傳遞數據for i= 1 to nhandle=openchannel(“excel”,“ grade1.xls”)setremote(“r”+string(i+1)+“c1”,string(dw_1.getitemnumber(i+1)),handle)setremote(“r”+string(i+2)+“c1”,string(dw_1.getitemnumber(i+2)),handle)setremote(“r”+string(i+3)+“c1”,string(dw_1.getitemnumber(i+3)),handle)setremote(“r”+string(i+4)+“c1”,string(dw_1.getitemnumber(i+4)),handle)setremote(“r”+string(i+5)+“c1”,string(dw_1.getitemnumber(i+5)),handle)next //在客戶程序中打印excel報表execremote(“[print()]”,“excel”,“grade1.xls”)//關閉并不保存grade.xlsexecremote(“[close(false)]”,“excel”,“grade1.xls”)//退出excelexecremote(“[quit()]”,“excel”,“system”)//關閉連接通道,結束dde會話close(handle)注意:從客戶程序中啟動excel服務器程序與建立連接和傳遞數據之間必須要有一定的時間間隔,最好把啟動excel放在一個事件中,把建立連接和傳遞數據放在另一個事件中,避免由于在建立連接和傳遞數據時excel還沒有完全啟動,造成建立連接和傳遞數據不正常。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 海门市| 安西县| 景洪市| 剑阁县| 大荔县| 临泽县| 石家庄市| 锡林浩特市| 屯昌县| 蕲春县| 舒城县| 清苑县| 昌邑市| 泾川县| 江城| 济宁市| 营口市| 龙海市| 绵竹市| 滦平县| 阳泉市| 布尔津县| 内江市| 奉新县| 靖安县| 通州区| 临夏县| 辰溪县| 桐庐县| 留坝县| 名山县| 隆化县| 垦利县| 临夏市| 克什克腾旗| 元阳县| 孝感市| 龙海市| 吉林市| 安义县| 霍州市|