设置下拉数据窗口不自动检索以提高检索和插入速度

 在使用PB开发程序过程中你会发现,如果数据窗口或数据存储的栏位编辑风格为下拉数据窗口并且设置自动检索,首次检索数据或插入行,系统将自动检索下拉数据窗口数据,这有利于数据的显示,但会降低检索性能,特别是对于有多个栏位编辑风格为下拉数据窗口并且设置自动检索或(且)下拉数据窗口数据量较大时性能下降很明显。
其实,如果我们只关心数据值而不关心显示值,我们可以将栏位全部设置为不自动检索,你可以通过建一个没有下拉数据窗口编辑风格栏位或有下拉数据窗口编辑风格栏位但不自动检索的数据窗口对象,但一般的开发人员喜欢重用数据窗口对象,这就需要动态地改变栏位的自动检索属性。如果你已经这样做了,相对之前,性能会得到提升。
常见的做法是先将已设置自动检索的栏位取出来,然后设置不自动检索,数据窗口或数据存储检索或插入后再恢复栏位的自动检索属性,如果该数据窗口或数据存储根本无需显示数据,你可以只设置不自动检索,之后就检索或插入数据。
以下是采用常见做法,首先使用of_getautoretrievecolumnname()获取自动检索下拉数据窗口数据的栏位列表,然后调用of_setautoretrieve()设置栏位不自动检索,调用retrieve()检索数据,最后调用of_setautoretrieve()恢复栏位自动检索属性。of_getautoretrievecolumnname()、of_setautoretrieve()函数封装于n_datastore对象(继承自datastore),读者可以参考笔者所写码以通过设置下拉数据窗口不自动检索以提高检索和插入速度。
 
//n_datastore lds_buffer
String ls_autoretrievecolumnname_list[]
 
Lds_buffer.of_getautoretrievecolumnname(ls_autortrievecolumnname_list)// 取自动检索下拉数据窗口数据的栏位列表
Lds_buffer.of_setautoretrieve(ls_autoretrievecolumnname_list,false)// 设置栏位不自动检索
Lds_buffer.retrieve()
Lds_buffer.of_setautoretrieve(ls_autoretrievecolumnname_list,true)// 恢复栏位自动检索属性
 
/*******************************************************************
函数名称:of_getautoretrievecolumnname()
参数:     as_colname_list ref string 栏位名称
返回值: long 自动检索下拉数据窗口数据的栏位个数
功能描述:取自动检索下拉数据窗口数据的栏位列表
创建人: 康剑民
创建日期:2005-12-26
版本号: V1.0
*******************************************************************/
integer i,li_colcount,li_return=0
string ls_colname_list[]
 
li_colcount = integer(this.describe("datawindow.column.count"))
for i = 1 to li_colcount
       if this.describe("#" + string(i) + ".dddw.autoretrieve") = "yes" then
              li_return ++
              ls_colname_list[li_return] = this.describe("#" + string(i) + ".name")
       end if
next
as_colname_list = ls_colname_list
 
return li_return
 
/*******************************************************************
函数名称:of_setautoretrieve()
参数:     as_colname_list[] string 栏位名称列表
                      ab_autoretrieve boolean 是否自动检索下拉数据窗口数据
返回值: long 是否成功(1表示成功,-1表示失败)
功能描述:设置是否自动检索下拉数据窗口数据(性能优化)
创建人: 康剑民
创建日期:2005-12-26
版本号: V1.0
*******************************************************************/
integer i
string ls_modify,ls_error,ls_col_list[],ls_modify_colname
string ls_autoretrieve
long ll_return
 
if ab_autoretrieve then
       ls_autoretrieve = 'yes'
else
       ls_autoretrieve = 'no'
end if
 
for i = 1 to upperbound(as_colname_list)
       if isnumber(as_colname_list[i]) then
              ls_modify_colname = "#" + as_colname_list[i]
       else
              ls_modify_colname = as_colname_list[i]
       end if
       if this.describe(ls_modify_colname + ".edit.style") = 'dddw' then
              ls_modify = ls_modify + "~t" + ls_modify_colname + ".edit.autoretrieve = " + ls_autoretrieve
       end if
next       
 
if lenw(ls_modify) > 0 then
       ls_error = this.modify(ls_modify)
       if len(ls_error) > 0 then
              ll_return = -1
       else
              ll_return = 1
       end if
else
       ll_return = 1
end if
 
return ll_return

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值