在使用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