PB中共享数据窗口的应用

与其它数据库前端工具相比,PowerBuilder显著的特点就是其数据窗口(DataWindow )技术,在编程方面有很强的技巧性。PowerBuild er为数据窗口提供丰富的函数,有些函数虽然不很常用,但在某些应用中恰当使用会收到很好的效果,本文所要讨论的数据窗口共享函数Sha reData()即为一例。使用共享数据窗口技术会减少编程工作量,在客户机/服务器模式下提高数据库的检索效率。
  首先我们应理解共享数据窗口的概念,共享数据窗口的实现非常简单,只需一条Shar eData()。例如在Window对象上的两个数据窗口dw-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()一条语句, 在某些情况下可使项目开发更迅速更可靠。以上只是作者在实际项目开发中总结的一般经验,仅供参考。

}  

你可能感兴趣的:(编程,数据库,function,脚本,PowerBuilder,图形)