在PowerBuilder中使用DataStore完成查詢條件的記憶
發(fā)表時間:2023-08-12 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]北京延慶某部科技處 王永生 ---- 隨著MIS開發(fā)工具的日益完善,人們對信息檢索的要求也越來越高,以往每次查詢時都由用戶輸入,然后進(jìn)行檢索的方式已越來越無法滿足用戶的要求,許多用戶都希望系統(tǒng)具有自...
北京延慶某部科技處 王永生
---- 隨著MIS開發(fā)工具的日益完善,人們對信息檢索的要求也越來越高,以往每次查詢時都由用戶輸入,然后進(jìn)行檢索的方式已越來越無法滿足用戶的要求,許多用戶都希望系統(tǒng)具有自動記憶查詢條件的功能,這樣經(jīng)常使用的查詢條件就不必重復(fù)輸入了。
PowerBuilder(以下簡稱PB)中的DataStore(數(shù)據(jù)存儲)可以幫助開發(fā)人員方便地解決這一問題。PB作為C/S環(huán)境下的數(shù)據(jù)庫開發(fā)工具,其面向?qū)ο、可視化以及方便移植等特點(diǎn)引人注目,成為目前非常流行的數(shù)據(jù)庫前端開發(fā)工具。本文以一個文獻(xiàn)索引數(shù)據(jù)庫為實(shí)例,詳細(xì)介紹如何在PB中利用DataStore實(shí)現(xiàn)查詢條件的記憶。
---- DataStore是非可視的數(shù)據(jù)窗口控件,它能夠?yàn)閼?yīng)用程序存儲數(shù)據(jù)而不消耗任何圖形資源。除了一些可視特征外,它的功能及行為與數(shù)據(jù)窗口控件相同。因此,我們可以利用DataStore的特點(diǎn)方便地記憶和維護(hù)查詢條件。
---- 第一步,在數(shù)據(jù)庫中建立一個查詢條件表,其中包含每個要用到的條件字段(如標(biāo)題、文獻(xiàn)來源、開始日期、結(jié)束日期等)和一個日期字段、時間字段。該表用來保存最近使用的10個(如果需要可以保存任意個)不同條件,每個條件就是一條記錄,后兩個字段(日期、時間)用來記載條件的使用時間。
---- 第二步,創(chuàng)建一個包含查詢條件表中所有字段的數(shù)據(jù)窗口對象
dw_condation,按使用時間的先后排序。進(jìn)行查詢條件設(shè)置時,
---- 第三步,構(gòu)造如下圖的查詢條件設(shè)置窗口。
---- 四個復(fù)選框?qū)?yīng)四個條件字段,左、右方向按鈕用來瀏覽設(shè)置最近使用過的條件。
---- 第四步,為窗口事件及各控件編寫相應(yīng)的程序。
---- 定義窗口實(shí)例變量:
datastore ids_Data
long currentrow
窗口的Open事件:
ids_Data = Create DataStore
//創(chuàng)建數(shù)據(jù)存儲實(shí)例
ids_Data.DataObject = "dw_condation"
//將dw_condation數(shù)據(jù)窗口對象與ids_Data連接
ids_Data.SetTransObject(sqlca)
ids_data.retrieve()
if ids_data.rowcount() >1 then
//設(shè)置當(dāng)前條件為最后一次使用的條件
pb_3.enabled=true
currentrow=ids_data.rowcount()
trigger event ue_setquery(ids_data.rowcount())
end if
窗口自定義事件ue_setquery:
string bt,source
//標(biāo)題、文獻(xiàn)來源
date start_day,end_day//開始日期、結(jié)束日期
long page
//頁號
//根據(jù)參數(shù)rownum從數(shù)據(jù)存儲實(shí)例中得到各條件值
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]
//初始化各窗口控件的狀態(tài)
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
//分別設(shè)置各個條件值
if not isnull(bt) and trim(bt)< >"" then
cbx_1.checked=true
sle_1.enabled=true
sle_1.text=bt
end if
if not isnull(source) and trim(source)< >"" then
cbx_2.checked=true
ddlb_1.enabled=true
ddlb_1.text=source
end if
if isnull(start_day) or
start_day=date("1900-1-1") then
em_1.text=string(today(),"yyyy-mm-dd")
else
cbx_3.checked=true
em_1.enabled=true
em_1.text=string(start_day,"yyyy-mm-dd")
end if
if isnull(end_day) or
end_day=date("1900-1-1") then
em_2.text="2050-1-1"
else
cbx_3.checked=true
em_2.enabled=true
em_2.text=string(end_day,"yyyy-mm-dd")
end if
if not isnull(page) and page< >0 then
cbx_4.checked=true
em_3.enabled=true
em_3.text=string(page)
end if
窗口的Close事件:
destroy ids_data
//清除數(shù)據(jù)存儲實(shí)例
pb_3(向前按鈕)的Clicked事件:
if currentrow >1 then
//設(shè)置前一個條件為當(dāng)前條件
currentrow=currentrow - 1
trigger event ue_setquery(currentrow)
pb_4.enabled=true
if currentrow=1 then this.enabled=false
end if
pb_4(向后按鈕)的Clicked事件:
if currentrow< ids_data.rowcount() then
//設(shè)置后一條件為當(dāng)前條件
currentrow=currentrow + 1
pb_3.enabled=true
if currentrow=ids_data.rowcount()
then this.enabled=false
trigger event ue_setquery(currentrow)
end if
pb_1(確定按鈕)的Clicked事件:
string bt,source,sqltext,sql_all,sql_title,
sql_source,sql_date,
sql_page
date start_day,end_day
long page,rownum,rowcount
boolean exist
//根據(jù)用戶設(shè)置的條件動態(tài)生成查詢SQL語法
if cbx_1.checked then
bt=sle_1.text
sql_title='"index"."title" like '
+"'%"+bt +"%'"
end if
if cbx_2.checked then
source=ddlb_1.text
sql_source=' and "index"."source" like '
+"'%"+source +"%'"
end if
if cbx_3.checked then
start_day=date(em_1.text)
end_day=date(em_2.text)
sql_date='and"index"."date" >='+"'"
+string(start_day,"yyyy.mm.dd")
+"'"+'and '+'"index"."date"
< ='+"'"+string(end_day,"yyyy.mm.dd")
+"'"
end if
if cbx_4.checked then
page=long(em_3.text)
sql_page=' and "index"."page"='+string(page)
end if
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
//判斷該條件是否已經(jīng)存在
if 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 if
next
if not exist then
//條件不存在,記憶新條件
if rowcount< 10 then
else
ids_data.deleterow(1)
end if
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 if
ids_data.update()
//根據(jù)生成的SQL語句,
修改主窗口中的數(shù)據(jù)窗口語法,
進(jìn)行查詢
w_index.dw_1.setsqlselect(sqltext)
close(parent)
if isvalid(w_index)
then w_index.dw_1.retrieve()
pb_2(取消按鈕)的Clicked事件:
close(parent)
---- 以上程序在Pb6.5、Sybase SQL Anywhere5.0下運(yùn)行通過,讀者對它稍加修改就可應(yīng)用在自己開發(fā)的MIS系統(tǒng)中。