在PB中利用DDE

2021-04-12 14:56:49 字數 4132 閱讀 8063

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)

●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函式的格式為:

●topicname:主題名,即客戶端要使用的例項,如word文件或excel文件;

●windowhandle:客戶端的視窗控制代碼,如果客戶端程式開啟了多個視窗,需要指定其中乙個作為客戶端視窗。

建立dde連線的方式分為冷連線、暖連線和熱連線:

●冷連線:是指執行中的客戶程式和伺服器程式進行直接的資料交換,不需要建立通道或連線,每次操作都要指定應用程式名和專案名;

●暖連線:是指用openchannel函式建立的連線,它可以利用openchannel函式返回的控制代碼對指定的應用進行操作;

●熱連線:是指用starthotlink建立的連線。

無論是冷連線還是暖連線都無法在客戶端知道伺服器端是否修改了資料,同樣,在伺服器端也無法知道客戶端的資料修改情況。而用熱連線就可以使伺服器端和客戶端彼此知道資料是否被修改。

在本文中,只是在pb中呼叫excel報表,並向其中傳遞資料庫資料,並不需要知道excel中對資料的修改處理情況,所以選用暖連線方式比較合適。

3.從客戶端向伺服器端傳送資料

在建立起客戶程式和伺服器程式的連線之後,就可以在客戶程式pb中用setremote函式向伺服器應用程式的報表中傳送資料庫資料,以生成完整的報表。

根據dde連線方式的不同,setremote函式有兩種格式分別用於冷連線和暖連線。

冷連線:

暖連線:

setremote(location,value,handle)

我們可以利用該函式讀取資料庫中的資料並寫入到excel的報表檔案中以待列印。

4.通過客戶端執行伺服器端命令

在客戶程式向伺服器excel傳送完資料後,使用者可以在excel中對報表做適當的調整,然後列印調整過的報表,並且關閉excel。

在應用程式的客戶端中可以以遠端方式執行伺服器應用程式(excel.exe)中的命令,執行遠端命令的函式為execremote。該函式也是根據dde連線方式的不同有冷連線和暖連線兩種格式。

冷連線:

暖連線:

execremote (command ,handle,)

利用這個命令可以在pb客戶端執行excel程式的儲存、列印和關閉等操作。

5.結束dde連線

當完成dde的資料處理後,使用closechannel函式關閉dde連線。該函式的語法格式為:

closechannel ( handle, )

程式設計例項

假設有某學校的成績管理系統,學生的成績報**式如圖1。

xx班級考試成績一覽表

2023年xx月

姓名語文

數學英語

物理化學

總分平均

全班平均

首先在excel中按照上述格式做好報表grade1.xls,並且把全班的平均成績和表頭之間空餘100行(假設班級的學生人數不超過100人)。然後在excel中設計好全班平均成績、個人總成績和個人平均成績的計算公式,以自動計算所需要的數值。最後從資料庫中檢索出資料並填充在資料視窗控制項dw_1中。

部分源**如下:

int i,handle,n

string excel,road_excel

//得到excel的路徑

registryget(「hkey_current_user/software/microsoft/office/8.0/」+&「excel/microsoft excel 」,「gallerypath」,regstring!, road_excel)

excel=road_excel+「/excel.exe」

//啟動伺服器程式,並開啟報表grade1.xls

run(excel+「 grade1.xls 」)

//建立到伺服器程式的連線通道

handle=openchannel(「excel」,「 grade1.xls 」)

n= dw_1.count()

//向excel報表傳遞資料

for i= 1 to n

handle=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.xls

execremote(「[close(false)]」,「excel」,「grade1.xls」)

//退出excel

execremote(「[quit()]」,「excel」,「system」)

//關閉連線通道,結束dde會話

close(handle)

注意:從客戶程式中啟動excel伺服器程式與建立連線和傳遞資料之間必須要有一定的時間間隔,最好把啟動excel放在乙個事件中,把建立連線和傳遞資料放在另乙個事件中,避免由於在建立連線和傳遞資料時excel還沒有完全啟動,造成建立連線和傳遞資料不正常。

在PB中實現ftp傳輸

在pb中實現ftp傳輸 深圳 獨孤求敗2003 05 20 在用pb進行開發時常常需要用到ftp功能,最典型的應用就是將資料視窗中的資料生成txt檔案,然後將此資料檔案用ftp傳送到遠端伺服器上去。由於pb本身並未提供任何ftp的功能,因此想在pb中進行ftp傳輸,只能應用pb以外的資源。以下是筆者...

在PB中如何控制DATAWINDOW列的修改屬性

在編制管理資訊應用系統中,一般都會遇到乙個共同問題,那就是如何根據不同情況去控制表中的資料列,比如對於同一datawindow不同的使用者有不同的操作 如對於資料錄入人員可以更改資料,而對於查詢人員一般不能更改資料 下面就以乙個簡單的工資表為例來說明利用pb如何在datawindow中控制列的修改方...

在PB中如何控制DATAWINDOW列的修改屬性

在編制管理資訊應用系統中,一般都會遇到乙個共同問題,那就是如何根據不同情況去控制表中的資料列,比如對於同一datawindow不同的使用者有不同的操作 如對於資料錄入人員可以更改資料,而對於查詢人員一般不能更改資料 下面就以乙個簡單的工資表為例來說明利用pb如何在datawindow中控制列的修改方...