pfc的linkage服务用法

3185阅读 0评论2007-11-22 zhongtang
分类:WINDOWS

关键词: Powerbuilder PFC LINKAGE服务
 
  PB作为sybase的数据库开发利器,曾经在国内风行一时,但是最近几年却是江河日下,使用者越来越少。最近因为工作的原因,重新捡起PB。
  PFC,全称应该是powerbuilder foundation class,类似VC里的MFC,但是由于PFC本身设计问题,模块与模块之间层层嵌套,用软件工程的说法就是,耦合度太大,一直没有得到广大开发者足够的重视。
  说几句题外话,软件工程其实是一种思想,其提倡软件设计原则之一就是“高内聚低耦合”。内聚是指面向对象里对象里的封装,就是同一功能尽量封装到一个对象里,或者是子系统里;耦合是指模块之间的依赖性。高内聚可以增加程序的安全性,bug有效隔离,对于测试及后期维护都是大有裨益的。低耦合是降低模块之间的相互依赖性,便于扩展,重用。但是内聚与耦合往往是一个矛盾体,怎么有效把握这个度,就是软件设计人员的功力之所在了。
  闲话不说,继续正题。前天接到一个任务,典型的主从表,自然想到了PFC里datawindow的linkage服务。
  LinkAge服务最适合于主从表处理窗口,如下图示,左边是合同列表,右边是每个合同的明细数据。点中左边的单据,右边自动过滤出合法的单据。
 
 
  如果手工写代码,自己来实现的话,大家肯定也会想到在rowfocuschaged事件里加入过滤代码之类,但是用pfc的linkage服务的话,只需要几句话就解决了。
  首先窗口要继承w_main窗口,数据窗口要继承u_dw控件,button继承u_cb控件。
 
  // 在主数据窗口 dw_master的constructor事件代码:
// 打开基础服务,是u_dw其他服务的基础。
of_setbase(TRUE)
// 打开行选择服务(点击即自动选中)
of_SetRowSelect(True)
if isvalid(inv_rowselect) then
 // 单行选择方式 
 inv_rowselect.of_setstyle(inv_rowselect.single)
end if
// 关闭update属性
of_setupdateable(false)
 
/*下面来正题啦*/
 
// 打开linkage服务
of_SetLinkage(true)
// 服务方式设置为RETRIEVE方式,还有FILTER, SCROLL两种
inv_linkage.of_SetStyle(inv_linkage.RETRIEVE)
// 下面这句打开 行更改服务,也就是说假如从表有修改,主表换行之前会自动触发从表的update事件
inv_linkage.of_SetUpdateOnRowChange (True)
 
/*
下面打开从表的linkage服务,注意这里的写法。
从表的linkage服务注册一定要在主表之后,否则 dw_detail.inv_linkage.of_SetMaster(dw_master)这句话可能会失败。
一开始这段话我是写在dw_detail的constructor事件里,但是发现有时候会失效,经过反复跟踪,发现pb执行constructor事件是根据窗口中控件创建的先后顺序来执行的,假如先画的dw_detail后画的dw_main控件,则会先执行dw_detail的constructor事件,后执行dw_main的constructor事件。
*/
if isvalid(dw_detail) then
 dw_detail.of_setupdateable(true)
 dw_detail.of_SetLinkage(true) 
 // 注册依赖数据窗口,就是dw_detail根据dw_master刷新
 dw_detail.inv_linkage.of_SetMaster(dw_master) 
 // dw_detail数据窗口带两个参数,其条件值取自主表的列hth_master与subcono_master
 dw_detail.inv_linkage.of_Register("hth_master","hth_detail")
 dw_detail.inv_linkage.of_Register("subcono_master","subcono_detail")
 dw_detail.inv_linkage.of_SetStyle(inv_linkage.RETRIEVE)
 // Set up visual confirmation of saves and deletes.
 // This will be the initial setting for the example.
 dw_detail.inv_linkage.of_SetUpdateOnRowChange (True)
end if

// 窗口的pfc_postopen事件代码:

dw_master.inv_linkage.of_SetTransObject(sqlnew)
// 触发pfc_retrieve(),在这里会自动retrieve master及detail,一定要调用Of_retrieve()函数
dw_master.of_Retrieve()

  到这里,pfc的Linkage服务基本上就写完了。


  Pfc的服务用好了,不但简便而且严谨,毕竟人家sybase官方出的library还不是盖的,不像某些网上的公共库,那代码真叫那个……(^_^)。
  学习pfc,并不是要一开始就全部弄明白,有一个很好的老师就是pfc example,在这里几乎所有的服务都有使用的例子。有不明白的地方对照一读,再读读其中各服务组件的源码,呵呵大部分问题都能解决。
  关键一点是一定要静下心来,不要被层层嵌套,相互调用的复杂关系所迷惑,勇往直前,抓住问题点就好办了。


上一篇:逻辑推理能力测验2
下一篇:经典搞笑