
浅议PowerBuilder的几种数据窗编程应用.pdf
6页浅议P o w e r B u i l d e r 的几种数据窗编程应用李必丹任继东 河南电子工业学校P o w e r B u i l d e r 是一套强大的数据库应用系统开发工具,它具有完整的客户/服务器体系结构、面向对象的应用程序开发方法以及可视化的开发环境,因而成为流行的数据库前端开发工具随着数据库技术在各行各业的广泛应用,作为企业级数据库前端开发工具的P o w e r B u i l d e r 日益成为开发人员的得力助手P o w e r B u i l d e r 以其开放的体系结构,友好的用户界面和简洁高效的开发环境赢得了众多程序员的喜爱,连续多年被评为美国计算机界的年度风云产品,在数据库开发工具领域占据了高达4 4 %的市场份额P o w e r B u i l d e r是由多个功能模块组成的可视化集成开发环境,是面向对象的开发工具,用它可以方便地建立起基于W i n d o w s 的分布式数据库应用其功能模块分别完成应用管理、窗口对象设计、菜单对象设计、数据窗对象设计和数据库查询等工作,这些功能模块由于P o w e r B u i l d e r 提供的色彩丰富的工具条而被称作”P a i n t e r 一( 画板) .下文介绍相应的数据窗的编程技巧。
数据窗对象是P o w e r B u i l d e r 中最重要的概念之一,它是P o w e r B u i l d e r 应用区别于其它W i n d o w s 应用的重要特征,同时也是P o w e r B u i l d e r 的价值所在P o w e r B u i l d e r 应用通常通过数据窗对象从数据库或其它数据源取得数据并加以显示,其数据的输入、添加、修改和删除也通过数据窗对象来实现故理解并掌握数据窗概念对于用好P o w e r B u i l d e r 具有重要意义.下面给出了有关数据窗的几个编程技巧.1 、自动调整大小的数据窗在P o w e r B u i l d e r 应用运行过程中,常常会用鼠标拖动窗口角以改变窗口大小,尤其是在多文档窗口( M D I ) 中,通常有多个s h e e t 存在的情况下,有时为了察看后面窗口中的数据而将前面窗口缩小,但窗口缩小了,其中的数据窗并没有缩小,由此两不能方便地使用数据窗的卷滚条,那么怎样使前面窗口申的数据窗大小随窗口的大小自动调整呢? 很简单,我们只需要在数据窗所在窗口的Re s i z e 事件下写上一句话:R e s i z e ( d w _ d a t a m o n 。
t h i s .W o r k s p a c e w i d t h0 - 5 0 ,t h i s .w o r k s p a c e h e i g h t ( ).- 5 0 )一3 0 t 一.其中d w _ d a t a m o n 是数据窗的名字,数字5 0 可以调整你就拥有了一个会随窗口大小变化而自动调整大小的数据窗了卷滚条用起来很方便2 、R e t r i e v e 后不回卷的数据窗我们经常面对一大堆数据,其具体体现就是数据窗很长,需要拉动垂直卷滚条才能看到后面的数据,当你在包含长数据窗的窗口的T i m e r 事件中写下R e t r i e v e 语句后,令人气恼的事情就会发生:T i m e r 事件一执行,数据窗就翻回第一页;如果T i m e r 事件执行的时间间歇很短,那我们永远没有足够的时间来察看后面的数据下面我们着手解决这个问题可能你已经注意到,每个数据窗都拥有两个与R e t r i e v e 有关的事件:R e t r i e v e s t a r t 和R e t r i e v e e n d ,它们分别允许我们在R e t r i e v e 的前后干一些事,这正是我们所需要的。
实际上,就这两个事件,我们已经能够提出两个解决方案了其一,在R e t r i e v e s t a r t 事件中,保存当前数据窗中可见的数据行:然后R e t r i e v e ,接着在R e t r i e v e e n d 事件中,恢复先前保存的数据行其二,在R e t r i e v e s t a r t 事件中,保存当前垂直卷滚块的位置;R e t r i e v e后再恢复其位置.后者使用了动态数据窗函数,实现起来更简洁一些,下面详细探讨.假设你已设计好了一个在窗口w _ d a t a m o n 中的数据窗d w _ d a t a m o n ,现在可以先定义一个保存垂直卷滚块位置的类型为s t r i n g 的G l o b l e 变量o l d _ v s p o s ,然后在该数据窗的R e t r i e v e s t a r t 事件下输入以下语句以保存其位置:o l d _ v s p o s = t h i s .d w D e s c r i b e ( ”D a t a W i n d o w .V e r t i c a l S c r 0 1 l p o s i t i o n ”) d w _ d a t a m o n .S e t R e d r a w ( f a l s e ) 在相应的R e t r i e v e e n d 事件下输入恢复垂直卷滚块位置的语句:t h i s .d w M o d i f y ( # D a t a W i n d o w .V e r t i c a l S c r 0 1 l p o s i t i o n = ”+ o l d —v s p o s) d w _ d a t a m o n .S e t R e d r a w ( t r u e )这样,数据窗上的工作已做完。
下面是相应窗口上的工作该窗口的O p e n 事件下:d w _ d a t a m o n .S e t t r a n s ( 8 q l c a ) d w _ d a t a m o n .R e t r i e v e0t i m e r ( 6 )该窗口的T i m e r 事件下:S e t f o c u s ( w _ d a t a m o n ) R e t r i e v e ( d w _ d a t a m o n )至此,R e t r i e v e 后不会回卷的数据窗d w _ d a t a m o n 已经可以工作了值得注意的是,数据窗的排序分类等操作应在R e t r i e v e 前就在数据库表中完成,否则R e t r i e V e 8 t a r t 事件保存的卷滚块位置很可能并不是你所期待的,换句话一3 0 5 —说,R e t r i e v e s t a r t 事件应发生在所有数据窗操作之后;另外,在每次R e t r i e v e后,应将处于该数据窗上的F o c u s 移开,以免具有焦点的数据窗的第一行第一列总要显示,故在窗口w _ d a t a m o n 的T i m e r 事件中设置了S e t f o c u x( w _ d a t a m o n ) 这条语句。
3 、数据从文本文件写入数据库表的捷径许多情况下,文本文件中的数据排列顺序与数据库表中列的顺序一致,并且其数据类型与数据库表中对应列的一致,要做的就是将该文件中的内容存入对应数据库表中例如在点对点通讯的情况下,~方把数据库表中的数据以文本文件格式存储并传送给另一方,另一方要做的工作就是将收到的数据存入相同的数据库表中P o w e r B u i l d e r 有多种方式与文本文件打交道,比如使用O D B C 的文本文件驱动器,采用D D E ( 动态数据交换) 方式、采用O L E 方式或使用C u r s o r 将文本文件逐行逐列读取并写入数据库表等但在这种情况下,还有一种更快捷的方法:使用I m p o r t F i l e0 函数将文本文件内容直接倒入数据库表中.该函数的用法:d a t a w i n d o w n a m e .I m p o r t F i l e ( f i l e n a m e { ,s t a r t r o w { ,e n d r o w & { ,s t a r t c o l u m n ( ,e n d c o l u n m { ,d w 8 t a r t c o l u m nj > ) ) ) )I m p o r t F i l e0 函数要求数据窗列的数据类型稀列的排列顺序必须与文本文件中的数据相匹配。
在存储文本文件时要注意接收数据库对表的格式要求,比如在S Y B A S E 中,表格的列与列间是采用T a b a 键区分的,所以如果要用I m p o r t F i l e0 函数将文件内容写入S Y B A S E 表中,就要将相应的文本文件的列与列闻加入T a b 键—一这在文件形成时即可加入下面的代码将文件i n f o r.t x t 写入数据窗d w _ i n f o r ,并将与d w —i n f o r 对应的数据库表更新:i n t i m p ti f ( F i l e L e n g t h ( ”c :\d a t a \i n f o r .t x t ”) > O ) t h e ni m p t = d w —i n f o r .I m p o r t F i l e ( ”c :\d a t a \i n f o r .t x t ”)i fi m p t > Ot h e nd w _ i n f o r .s e t t r a n s ( s q l c a ) ;u p d a t e ( d w —i n f o r ) ;c o m m i t ;i fs q l c a .s q l c o d e = 一lt h e nm e s s a g e b o x ( ”S Q L E R R O R ”,s q l c a.s q l e r r t e x t )e n d i fe l s em e s s a g e b o x ( ”注意一。
∥文件i n f o r .t x t 写入失败! ”)e n d i fe n d i f一3 0 8 ~此外,I m p o r t F i l e0 函数还支持从文本文件的指定开始行列到结束行列读取并写人数据;并且支持.d b f ( d B a s e ) 文件的读写,这给原有台式数据库数据文件向新的分布式数据库表中转换带来了极大的方便4 、使用P o w e r B u i l d e r 同时访问多个数据库随着网络的延伸和信息系统的不断开发,系统集成面临着如何将分布在不同服务器上的数据库系统集成到一起的闻题某个客户可能需要在同一窗口同时访问两个服务器上的两个不同种数据库,P o w e r B u i d e r 为这种需求提供了令人满意的解决方案通过T r a n s a c t i o nO b j e c t 同时打开多个事务,再通过多个事务存取建立在不同数据库上的D a t a W i n d o w s 本文简述具体显示方案.方案窗口中的二个事件脚本( S c r i p t s ) 如下:( 1 ) 打开窗口事件脚本( O p e nf o rW _ L C )T r a n s a c t i o nl c _ o r a c l e ,l c ..i n g r e s//初始化o r a c l e 数据库事务l c _ o r a c l e = C R E A T Et r a n s a c t i o nl c _ o r a c l e .D B M S = 一O R 7 0 R A C L Ev 7 .x ∥l c _ o r a c l e .D。
