datastore.edb:在PowerBuilder中利用DataStore实现查询条件的记忆

北京延庆某部科技处 王永生

---- 随着MIS开发工具日益完善人们对信息检索要求也越来越高以往每次查询时都由用户输入然后进行检索方式已越来越无法满足用户要求许多用户都希望系统具有自动记忆查询条件功能这样经常使用查询条件就不必重复输入了
PowerBuilder(以下简称PB)中DataStore(数据存储)可以帮助开发人员方便地解决这问题PB作为C/S环境下数据库开发工具其面向对象、可视化以及方便移植等特点引人注目成为目前非常流行数据库前端开发工具本文以个文献索引数据库为例子详细介绍如何在PB中利用DataStore实现查询条件记忆

---- DataStore是非可视数据窗口Control控件它能够为应用存储数据而不消耗任何图形资源除了些可视特征外功能及行为和数据窗口Control控件相同因此我们可以利用DataStore特点方便地记忆和维护查询条件

---- 第在数据库中建立个查询条件表其中包含每个要用到条件字段(如标题、文献来源、开始日期、结束日期等)和个日期字段、时间字段该表用来保存最近使用10个(如果需要可以保存任意个)区别条件每个条件就是条记录后两个字段(日期、时间)用来记载条件使用时间

---- 第 2步创建个包含查询条件表中所有字段数据窗口对象
dw_condation按使用时间先后排序进行查询条件设置时

---- 第 3步构造如下图查询条件设置窗口

---- 4个复选框对应 4个条件字段左、右方向按钮用来浏览设置最近使用过条件

---- 第 4步为窗口事件及各Control控件编写相应

---- 定义窗口例子变量:

datastore ids_Data
long currentrow

窗口Open事件:
ids_Data = Create DataStore
//创建数据存储例子
ids_Data.DataObject = "dw_condation"
//将dw_condation数据窗口对象和ids_Data连接
ids_Data.SetTransObject(sqlca)
ids_data.retrieve

ids_data.rowcount >1 then
//设置当前条件为最后次使用条件
pb_3.enabled=true
currentrow=ids_data.rowcount
trigger event ue_query(ids_data.rowcount)
end

窗口自定义事件ue_query:
bt,source
//标题、文献来源
date start_day,end_day//开始日期、结束日期
long page
//页号
//根据参数rownum从数据存储例子中得到各条件值
bt=ids_Data.Object.bt[rownum]
source=ids_Data.Object.source[rownum]
start_day=ids_Data.Object.begin[rownum]
end_day=ids_Data.Object.end[rownum]
page=ids_Data.Object.page[rownum]
//化各窗口Control控件状态
cbx_1.checked=false
cbx_2.checked=false
cbx_3.checked=false
cbx_4.checked=false
sle_1.enabled=false
ddlb_1.enabled=false
em_1.enabled=false
em_2.enabled=false
em_3.enabled=false
//分别设置各个条件值
not isnull(bt) and trim(bt)< >"" then
cbx_1.checked=true
sle_1.enabled=true
sle_1.text=bt
end

not isnull(source) and trim(source)< >"" then
cbx_2.checked=true
ddlb_1.enabled=true
ddlb_1.text=source
end

isnull(start_day) or
start_day=date("1900-1-1") then
em_1.text=(today,"yyyy-mm-dd")

cbx_3.checked=true
em_1.enabled=true
em_1.text=(start_day,"yyyy-mm-dd")
end

isnull(end_day) or
end_day=date("1900-1-1") then
em_2.text="2050-1-1"

cbx_3.checked=true
em_2.enabled=true
em_2.text=(end_day,"yyyy-mm-dd")
end

not isnull(page) and page< >0 then
cbx_4.checked=true
em_3.enabled=true
em_3.text=(page)
end

窗口Close事件:
destroy ids_data
//清除数据存储例子

pb_3(向前按钮)Clicked事件:
currentrow >1 then
//设置前个条件为当前条件
currentrow=currentrow - 1
trigger event ue_query(currentrow)
pb_4.enabled=true
currentrow=1 then this.enabled=false
end

pb_4(向后按钮)Clicked事件:
currentrow< ids_data.rowcount then
//设置后条件为当前条件
currentrow=currentrow + 1
pb_3.enabled=true
currentrow=ids_data.rowcount
then this.enabled=false
trigger event ue_query(currentrow)
end

pb_1(确定按钮)Clicked事件:
bt,source,sqltext,sql_all,sql_title,
sql_source,sql_date,
sql_page
date start_day,end_day
long page,rownum,rowcount
boolean exist
//根据用户设置条件动态生成查询SQL语法
cbx_1.checked then
bt=sle_1.text
sql_title='"index"."title" like '
+"'%"+bt +"%'"
end

cbx_2.checked then
source=ddlb_1.text
sql_source=' and "index"."source" like '
+"'%"+source +"%'"
end

cbx_3.checked then
start_day=date(em_1.text)
end_day=date(em_2.text)
sql_date='and"index"."date" >='+"'"
+(start_day,"yyyy.mm.dd")
+"'"+'and '+'"index"."date"
< ='+"'"+(end_day,"yyyy.mm.dd")
+"'"
end
cbx_4.checked then
page=long(em_3.text)
sql_page=' and "index"."page"='+(page)
end

sqltext='SELECT "index"."num", ' &
+'"index"."title", ' &
+'"index"."source", ' &
+'"index"."date", ' &
+'"index"."page", ' &
+'"index"."other" ' &
+' FROM "index" ' &
+' WHERE '+sql_title +sql_source
+sql_date+sql_page &
+' ORDER BY "index"."num" ASC '
rowcount=ids_data.rowcount

for rownum=1 to rowcount
//判断该条件是否已经存在
ids_data.object.data[rownum,1]=bt and &
ids_data.object.data[rownum,2]=source and &
ids_data.object.data[rownum,3]=start_day and &
ids_data.object.data[rownum,4]=end_day and &
ids_data.object.data[rownum,5]=page then
ids_data.object.data[rownum,6]=now
ids_data.object.data[rownum,7]=today
exist=true
exit
end
next

not exist then
//条件不存在记忆新条件
rowcount< 10 then

ids_data.deleterow(1)
end

rownum=ids_data.insertrow(0)
ids_data.object.data[rownum,1]=bt
ids_data.object.data[rownum,2]=source
ids_data.object.data[rownum,3]=start_day
ids_data.object.data[rownum,4]=end_day
ids_data.object.data[rownum,5]=page
ids_data.object.data[rownum,6]=now
ids_data.object.data[rownum,7]=today
end

ids_data.update
//根据生成SQL语句
修改主窗口中数据窗口语法
进行查询
w_index.dw_1.sqlselect(sqltext)
close(parent)
isvalid(w_index)
then w_index.dw_1.retrieve

pb_2(取消按钮)Clicked事件:
close(parent)

---- 以上在Pb6.5、Sybase SQL Anywhere5.0下运行通过读者对它稍加修改就可应用在自己开发MIS系统中
Tags:  pbdatastore datastoreerror datastore datastore.edb

延伸阅读

最新评论

发表评论