转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件使用 >> 常用软件 >> 正文
PowerBuilder应用开发系列讲座(32)         

PowerBuilder应用开发系列讲座(32)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:913 更新时间:2009/4/24 21:43:51
p align="center">为下拉式数据窗口建立缓冲区

  在上两期文章中,我们提到了在Master/Detail风格的数据窗口中使用ShareData()函数,可以保持两个数据窗口中数据的一致性。其实这个函数还有着其他很多不同的用途。这里我们就另举一例。
  许多最终用户在使用PowerBuilder应用程序时抱怨运行速度太慢。一般来讲,一个企业级的客户/服务器应用程序执行速 度的瓶颈并不在于代码执行的效率,而在于应用向后台数据库查询数据时等待后台响应的时间。改进应用软件速度的关键在于减少应用向后台数据库查询的数据量,减少网络的数据流量,其中减少下拉式数据窗口的查询量就是一个有效的方法。
  一般的,为了用户输入方便和避免废键,在数据窗口某些数据列使用下拉式数据窗口是程序员经常采用的方法。运行一个应用,某一段时间所处理一般都是相同或相近的事务,这样同时打开的不同窗口和数据窗口却很可能同时采用相同的下拉式数据窗口。在显示这些窗口前,当系统执行主数据窗口的Retrieve()命令时,总是要首先到数据库中查询这些下拉式数据窗口的数据。如果我们能够减少这些查询,进而减少网络流量,和后台数据库服务器进行语法分析,设计查询算法和执行查询的时间,这将能使应用的性能有较大的提高。这里我们采用的方法是在客户端建立一个保存结果集的缓冲区,并使用ShareData函数使缓冲区的数据同下拉式数据窗口的主缓冲区建立共享。
  我们将这个数据缓冲区建立在一个不可视的窗口上,在这个窗口为每一个不同的结果集创建一个不同的用户对象。首先我们创建一个标准的不可视的用户对象,在可选的对象类型中选择DataStore,我们并不需要为这个用户对象编写任何代码,只要将其保存为u_dsa即可。
  我们创建一个窗口w_resultset_server作为结果集服务器,在这个不可视的窗口中声明这样一些实例变量:

  //缓冲区大小
  PROTECTEDintegerii_cache_size
  //缓冲区
  PROTECTEDu_dsaids_cache[]
  //我们用以检索结果集的事务对象
  PROTECTEDtransactioni_trans
  //更新结果集的时间(设为30秒)
  PROTECTEDlongil_refresh_interval=1800
  //更新的起始时刻
  PROTECTEDtimeitm__last_refresh
  使用dddw的窗口将通过fw_share_dddw()函数来访问w_resultset_server窗口,这个函数将接受一个数据窗口和一个列名作为参数 。

//publicfunctionintegerfw_share_dddw
//参数:DataWindowadw_parent
//stringas_column_name表现形式为dddw列名
integerli_cache_idx
DataWindowchilddwc
stringls_dataobject_name
//dddw所使用dataobject的名称
ls_dataobject_name=adw_parent.Describe(as_column_name+“.dddw.name” )
IFls_dataobject_name=“”THENRETURN0
//该dataobject是否存在缓冲区中
li_cache_idx=fw_find_dataobject(ls_dataobject_name)
IFli_cache_idx$#@60;1THENRETURN0
//同子数据窗口共享数据
adw_parent.GetChild(as_column_name,dwc)
RETURNids_cache[li_cache_idx].ShareData(dwc)

  在这个函数中,为确定下拉式数据窗口所使用的数据窗口的名称,首先使用了Describe()函数来获得该列的dddw.name属性。如果该列名没有找到,或该列的表现形式不是下拉式数据窗口,这个函数的返回值为“”;接下来调用fw_find_dataobject()函数,以确定这个数据结果集是否在缓冲区中,如不存在,就新创建一个;最后使用ShareDate()函数将缓冲区中结果集同下拉 式数据窗口共享数据。
  这个函数中调用的fw_find_dataobject()函数如下,它接受一个as_dataobject参数,并使用DO...WHILE循环在缓冲区中查找该对象的结果集,如找到将lb_found设为True,否则设为False。

//protectedfunctionintegerfw_find_dataobject
//参数:stringas_dataobject
integerli_cache_idx=1
booleanlb_found=FALSE
u_dsalds_new_entry
//定位dataobject所在的缓冲区
DOWHILE(NOTlb_found)and(li_cache_idx$#@60;=ii_cache_size)
IFids_cache[li_cache_idx].dataobject=as_dataobjectTHEN
lb_found=TRUE
ELSE
li_cache_idx++
ENDIF
LOOP
//如果该dataobject不存在与缓冲区中,则创建一个新入口
IFNOTlb_foundTHEN
IFOpenUserObject(lds_new_entry)$#@60;1THEN
RETURN0
ENDIF
lds_new_entry.dataobject=as_dataobject
IFlds_new_entry.SetTransObject(i_trans)$#@60;1THEN
RETURN0
ENDIF
IFlds_new_entry.Retrieve()$#@60;0THEN
RETURN0
ENDIF
ii_cache_size++
ids_cache[ii_cache_size]=lds_new_entry
li_cache_idx=ii_cache_size
ENDIF
RETURNli_cache_idx

  如果该数据对象不存在于缓冲区中,我们将使用OpenUserObject()函数新创建一个用户对象,并将这个DataStore的DataObject属性赋值为as_dataobject,然后调用SetTransObject()函数和Retrieve()函数查询结果。
  在这个隐含窗口的Open事件中键入下列代码:

i_trans=sqlca
itm_last_refresh=Now()
//设置起始时间
Timer(60)

  在窗口函数fw_find_dataobject()中调用SetTransObject()时使用的 事务变量是i_trans,这样做的目的是为了软件更为通用。我们在Open事件中将这个实例变量赋值为SQLCA,您也可以根据需要给予不同的赋值。我们使用了一个实例变量itm_last_refresh作为计时器,并且设定每一分钟中断一次,以使窗口根据不同的需要更新缓冲区中的数据。
  下面的一个窗口函数fw_refresh_all用以更新缓冲区数据:

//publicsubroutinefw_refresh_all()
integerli_cache_idx
//更新所以缓冲区
FORli_cache_idx=1TOii_cache_size
ids_cache[li_cache_idx].Retrieve()
NEXT
//重新设置更新缓冲区的时间
i_tm_last_refresh=Now()

  我们在w_resultset_server的Open事件中对一个计时器进行了初始化,同时还初始化了一个计时变量itm_last_refresh,我们剩下的工作就是在Timer事件中,编写代码根据设定的时间来调用fw_refresh_all()。

timeltm_current_time
integerli_cache_idx
//当前时间
current_time=Now()
//考虑过午夜的特殊情况
IFltm_current_time$#@60;itm_last_refreshTHEN
fw_refresh_all()
//检测已过的时间间隔
ELSEIFRelativeTime(itm_last_refresh,ii_refresh_interval)
$#@60;=ltm_current_timeTHEN
fw_refresh_all()
ENDIF

  一般在一个大型应用中,这个对象中往往要有几十个结果集。您可能并不希望系统同时更新所有的数据,您可以修改T imer事件中的代码,使系统根据一定的算法,轮流更新缓冲区中的数据,而不使用户感觉到延迟。值得指出的是,在一般的数据窗口中的dddw,除了在创建时系统会自动对该数据窗口中的所有dddw进行Retrieve()以外,在运行过程中如果没有程序明确指明某个dddw执行Retrieve()函数,系统是不会自动更新其数据的。因此采用本文推荐的方法还可以保持下拉式数据窗口中的数据接近后台服务器中的最新数据。如果您在应用中必须使下拉式数据窗口中的数据为后台的最新数据,也可以调用wf_refresh_resultset()强制缓冲区更新数据,使用的参数有两个,数据窗口名称和列名:

//publicfunctionbooleanfw_refresh_resultset()
//参数:DataWindowadw_parent
//stringas_column_name数据窗口中为dddw的列名
integerli_cache_idx
stringls_dataobject_name
//dddw所使用dataobject的名称
ls_dataobject_name=adw_parent.Describe(as_column_name+“.dddw.name” )
IFls_dataobject_name=“”THENRETURNFalse
//该dataobject是否存在缓冲区中
li_cache_idx=fw_find_dataobject(ls_dataobject_name)
IFli_cache_idx$#@60;1THENRETURNFalse
//更新缓冲区内的数据
ids_cache[li_cache_idx].Retrieve()
RETURNTrue

  在这段代码中,我们首先使用fw_find_dataobject函数找到要更新数据的dddw所使用的缓冲区,然后更新该缓冲区的数据即可。


[办公软件]在sybase中插入图片、PDF、文本文件  [办公软件]安装Sybase ASE
[办公软件]linux指令大全(完整篇)  [办公软件]Linux新手入门常用命令大全
[办公软件]在RedHat Linux 9里安装gaim0.80  [办公软件]浅谈Linux 下Java 1.5 汉字方块问题解决方法
[办公软件]Linux程序员必读:中文化与GB18030标准  [办公软件]linux指令大全
[办公软件]制作Linux启动盘的四种方法  [办公软件]Linux文件系统的反删除方法
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · 办公软件  · 系统软件
    · 常用软件  · 聊天工具
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台