荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: xxv (最喜欢TV), 信区: Database
标  题: PowerBuilder共享数据窗口的应用
发信站: 荔园晨风BBS站 (Thu Sep 19 10:33:28 2002), 转信

与其它数据库前端工具相比,PowerBuilder显著的特点就是其数据窗口(DataWindow )技术,
在编程方面有很强的技巧性。PowerBuild er为数据窗口提供丰富的函数,有些函数虽然不很
常用,但在某些应用中恰当使用会收到很好的效果,本文所要讨论的数据窗口共享函数Sha
reData()即为一例。使用共享数据窗口技术会减少编程工作量,在客户机/服务器模式下提高
数据库的检索效率。
  首先我们应理解共享数据窗口的概念,共享数据窗口的实现非常简单,只需一条Shar
eData()。例如在Window对象上的两个数据窗口d w—p和dw—s,则可以用dw—p.ShareDat
a(dw—s)实现二者的数据共
享,dw—p称为主数据窗口,而dw—s称为从数据窗口。从原理上讲,二者实际上所共享的是数
据的缓冲区。缓冲区中的数据首先要从数据库中检索(通过数据窗口Retrieve()函数),而数
据库的检索是一种较为"
昂贵"的操作,它会加重数据库和网络传输的负荷。在共享数据窗口情况下,只有主数据窗口
检索数据,而从数据窗口通过共享获得数据,无须再检索数据库,下面列举的共享数据窗口应
用都是基于这一原理的。
  在下拉数据窗口中的应用
  下拉数据窗口(DropDownDatawindow)作为一种编辑风格在数据窗口中有着广泛的应用,
如果将数据窗口字段的编辑网络设为下拉数据窗口,则执行数据窗口的Retrieve()函数时,如
果其所包含的下拉数据窗口为空(RowCount()=0),则自动为所含下拉数据窗口检索数据。如
果一个数据窗口中
包含多个下拉数据窗口字段,则在其每次打开关闭时(如常用的查询界面),所包含的下拉数据
窗口都重复检索数据库。
  考虑到包含下拉数据窗口的字段内容在一次应用中通常是不变的
,所以多次检索数据库也是不必要的。这一问题可以通过共享数据窗口解决,具体做法是:先
建立一个专用的窗口对象w—ddw完成预先检索任务,即在w—ddw上放置一个数据窗口dw—1,
其字段为下拉数据窗口编辑风格,对应于后面用到的下拉数据窗口。w—ddw的open事件脚本
 为:
  //w-ddw's open event
  dw—1.DataObject="dw—ddw"
  dw—1.Retrieve()
  其中dw—ddw是包含下拉数据窗口的数据窗口对象,这样为后面所要用到的下拉数据窗口
检索到数据,后续的数据窗口包含下拉数据窗口时,下拉数据窗口可以共享这一检索结果而无
须再对数据库检索。
  考虑到对象的通用性,将w—ddw设计为一个专用对象,在其窗口级设计了一个函数wf —
ddw—load(dw—app,col—src,col—dst),用于实现某一数据窗口(dw—app)中某字段所对应
的下拉数据窗口的共享 。
  //wf—ddw—load function
  DataWindowsChild dwc—src,dwc—dst
  dw—1.GetChild(col—src,dwc—src)
  dw—app.GetChild(col—dst,dwc—dst)
  if dwc—src.ShareData(dwc—dst)=-1 then
   MessageBox("错误","数据共享错误!")
  end if
  如果考虑到某一字段内容可能更新,再设计一个字段更新函数:
  wf—Update(col)
  //wf—Update()function
  DataWindowChild dwc
  dw—1.GetChild(col,dwc)
  dwc.SetTransObject(SQLCA)
  dwc.Retrieve()
  在应用的开始打开w—ddw,w—ddw设计为不可见的(Visible属性 为False),如果某一数
据窗口(例如名为dw—app)中的下拉数据窗口共享w—ddw中的数据窗口数据,则可以在其所在
的window的open事件编写脚本:
  //This's open event
  dw—app.SetTransObject(SQLCA)
  w—ddw.wf—ddw—load(dw—app,‘groups’,‘groups’)
  dw—app.Retrieve()
  由于下拉数据窗口通过共享已经装载数据,所以在以后的多次打开时,dw—app检索数据
库时不会再为其检索,在应用的最后关闭w—dd w。
  在查询式数据窗口中的应用
  查询式数据窗口是一种非常有用的数据窗口模式(QueryMode),利用这一模式,可以以少
量的代码实现高效的查询。
  将一个数据窗口设置为查询模式,只需一条代码:
  dw.Modify("DataWindow.QueryMode=yes")
  如果一个数据窗口被设置为查询模式,则在其数据字段内输入的内容将成为查询条件,例
如一个字段对应的表的列名分别为id和salar y,在id列输入">5",在salary列输入">3 00",
当数据窗口进行Retriev e()时,发向数据库的SQL语句将成为:
  SELECT id,salary...FROM emp WHERE id>5 and salary>300
  现在的问题是:符合上述条件的查询结果又在同一数据窗口显示, 不能为最终用户使用
,解决这一问题的方法就是建立两个数据窗口,一个用于输入组合条件,另一个(dw—2) 用于
显示查询结果,只需一条语句即可:
  dw—1.ShareData(dw—2)
  如果再增加一些功能,许多复杂的组合式查询即可用这一简单的方法实现。
  在数据窗口打印中的应用
  数据窗口最简单的打印方法为:dw.print(),但是在实际应用中, 屏幕上用于显示的数据
窗口通常与打印要求的格式不同,如有两个数据窗口,dw—1(用于显示)和dw—2(用于打印),
使用数据窗口共享技术可以很简单地解决问题,否则就必须对dw—2进行数据库检索。
  更复杂的情况是,一个屏幕本身就由两个数据窗口组成,例如dw— 1用于选择公司的某个
部门,dw—2用于显示所选定部门的人员,如果要打印当前某一部门的查询结果,应如何处理呢
?
  PowerBuilder中的合成式数据窗口(Composite)是处理多数据窗口的有力工具,可以设计
一个合成数据窗口dw—prt用于打印。dw—pr t所含两个数据窗口与dw—1和dw—2兼容。如
果采用数据共享方法,dw
—prt就不用执行带参数的Retrieve(parm),可以直接打印当前查询结果。下面说明具体的实
现方法。
  要实现数据共享,就必须能够引用合成数据窗口中所包含的两个数据窗口的名字,在数据
窗口画板上双击内含Report对象,在出现的Re port Name中输入名字,假设分别为rpt —1和
rpt—2,定义一个用户事 件ue—print,当触该事件时执行下列脚本:
  //ue—print
  //dw—1 contains department and dw—2 contains emp
  DatawindowChild dwc—1,dwc—2
  dw—prt.SetTransObject(SQLCA)
  dw—prt.GetChild("rpt—1",dwc—1)
  dw—prt.GetChild("rpt—2",dwc—2)
  dw—1.ShareData(dwc—1)
  dw—2.ShareData(dwc—2)
  dw—prt.Print()
  在图形显示中的应用
  实际应用中为更直观表示数据的分布情况,经常同时使用数据窗口的列表形式和图形显
示,例如一个屏幕中上面的数据窗口dw—1以列表形式表示数据,下面的数据窗口dw—g是dw—
1的图形显示,如果脚本中包含:
  dw—1.Sharedata(dw—g)
  则每当修改dw—1中的数据时,dw—g所显示的图形马上变化,这种方法明显要比执行dw—
1.Update()后再执行dw—g.Retrieve()要简捷 和快速。
  综上所述,虽然数据窗口的共享技术只需ShareData()一条语句, 在某些情况下可使项目
开发更迅速更可靠。以上只是作者在实际项目开发中总结的一般经验,仅供参考。
 --
ftp://192.168.36.6:66   ftp://multimedia:multimedia@192.168.36.6:66   DivX联盟科

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.36.6]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店