`
zjut_xiongfeng
  • 浏览: 271319 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

优化你的PowerBuilder程序

阅读更多

一段程序,完成了所需要的功能固然重要,但是提高执行效率,提高代码的可重复利用性,提高程序的可读性也是很重要的。刚刚读了一个前辈的帖子,感觉受益菲浅,拿将出来与大家共享

                优化你的PowerBuilder程序
一、处理 SQL 语句
1、缓冲 SQL 语句
   在应用程序中,有时需要反复调用同一组 SQL语句,在这种情况下,可以通过在应用中为这些 SQL 建立缓冲区来提高执行性能。在缺省情况下,SQL 语句的缓冲区是关闭的,你可以通过如下语句打开它:
SQLCACHE = n
        n 表示装入缓冲区的 SQL 语句数量(缺省为0)。
例如:
dw_1.SetTransObject(sqlca)
SQLCA.dbParm = "SQLCache = 0"
dw_1.retrieve()
    如果将上例的 "SQLCache = 0" 改为 "SQLCache = 25",此句的执行效率将提高五分之一左右。但应注意缓冲区的大小,否则也将影响程序执行的性能。
    注:此方法对用 ODBC 和 ORACLE 连接的数据库非常有效。
2、捆绑变量
    请看下例:
    SQLCA.DBPARM = "DISABLEBIND=1"
    INSERT INTO DA_DH VALUES("1","河南0")
    INSERT INTO DA_DH VALUES("2","河南1")
    INSERT INTO DA_DH VALUES("3","河南2")
    INSERT INTO DA_DH VALUES("4","河南3")
    INSERT INTO DA_DH VALUES("5","河南4")
    INSERT INTO DA_DH VALUES("6","河南5")  
这里未使用捆绑变量,在插入是 PB 将重新处理每个带有新值的SQL语句。如果将上例改为:
SQLCA.DBPARM = "DISABLEBIND=0"
    INSERT INTO DA_DH VALUES("1","河南0")
    INSERT INTO DA_DH VALUES("2","河南1")
    INSERT INTO DA_DH VALUES("3","河南2")
    INSERT INTO DA_DH VALUES("4","河南3")
    INSERT INTO DA_DH VALUES("5","河南4")
    INSERT INTO DA_DH VALUES("6","河南5")  
    则系统将把 INSERT 语句按如下格式进行处理:
        INSERT INTO DA_DH VALUES(?,?)
    其中 "?" 称为占位符。系统性能将有所增强。
3、用数据窗口代替 SQL 语句
    通常,为了获得某些数据,采用数据窗口和 SQL 语句都是可行的,但是PB 对数据窗口和 SQL 语句采用不同的处理机制,因此,具有不同的效率。
例:为里检索电话档案中的用户名,可以利用 SQL 语句,将所有的数据检索到一个多行编辑中,也可以检索到一个数据窗口中。如果使用第一中方法:首先定义一个游标:
    DECLARE CUR CURSOR FOR  
    SELECT "DA_DH"."HM"
    FROM "DA_DH";
然后可以:
    STRING stxt[],st
    int li
        open cur
    do li = li + 1
        fetch cur
        into :stxt[li] ;
        st=st+stxt[li] + "~r~n"
    loop while stxt[li]<>""
    close cur;
    mle_1.txt = st
也可以使用第二种方法:  
    dw_1.settransobject(sqlca)
    dw_1.retrieve()
    利用 POWERBUILDER PROFILER 工具进行检查,对比两种方法所需时间如下
方法                     所需时间 (百分之一秒)
SQL 语句       100.9857
数据窗口                49.0133  
  由于数据窗口或 DATASTORE 使用了标准的内嵌的代码,而不是有开发人员进行全部编码,同时编译执行的速度比解释执行的速度快的多,因此在开发过程中应尽量使用数据窗口和DATASTORE..即使是必须用 SQL 语句的时候,也应该尽量将它们定义为存储过程(特别是在多用户的环境中),以提高应用程序的性能. 

二、数据窗口的编程和执行
    数据窗口是PB最值得被称道的, 其具有如下特点:
1. 多种显示方式.
2. 多种编辑方式.
3. 使用方法简单.
4. 具有多种报表形式.
5. 可实现屏幕滚动.
6. 可实现数据的有效性校验.
7. 执行性能显著提高.
8. 编程工作变少.
9. 可以在数据窗口内部实现数据哭的更新.
下面, 我将介绍一些用于提高数据窗口性能的技术.
1. 减少连接数据库的次数
连库操作是非常影响执行速度的操作. 因此在程序中,一旦与数据库连接后就应当尽量保持与数据库的连接, 减少连接数据库的次数.PowerBuilder 提供里两个函数来建立数据窗口与事务对象的连接:
        SetTrans()  
        SetTransObject()
在程序中应当尽量使用 SETTRANSOBJECT(), 因为SETTRANS() 函数在每次调用 RETRIEVE(), UPDATE() 等函数之后, 都要执行数据库的连接和断开操作.
2. 下拉数据窗口与表的连接
    对于数据库服务器来说, 表的连接操作是一项非常大的开销, 而 POWERBUILDER 提供的下拉数据窗口在某些情况下可以代替表的连接操作.例如, 为了在数据窗口上显示用户的电话号码和姓名:如果用表的连接的方法, 数据窗口对应的 SQL 语句应是这样的:
        SELECT "DA_DH"."DHHM",
                "DA_HTH"."DWM"
        FROM "DA_HTH",
        "DA_DH"
        WHERE ("DA_HTH"."DHHM"="DA_DH"."DHHM")
同样的程序可用下拉数据窗口来完成, 这里不再具体介绍.但是, 应当注意, 以上两种方法究竟哪一种数据更快, 与表的结构, 表的数量, 连接的方法等均有关系, 应当具体分析.
3. 共享数据
在一个应用程序中, 某些数据需要频繁的使用, 如果在每次使用时都从数据库中进行检索, 则需占用大量的服务器资源和网络资源. 为了减少开销, 可以在客户端对这些数据只进行一次检索, 然后允许其它任务共享这些数据.  
    例如, 如果有两个数据窗口, 都需要从第三方表中检索出用户的电话号码, 且此列用下拉数据窗口给出. 如果每次都对电话号码进行检索, 则性能较低. 因此, 可以单独建立一个关于电话号码的数据窗口. 在每次打开窗口时, 首先将电话号码检索到此数据窗口中, 然后另外两个数据窗口中关于电话号码的下拉数据窗口可以共享此数据窗口中的数据.
在窗口的 OPEN 事件中编写如下程序:
        dw_1.settransobject(sqlca)
        dw_2.settransobject(sqlca)  
        dw_3.settransobject(sqlca)  
        // 检索 dw_1  
        dw_1.retrieve()
        // 使 DW_2 的下拉数据窗口共享 DW_1
        datawindowchild child1
        dw_2.getchild('dhhm',child1)
        child1.settransobject(sqlca)
        dw_1.sharedata(child1)
        // 使 DW_2 的下拉数据窗口共享 DW_1
        datawindowchild child2
        dw_3.getchild('dhhm',child2)
        child2.settransobject(sqlca)
        dw_1.sharedata(child1)
    使用这种方法, 避免了各个数据窗口间物理的拷贝数据, 因此减少了空间上的开销,提高了应用程序的综合性能.
4. 数据窗口间数据的拷贝
    如果需要在数据窗口间共享数据, 应当尽量使用 SHAREDATA() 函数, 但是, SHAREDATA() 函数并不是物理地在数据窗口间拷贝数据, 如工在显示数据的同时, 还要对数据进行操作, 则需要进行数据的拷贝.
例如, 要求将 DW_1 中选定的行拷贝到 DW_2 中:
    在窗口的 OPEN 事件中编程:
        dw_1.settransobject(sqlca)
        dw_2.settransobject(sqlca)
        dw_1.retrieve()
    在数据窗口 DW_1 的 ROWFOCUSCHANGED 事件中编写下列程序:  
        long lr  
        lr = dw_1.selectrow(0,false)
        lr = dw_1.getrow()
        lr = dw_1.selectrow(lr,true)
要完成从 DW_1 到 DW_2 的拷贝工作, 有两种方法:
第一种:  
在按钮 "拷贝" 的 CLICKED 事件中编程
long lr  
lr = dw_1.getselectedrow(0)
dw_1.rowscopy(lr,lr,primary!,dw_2,100,primary!)
执行程序, 利用 POWERBUILDER PROFILER 得出所需时间为 1.7034(百分之一秒)
第二种:  
在按钮 "拷贝" 的 CLICKED 事件中编程
dw_2.object.data = da_1.object.data.selected
执行程序, 利用 POWERBUILDER PROFILER 得出所需时间为 0.8062(百分之一秒)
5. 数据窗口属性的访问和修改
A. 数据窗口属性的访问
    在程序中访问数据窗口的属性有下列几种方法:
    A1. 采用点表达式访问
    A2. 应用多个独立的 DESCRIBE() 函数访问
    A3. 只使用一个 DESCRIBE() 函数, 采用复合参数访问多个属性
上面三中方法, 通常第一种方法最慢, 第三种方法最快.  
例如:  
    在窗口的 OPEN 事件中
    DW_1.SETTRANSOBJECT(SQLCA)
    DW_1.RETRIEVE()
第一种方法:  
在检索按钮的 CLICKED 事件中编程.
    string dx, dy, dh, dw
    dx = dw_1.object.da_dh.x
    dy = dw_1.object.da_dh.y
    dx = dw_1.object.da_dh.height
    dy = dw_1.object.da_dh.width
    st_1.text =dx+","+dy+","+dh+","+dw
第二种方法:
    string dx, dy, dh, dw
    dx=dw_1.describe("da_dh.x")
    dx=dw_1.describe("da_dh.y")
    dx=dw_1.describe("da_dh.height")
    dx=dw_1.describe("da_dh.width")
    st_1.text =dx+","+dy+","+dh+","+dw
第三种方法:
    string dx, dy, dh, dw
    st_1.text=dw_1.describe("da_dh.x" +&
                            "da_dh.y" +&
                            "da_dh.height" +&
                            "da_dh.width")
实验证明, 第三种方法的速度是最快的. 但是程序的可读性最差.
B. 数据窗口属性的修改
在程序中修改数据窗口的属性有下列几种方法:
    A1. 采用点表达式修改
    A2. 应用多个独立的 MODIFY() 函数访问
    A3. 只使用一个 MODIFY() 函数, 采用复合参数访问多个属性
上面三中方法, 通常第一种方法最慢, 第三种方法最快.  
例如:  
    在窗口的 OPEN 事件中
    DW_1.SETTRANSOBJECT(SQLCA)
    DW_1.RETRIEVE()
第一种方法:  
在检索按钮的 CLICKED 事件中编程.
    DW_1.SETREDRAW(FALSE)
    dw_1.object.da_dh.x = 18
    dw_1.object.da_dh.y = 16
    dw_1.object.da_dh.height = 100
    dw_1.object.da_dh.width = 200
    DW_1.setredraw(true)
    st_1.text =dx+","+dy+","+dh+","+dw
第二种方法:
    DW_1.SETREDRAW(FALSE)
    dw_1.modify("da_dh.x = 18")
    dw_1.modify("da_dh.y = 16")
    dw_1.modify("da_dh.height = 100")
    dw_1.modify("da_dh.width = 200")
    dw_1.setredraw(true)
第三种方法:
    dw_1.modify("da_dh.x=18" +&
                "da_dh.y=16" +&
                "da_dh.height=100" +&
                "da_dh.width=200")
实验证明, 第三种方法的速度是最快的. 但是程序的可读性最差.注意, 在方法一和方法二中, 都使用的 setredraw() 函数以减少屏幕的重绘, 否则, 执行速度将严重下降.
6. 数据窗口中数据的访问  
在程序中, 经常会需要动态的修改数据窗口中的数据. 对此, PB 提供了多种方法, 各种方法在性能上会有一些差异.
A. 数据窗口中数据的访问
    目的: 将数据窗口中的电话号码存放在一个数组中.请比较下面两中方法.
    方法一:
    string da_dh[]
    long ll,i  
    ll = dw_1.rowcount()
    for i = ll to 1 stet -1
    da_dh[i] = dw_1.getitemstring(i,"dhhm")
    next
    方法二:  
    string da_dh[]
    da_dh[] = dw_1.object.dhhm.current
测试发现, 第二种方法比第一种方法快将近一倍. 数据量越大这种差异越明显.
B. 数据窗口中数据的修改
    目的: 修改数据窗口中的电话号码列的值.
    请比较下面两中方法.
    方法一:
    dw_1.setitem(i,"dhhm",l_name)
    方法二:  
    dw_1.object.name[i] = l_name
测试发现, 第二种方法比第一种方法快将近一倍. 数据量越大这种差异越明显.
7. 数据窗口事件对性能的影响
对于数据窗口控制中经常发生的事件, 应当尽量减少其中的程序代码.
特别是如下事件:
    A. itemchanged
    b. editchanged
    c. itemfocuschanged
    d. pbm_dwnkey
    e. rowfocuschanged
    f. retrieverow
在这些事件中的任何处理程序, 都会降低应用程序的处理速度. 所以应当尽量减少这些事件中的处理程序, 必要时, 可以考虑只将重要的代码放在这些事件中, 而将剩余的代码放在一个传递的事件中.
例如,如果需要用到数据窗口的 ROWFOCUSCHANGED 事件,可以为数据窗口定义一用户事件 "UE_RE",而在数据窗口的 ROWFOCUSCHANGED 事件中写如下代码:
   PARENT.postevent("ue_re")
    在 UE_RE 事件中再编写相应的程序代码,如:
    string code  
    dw_1.selectrow(0,false)
    dw_1.selectrow(rownum,true)
    code = getitemstring(dw_1,rownum,"dhhm")
    dw_2.retrieve(code)
另外, 为了获得当前行号,应尽量使用数据窗口的 CURRENTROW 变量,而少用 GETROW() 函数。
8、 数据窗口的列名称与列编号
对数据窗口的某列进行访问, 可以采用该列的名称, 也可以使用该列的编号,
例如:
采用列编号:
    dw_1.object.data[ll_row,2]
dw_1.getitemstring(3,2)
采用列名称表示某列:
    dw_1.object.article_text[ll_row]
    dw_1.getitemstring(3,"dhhm")
    dw_1.setitem(3,"date",1999-03-31)
    ...
对于以上两种方法, 如果只进行一次查询, 在速度上并没有太大的区别,如过需要循环访问数据窗口上的某一列, 则速度上的差异就表现的比较明显,才用第一种方法要快, 但是程序的可读性比较差。但是, 在使用函数时(如 GETITEM() 和 setitem() ), 执行速度往往没有很大差别。
9、 计算域
数据窗口的计算域会对数据的操作性能产生影响。 如果数据窗口中包含许多复杂的计算域,将严重影响数据窗口的执行速度。

分享到:
评论

相关推荐

    powerbuilder论文合集(13篇)

    分布式PowerBuilder设计 基于INI文件的PowerBuilder事务对象参数读取与加密 基于PowerBuilder10_5数据报表系统的设计与实现 基于PowerBuilder的SQLServer异地数据库...基于PowerBuilder的一种优化DataWindow研究与实践

    PB POWERBUILDER 字符串 数组 相互 转换 转化

    *如果你将这个程序放在你的网站上,我希望你能同时加上本站的链接 | | * | * | * *老字符串转数组430579 | |新字符串转数组299600 | |老数组转字符串212863 | |新数组转字符串187 * |以上是200000个数组测试结果 | |...

    powerbuilder最新论文合集

    分布式PowerBuilder设计 基于INI文件的PowerBuilder事务对象参数读取与加密 基于PowerBuilder10_5数据报表系统的设计与实现 基于PowerBuilder的SQLServer异地数据库...基于PowerBuilder的一种优化DataWindow研究与实践

    PB12.5生成QrCoder源码 #PowerBuilder #二维码 #QR码

    使用PowerBuilder12.5开发语言,生成QR二维码,纯代码生成不是图片,适用于对PB开发有一定了解的人员或学习,代码简单易懂,带有注释说明,附带exe程序,可直接运行调用。 PowerBulider12.5源码文件,本人正在使用,...

    Powerbuilder9.0实用教程源代码

    第01章 认识PowerBuilder 9.0、第05章 创建应用程序、第06章 创建窗体、第07章 创建菜单和工具栏、第10章 应用程序的调试和发布、第11章 典型小型实例赏析、第12章 图书管理系统实例和第13章 学生选课系统实例。...

    pb技术精髓,不用不要后悔

    * 第十三讲:资源管理 * 第十四讲:PowerBuilder的事件 * 第十五讲:PowerBuilder的事件(续) * 第十六讲:生成可重用的数据窗口 * 第十七讲:编写行选择函数 * 第十八讲:优化数据库查询 ...

    PowerBuilder 应用开发系列讲座 chm 格式.rar

    PowerBuilder 应用开发系列讲座 chm,涉及内容有数据库事务、PowerBuilder调用DLL程序使用规则、面向对象的程序设计、打印输出、函数控制、游标使用、数据库查询优化、资源管理等。

    PowerDesigner教程

    PowerDesigner简介  PowerDesigner是Sybase公司的CASE工具集,使用它可以方便地对管理信息...它可与许多流行的数据库设计软件,例如:PowerBuilder,Delphi,VB等相配合使用来缩短开发时间和使系统设计更优化。

    Sybase.PowerDesigner.v15.3.0.3248.part16

    它可与许多流行的数据库设计软件,例如:PowerBuilder,Delphi,VB等相配合使用来缩短开发时间和使系统设计更优化。 文件太大,分割成21个文件,包含crack文件。 ***此版本仅用于学习用,请支持购买正版***

    针对Oracle数据库及其应用程序的优化

    在数据库领域中的各种应用软件大量涌现,有Visual Foxpro,Power Builder等等,但其中Oracle是这个领域中最优秀也是最流行的大型数据库应用软件。本文就在Oracle中如何优化数据库及其应用程序进行了研 究。

    Power Designer 简易教程

    Power Designer是Sybase公司的CASE工具集,使用它可以方便地对管理信息系统进行分析设计,它几乎...它可与许多流行的数据库设计软件,例如:PowerBuilder,Delphi,VB等相配合使用来缩短开发时间和使系统设计更优化。

    powerbuild(pb)代码美化工具,又名注释工具

    PBCOMMENT 5.0 及更高的版本新增了自动格式化 PB 代码的语句的功能,可以自动将代码缩进格式和大小写等比较混乱进行自动处理优化,使您的代码看起来十分的漂亮(这个功能很实用哦,您不妨用用 :)) )。 PBCOMMENT ...

    powerDesign9.0 中文手册

    PowerDesigner是Sybase公司的CASE工具集,使用它可以方便地对管理信息系统进行分析设计,它几乎...它可与许多流行的数据库设计软件,例如:PowerBuilder,Delphi,VB等相配合使用来缩短开发时间和使系统设计更优化。

    Power Designer 实用教程

    9.5版的。版本低,但内容还是挺全的。 PowerDesigner是Sybase公司的CASE工具集,使用它可以方便地...它可与许多流行的数据库设计软件,例如:PowerBuilder,Delphi,VB等相配合使用来缩短开发时间和使系统设计更优化。

    PowerDesigner.zip

    PowerDesigner是Sybase公司的CASE工具集,使用它可以方便地对管理信息系统进行分析设计,它几乎...它可与许多流行的数据库设计软件,例如:PowerBuilder,Delphi,VB等相配合使用来缩短开发时间和使系统设计更优化。

    Sybase Powerdesigner15.1简要使用手册中文

    Sybase Powerdesigner15.1简要使用手册中文 PowerDesigner是Sybase公司的CASE工具集,是图形化、易于使用的企业 ...例如:PowerBuilder、Delphi、VB等相配合使用来缩短开发时间和使系统设计 更优化。

    PowerDesigner_15.1详细安装和破解步骤

    PowerDesigner是Sybase公司的CASE工具集,使用它可以方便地对管理信息系统进行分析设计,它几乎...它可与许多流行的数据库设计软件,例如:PowerBuilder,Delphi,VB等相配合使用来缩短开发时间和使系统设计更优化。

    PowerDesigner使用教程

    本文所有文字及图片皆为gzllm(处长)原创,发表于COC未经作者许可,请勿随意转载 PowerDesigner...它可与许多流行的数据库设计软件,例如:PowerBuilder,Delphi,VB等相配合使用来缩短开发时间和使系统设计更优化。

    数据库查询优化技术整理

    在应用项目的实施中发现,许多程序员在利用一些前端数据库开发工具(如PowerBuilder、Delphi等)开发数据库应用程序时,只注重用户界面的华丽,并不重视查询语句的效率问题,导致所开发出来的应用系统效率低下,资源...

Global site tag (gtag.js) - Google Analytics