侯军燕
[摘要]介绍windows环境下DDE技术的原理,以及DDE在PB和EXCEL中的应用,并通过实例-利用DDE在EXCEL中输出PB数据并同步打印来说明PB与EXCEL的数据通讯。
[关键词]DDE 应用程序名 主题名 项目名
中图分类号:TN92文献标识码:A文章编号:1671-7597(2009)0310031-01
一、引言
PowerBuilder是一种强有力的企业级数据库应用系统开发工具,利用它可以方便地开发出数据库系统的前台应用软件。但由于用PB所开发的报表具有一定的局限性:报表的表头、列宽以及单元格的背景颜色和字体等都不能在应用程序中由用户来进行调整。而Excel是Microsoft公司的专业的表格处理软件。我们可以利用DDE技术,通过按钮响应来实现在PB中把数据库中的数据传送到Excel中,以便由用户在Excel中调整打印报表。
二、正文
(一)DDE技术简介
DDE英文全称是DynamicDataExchange,中文叫动态数据交换,它是微软公司为在应用程序之间传递数据所制定的第一个标准。DDE用于在Windows平台上的两个正在运行的应用程序之间动态交换数据,它是一种在Windows操作系统中基于消息的协议。动态数据交换总是发生在两个正在运行的程序之间,在这两个应用程序之间相互发送和接收命令及数据。这两个正在运行的程序分别称为客户程序和服务器程序。
(二)DDE技术在PB和EXCEL中的应用
Powbuilder支持DDE技术,它既可以是用来提供数据和功能的DDE服务器,也可以是用来请求和显示数据的DDE客户端。它的内部提供了一系列的PowerSript函数,通过调用内置函数和处理事件来实现相互之间的通信。当命令或数据从客户传向服务器或从服务器传向客户端时,将会出发生DDE事件。同样,EXCEL也是一个支持DDE的应用程序,它一般用来作为DDE的服务器端。
由于通常一个应用程序可以和多个服务器进行数据通信,为了使DDE客户程序能够唯一标志一个DDE服务器应用程序,DDE使用一种约定的命名方法来标志服务器应用程序,这种命名方法包括了:应用程序名、主题名和项目名。应用程序名用于指出特定的DDE服务器应用程序名,如Excel代表Microsoft Excel,而主题名则进一步确定当前应用程序与DDE服务器会话的主题内容,例如对EXCEL程序来说,它的主题名是指一个具体的工作表文档名。而项目名则是为了进一步确定预制通信的内容,对EXCEL程序是指工作表中的具体单元格名。
(三)PowerBuilder与Excel利用DDE技术传递数据实例
在这个实例中PB作为通信的客户端,而Excel作为通信的服务器端。在PB窗口中放一个数据控件用来存放数据窗口中的数据。并放置五个按钮,前三个按钮标题是插入、删除和更新,是对数据的操纵。第四个按钮标题是打开预设文件,第五个按钮标题是“保存数据到预设文件并打印”,在这两个按钮上加单击事件脚本来实现DDE技术。其次,我们还需建立一个EXCEL文件取名为chengji.xls,并在此文件中设置好表头和单元格样式以及求和和求平均公式。
在两个应用程序进行数据传递之前,首先要使两个应用程序都启动才行。PB应用程序显然已启动,启动excel文件的程序如下,如run("c:program filesMicrosoft officeofficeExcel.exe+chengji.
xls",minimized!)。然后开始在PB中和excel中建立DDE连接以便进行动态数据交换。DDE客户端与服务器端的连接共有三种:冷连接、暖连接和热连接。根据三种连接的优劣性进行比较选用了暖连接。程序如下:
handle=OpenChannel("Excel","chengji.xls")
for I= 1 to n
SetRemote("r"+string(I+1)+"c1",string(dw_1.getitemnumber(I,1)),handle)
SetRemote("r"+string(I+1)+"c2",dw_1.getitemstring(I,2),handle)
SetRemote("r"+string(I+1)+"c3",string(dw_1.getitemnumber(I,3)),handle)
SetRemote("r"+string(I+1)+"c4",string(dw_1.getitemnumber(I,4)),handle)
SetRemote("r"+string(I+1)+"c5",string(dw_1.getitemnumber(I,5)),handle)
SetRemote("r"+string(I+1)+"c6",string(dw_1.getitemnumber(I,6)),handle)
SetRemote("r"+string(I+1)+"c7",string(dw_1.getitemnumber(I,7)),handle)
next
在应用程序之间除了可以动态交换数据外,还可以执行远程DDE命令实用函数ExecRemote。如下:
ExecRemote("[print()]",handle)
ExecRemote("[close(true)]",handle)
ExecRemote("[quit()]","Excel","system")
最后是关闭dde连接的程序:CloseChannel(handle)。
三、总结
虽然DDE技术并不是一种新技术,而且它在逐渐被OLE技术所代替,DDE其实是OLE技术的前身,而且DDE的语法很好理解,程序的运行速度也比较快,是一种方便且简单易学的技术。
参考文献:
[1]王晟,PowerBuilder数据库开发经典案例解析[M].清华大学出版社,2005(04).
[2]沈良忠,PowerBuilder数据库开发教程[M].电子工业出版社,2008(03).