王超
【摘 要】 在PowerBuilder中數(shù)據(jù)窗口對(duì)象被創(chuàng)建之后,可以給它增加許多功能,本文闡述了實(shí)現(xiàn)過(guò)濾與排序的方法,方便數(shù)據(jù)查詢與瀏覽。
【關(guān)鍵詞】 數(shù)據(jù)窗口 過(guò)濾 排序
數(shù)據(jù)窗口對(duì)象被創(chuàng)建之后,可以給它增加許多功能,以便很方便地使用、操作數(shù)據(jù)窗口對(duì)象。
1 數(shù)據(jù)過(guò)濾
在定義數(shù)據(jù)源時(shí),可以使用Where和Having子句或者使用檢索參數(shù)來(lái)限定從數(shù)據(jù)庫(kù)中檢索到數(shù)據(jù)窗口對(duì)象的數(shù)據(jù)。然而,有些時(shí)候想對(duì)檢索到數(shù)據(jù)窗口對(duì)象中的數(shù)據(jù)作進(jìn)一步約束,為了實(shí)現(xiàn)這一目的,可以使用數(shù)據(jù)過(guò)濾。
1.1 在數(shù)據(jù)窗口中定制過(guò)濾條件
在數(shù)據(jù)窗口畫板下,可以定義過(guò)濾表達(dá)式,數(shù)據(jù)窗口將返回符合過(guò)濾表達(dá)式條件的記錄。過(guò)濾表達(dá)式可以使用大多數(shù)的數(shù)據(jù)窗口表達(dá)式函數(shù),也可以使用自定義函數(shù)。常用操作方法是在系統(tǒng)菜單中選擇Rows︱Filter,打開Specify Filter對(duì)話框,輸入過(guò)濾表達(dá)式存盤即可。
技術(shù)案例:用數(shù)據(jù)過(guò)濾的方法實(shí)現(xiàn)xsb(學(xué)生表)女生數(shù)據(jù)的顯示。
技術(shù)實(shí)現(xiàn)關(guān)鍵步驟:
(1)打開工作區(qū)work、連接數(shù)據(jù)庫(kù)mydata.db。
(2)創(chuàng)建數(shù)據(jù)窗口對(duì)象d_filter,風(fēng)格為Grid,數(shù)據(jù)源為Quick Select,選擇數(shù)據(jù)表xsb,選中數(shù)據(jù)表中所有字段。在系統(tǒng)菜單中選擇Rows︱Filter,打開Specify Filter對(duì)話框。輸入過(guò)濾表達(dá)式:xb=F,單擊OK按鈕返回。單擊工具欄的按鈕存盤。
(3)新建窗口w_filter,窗口的title的值為:靜態(tài)過(guò)濾,在窗口中加入一個(gè)數(shù)據(jù)窗口控件??丶麨椋篸w_1,Dataobject的值:d_filter。選中HscrollBar和VscrollBar兩個(gè)復(fù)選框。
(4)為窗口w_filter的Open事件鍵入如下腳本:
dw_1.settransobject(sqlca)
dw_1.retrieve()
(5)在數(shù)據(jù)窗口控件的旁邊加入一個(gè)“返回”按鈕,并輸入代碼:close(parent)
(6)修改應(yīng)用對(duì)象(Application)的Open事件中最后一行代碼,修改如下:
open(w_filter)
1.2 在腳本中設(shè)置或改變過(guò)濾條件
對(duì)數(shù)據(jù)窗口的過(guò)濾條件是在數(shù)據(jù)窗口的設(shè)計(jì)過(guò)程中完成的。一旦數(shù)據(jù)窗口對(duì)象在窗口中顯示數(shù)據(jù),則所設(shè)的過(guò)濾條件立即生效。但只能設(shè)置相對(duì)簡(jiǎn)單的過(guò)濾,屬于靜態(tài)過(guò)濾,采用腳本的方法會(huì)根據(jù)參數(shù)值的動(dòng)態(tài)變化完成過(guò)濾,會(huì)滿足不同用戶的各種需求。
技術(shù)案例:按學(xué)號(hào)過(guò)濾記錄(按學(xué)號(hào)進(jìn)行查詢)
技術(shù)實(shí)現(xiàn)關(guān)鍵步驟:
(1)打開工作區(qū)work、連接數(shù)據(jù)庫(kù)mydata.db。
(2)建立一個(gè)新窗口w_xh,title屬性值為:按學(xué)號(hào)查找,在窗口中加入一個(gè)DataWindow控件??丶麨閐w_1。選中HscrollBar和VscrollBar兩個(gè)復(fù)選框,存盤。
(3)在窗口的Open事件中鍵入如下腳本:
dw_1.dataobject="d_filter"
dw_1.settransobject(sqlca)
dw_1.retrieve()
dw_1.setfilter("")
dw_1.filter()
(4)在窗口的適當(dāng)位置加入靜態(tài)文本控件st_1,text屬性值為:“請(qǐng)輸入學(xué)號(hào):”,并在該控件后面加入一個(gè)單行編輯框sle_1,Text屬性值為空串(刪除none),增加一個(gè)“返回”命令按鈕cb_1。
(5)在單行編輯框?sle_1的modified事件中鍵入如下腳本:
string str,b
b=this.text
str="left(xh,"+string(len(b))+")='"+b+"'"
dw_1.setfilter(str)
dw_1.filter()
(6)【返回】命令按鈕的Clicked事件的腳本為:
close(parent)
(7)修改應(yīng)用對(duì)象(Application)的Open事件中最后一行代碼,修改如下:
open(w_xh)
(8)在主工具條上單擊執(zhí)行應(yīng)用程序,此時(shí)數(shù)據(jù)窗口顯示學(xué)生數(shù)據(jù)表中全部記錄。在單行編輯框中輸入:05,按回車鍵,只顯示學(xué)號(hào)以05開頭的記錄(模糊查詢),如果輸入05080201,則只顯示與該學(xué)號(hào)完全相等的記錄(精確查詢)。
1.3 實(shí)現(xiàn)過(guò)濾的關(guān)鍵函數(shù)
函數(shù)setfilter()僅僅是設(shè)定篩選條件,而真正的篩選過(guò)程是通過(guò)函數(shù)filter()完成的。Filter()函數(shù)的功能是根據(jù)setfilter()函數(shù)所設(shè)定的條件進(jìn)行記錄的篩選。因此,一般函數(shù)setfilter()和filter()都是先后連續(xù)使用。函數(shù)setfilter()如果調(diào)用空字符串,則消除原有的篩選條件,即調(diào)用函數(shù)setfilter(“”)將使以前設(shè)置的篩選條件作廢。篩選條件消除后再調(diào)用filter()函數(shù),將使數(shù)據(jù)窗口顯示全部記錄。
2 數(shù)據(jù)排序
2.1 在數(shù)據(jù)窗口實(shí)現(xiàn)數(shù)據(jù)排序
正如數(shù)據(jù)過(guò)濾是相對(duì)于在數(shù)據(jù)窗口的SELECT語(yǔ)句中使用WHERE子句一樣,數(shù)據(jù)排序是相對(duì)于在SELECT語(yǔ)句中使用ORDER BY語(yǔ)句。不同的是SELECT語(yǔ)句是在后臺(tái)數(shù)據(jù)庫(kù)執(zhí)行的,而數(shù)據(jù)過(guò)濾和排序都是在數(shù)據(jù)窗口內(nèi)執(zhí)行,操作的對(duì)象是已檢索到數(shù)據(jù)窗口中的數(shù)據(jù)。endprint
記錄排序是在數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)中最常見的數(shù)據(jù)組織方式。在系統(tǒng)菜單中單擊選擇Row︱Sort,用鼠標(biāo)單擊排序字段并將其拖至右面的方框中即可。如需修改,還可以將其拖回左面,重新選定排序字段。
記錄排序的另外一種方法是在在腳本中改變或設(shè)置排序條件,關(guān)鍵步驟代碼如下:
(1)打開上例的窗口對(duì)象w_filter,修改Title屬性值為:?jiǎn)螕袅袠?biāo)題排序,在窗口中定義實(shí)例變量:string order1。
(2)在數(shù)據(jù)窗口控件dw_1的constructor事件中輸入腳本如下:
order1=a
(3)在dw_1的Clicked事件中鍵入如下腳本:
string daiqiu,obj_col,str1
daiqiu=dw_1.getbandatpointer()
if left(daiqiu,4)<>"head" then return
obj_col=this.getobjectatpointer()
obj_col=left(obj_col,pos(obj_col,"~t") - 3)
if order1='a' then
order1='d'
else
order1='a'
end if
str1=obj_col+" "+order1 //此行代碼中是“ ”,不是“”
this.setsort(str1)
this.sort()
(4)存盤關(guān)閉窗口,單擊執(zhí)行應(yīng)用程序。在數(shù)據(jù)窗口標(biāo)題欄中的各列標(biāo)題上用鼠標(biāo)左鍵單擊,可見記錄順序的變化。對(duì)同一個(gè)列的標(biāo)題連續(xù)多次單擊時(shí)記錄的排列將由升序變?yōu)榻敌?,或從降序變成升序排列?/p>
2.2 實(shí)現(xiàn)排序的關(guān)鍵函數(shù)
(1)函數(shù)getbandatpointer()返回一個(gè)字符串,報(bào)告當(dāng)前鼠標(biāo)光標(biāo)所在的欄目信息。
(2)getobjectatpointer()返回一個(gè)字符串,報(bào)告當(dāng)前鼠標(biāo)光標(biāo)指向的對(duì)象名稱的相關(guān)信息(不同的對(duì)象返回的字符不同)。當(dāng)用鼠標(biāo)單擊的對(duì)象是數(shù)據(jù)列id的標(biāo)題“銷售單號(hào)”時(shí),語(yǔ)句obj_col=this.getobjectatpointer()等價(jià)于語(yǔ)句obj_col=”id_t~t1”為了取得對(duì)象名稱,可以使用語(yǔ)句:
obj_col=left(obj_col,pos(obj_col,”~t”) – 1)
從字符串”id_t~t1”中截取~t前面的部分,即對(duì)象名稱id_t,并將此名稱賦給變量obj_col。一般情況下,數(shù)據(jù)列的默認(rèn)標(biāo)題是在字段名后加”_t”。因此,實(shí)例中使用語(yǔ)句:
obj_col=left(obj_col,pos(obj_col,"~t") - 3)可取得數(shù)據(jù)列對(duì)應(yīng)的字段名。
(3)當(dāng)用鼠標(biāo)單擊的標(biāo)題是”銷售數(shù)量”時(shí),字符串變量obj_col的值為number。通過(guò)語(yǔ)句:
str1=obj_col+" "+order1
得到的字符串str1實(shí)際是”number a”或”number d”,取決于order1的值。
(4)函數(shù)setsort(“number a”)將數(shù)據(jù)記錄的排序條件設(shè)置為按number字段升序排序,其中a表示升序,d表示降序。調(diào)用函數(shù)dw_1.sort()可完成數(shù)據(jù)的重新排序過(guò)程。
3 結(jié)語(yǔ)
數(shù)據(jù)過(guò)濾也稱為篩選,即將滿足某個(gè)條件的數(shù)據(jù)記錄顯示在屏幕上,將不滿足條件的記錄隱藏起來(lái),通過(guò)數(shù)據(jù)過(guò)濾可以實(shí)現(xiàn)數(shù)據(jù)的選擇性瀏覽和使用;記錄排序是數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)中最常見的數(shù)據(jù)組織形式。
參考文獻(xiàn):
[1]盧守東.基于PowerBuilder數(shù)據(jù)窗口的查詢與篩選技術(shù)[J].電腦開發(fā)與應(yīng)用,2009(06).
[2]劉艷爭(zhēng),黃洪,徐國(guó)湖.PowerBuilder數(shù)據(jù)窗口技術(shù)的查詢方法分析[J].電腦知識(shí)與技術(shù)(學(xué)術(shù)交流),2007(02).
[3]楊楊.PowerBuilder共享數(shù)據(jù)窗口的應(yīng)用[J].科技資訊,2008(32).
[4]劉鵬遠(yuǎn).淺談PowerBuilder中常用的查詢技術(shù)[J].中國(guó)科技信息,2008(23).endprint