国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

PB7.0通用選字段查詢窗口的設計

2024-07-21 02:10:05
字體:
來源:轉載
供稿:網友
            pb7.0通用選字段查詢窗口的設計
本文介紹一個在pb7.0下實現的通用查詢窗口,可實現對任意表的查詢,輸出字段、排序字段、查詢條件都可以隨意指定。功能豐富,使用方便、靈活,可掛接到任何pb應用軟件中,從而大大提高軟件的開發效率。

本文是《pb7.0通用全字段查詢技術》(計算機世界周報2000年第3期)的姊妹篇。兩篇文章介紹的技術方案不同,做出查詢窗口的風格、形式和用法也不同,可同時使用,豐富系統功能。

在pb7.0中,數據庫中表的內容通常用數據窗口對象顯示輸出,而數據窗口對象一般都要事先建立。能不能在程序運行過程中根據用戶指定的字段,動態建立數據窗口對象,進一步,再通過用戶指定的條件對記錄進行過濾,達到查詢的目的?回答是肯定的。我們設計了一個窗口,不僅實現了上述功能,而且可以掛接到任何pb應用軟件當中,對任意表進行查詢、排序和打印,很有實用價值,愿與讀者分享。下面介紹實現方法和具體步驟。

一、準備  

1.首先建立一個應用程序對象serch,并對其open事件編寫如下代碼:

sqlca.dbms=profilestring("pb.ini","database","dbms","")

sqlca.dbparm=profilestring("pb.ini","database","dbparm","")

connect using sqlca;

if sqlca.sqlcode <> 0 then

messagebox ("數據庫連接失敗", sqlca.sqlerrtext)

halt //終止應用程序

end if

open(w_serch) //打開通用選字段查詢窗口

2.建立任意一個數據庫(例如,adaptive server anywhere 6.0數據庫test.db),配置odbc、profile,建立需要的若干個表。如:nhxx(農戶信息表)、tjzl(生產信息表)等。可以使用任何已有的數據庫和表。

二、窗口設計 

通用查詢是在窗口中實現的,技術核心都在窗口的控件當中。

首先,建立一個窗口對象w_serch。其中包含一個數據窗口控件dw_1,一個下拉列表ddlb_1,三個命令按鈕cb_3、cb_4、cb_5,一個單行編輯框sle_2和一個標簽tab_1。

標簽tab_1的第一個標簽頁tabpage_1上放置一個列表框lb_1、一個單行編輯框sle_1和兩個命令按鈕cb_1、cb_2。

窗口和第一個標簽頁tabpage_1如下圖所示。



為進行窗口各控件之間的數據傳遞,聲明以下四個實例變量:

string s_tn //表名變量

string s_seq="a" //排序方式變量(默認升序)

string s_cn,s_ct,s_cp //字段名、字段類型、比較符變量

string t_c[50,3] //存放表中各“字段名”、“字段類型”和“字段標題”

窗口中下拉列表框ddlb_1的作用是選擇不同的表。在它的item屬性中設置兩項:“農戶信息"和“生產信息”,作為表名提示信息。當選擇某一項時,通過代碼將對應的表名送實例變量s_tn。通過修改和添加item項以及相應代碼,即可選擇不同的表,從而實現對任意表的查詢。這里設置的“農戶信息”、“生產信息”是兩個例子。

當下拉列表框ddlb_1的選項改變時,產生selectionchanged事件,通過下面程序代碼,將選定的表名送變量s_tn,該表的各個字段名、字段類型、字段標題送數組t_c,各字段標題添加到三個標簽頁上的列表框lb_1、lb_2、lb_3中。其中,數組t_c的第一個下標表示字段序號,第二個下標值1、2、3分別表示字段名、字段類型和字段標題。這里用到了系統表pbcatcol,它的字段pbc_tnam、pbc_cnam、pbc_jtfy和pbc_hdr值分別存儲表名、字段名、字段類型和字段標題。

integer i //循環變量(數組下標)

choose case ddlb_1.text //根據表名提示信息,確定相應的表名

case "農戶信息"

s_tn="nhxx"

case "生產信息"

s_tn="tjzl"

end choose

declare tab_col cursor for //定義游標

select "pbcatcol"."pbc_tnam", //表名

"pbcatcol"."pbc_cnam", //字段名

"pbcatcol"."pbc_jtfy", //字段類型

"pbcatcol"."pbc_hdr" //字段標題

from "pbcatcol" 

where "pbcatcol"."pbc_tnam" = :s_tn ;

open tab_col; //打開游標

i=1

//字段名、類型、標題送數組

fetch tab_col into :s_tn,:t_c[i,1],:t_c[i,2],:t_c[i,3];

do while sqlca.sqlcode=0

//設置列表信息(字段標題)

tab_1.tabpage_1.lb_1.additem(t_c[i,3])

tab_1.tabpage_2.lb_2.additem(t_c[i,3])

tab_1.tabpage_3.lb_3.additem(t_c[i,3])

i++

fetch tab_col into :s_tn,:t_c[i,1],:t_c[i,2],:t_c[i,3]; 

loop 

close tab_col; //關閉游標

第一個標簽頁tabpage_1上列表框lb_1列出當前表各字段的標題,用于確定輸出字段。為了能按windows資源管理器方式選擇字段,應設置它的multiselect屬性。

命令按鈕cb_2的作用是將lb_1中選中的字段標題轉換為字段名,形成字段表列放到單行編輯框sle_1中。其clicked代碼如下:

int k //循環計數器

for k=1 to lb_1.totalitems() //列表項目數

if lb_1.state(k)=1 then //該項被選中

if sle_1.text="" then

//得到字段名

sle_1.text=t_c[k,1]

else

//拼接列名

sle_1.text=sle_1.text+","+t_c[k,1]

end if

end if

next

命令按鈕cb_1的作用是清除單行編輯框sle_1的內容。clicked代碼只有一行:

sle_1.text=""

第二個標簽頁tabpage_2如下圖所示。其中有一個列表框lb_2,一個單行編輯框sle_3,一個命令按鈕cb_6,兩個單選按鈕rb_1和rb_2。



列表框lb_2列出當前表的各字段標題。單擊某一項時,產生selectionchanged事件,下面代碼得到字段名,添加s_seq變量值(“a"或“d"),形成排序字符串放到單行編輯框sle_3。

integer k //循環計數器

for k=1 to lb_2.totalitems() //列表項目總數

if lb_2.state(k)=1 then //該項被選中

if sle_3.text="" then

//形成排序字符串

sle_3.text=t_c[k,1]+" "+s_seq

else

//拼接排序字符串

sle_3.text=sle_3.text+","+t_c[k,1]+" "+s_seq

end if

end if

next

單選按鈕rb_1、rb_2用來設置排序方式變量s_seq的值,clicked代碼分別為

s_seq="a" (升序)和

s_seq="d" (降序)

命令按鈕cb_6的作用是清除單行編輯框sle_3的內容。clicked代碼為

sle_3.text=""

第三個標簽頁tabpage_3如圖3所示。它上面放有一個列表框lb_3,一個下拉列表框ddlb_2,兩個單行編輯框sle_4和sle_5,兩個單選按鈕rb_3和rb_4,兩個命令按鈕cb_8和cb_9。



列表框lb_3列出當前表的各字段標題。單擊某一項時,產生selectionchanged事件,通過下面代碼將對應的字段名、字段類型分別送實例變量s_cn和s_ct。

int k //循環計數器

for k = 1 to lb_3.totalitems() //列表項目數

if lb_3.state(k)=1 then //該項被選中

s_cn=t_c[k,1] //取出字段名

s_ct=t_c[k,2] //取出字段類型

end if

next

下拉列表框ddlb_2列出常用關系運算符(比較符)的描述文字,選擇某一項后,產生selectionchanged事件,通過下面代碼得到相應的關系運算符送實例變量s_cp。

choose case ddlb_2.text

case "等于"

s_cp=" = "

......

case "含有"

s_cp="in"

end choose

單行編輯框sle_5用來輸入比較內容。

單擊按鈕cb_8(選中),通過以下代碼形成條件表達式字符串送單行編輯框sle_4。

if s_ct="24" then

//形成條件表達式字符串(數值類)

sle_4.text=sle_4.text+s_cn+s_cp+sle_5.text

else

//形成條件表達式字符串(字符類)

if s_cp="in" then

sle_4.text=sle_4.text+"pos("+s_cn+",'"+sle_5.text+"')>0"

else

sle_4.text=sle_4.text+s_cn+s_cp+"'"+sle_5.text+"'"

end if

end if

在形成條件表達式字符串時,要根據字段類型是數值類還是字符類決定是否用引號定界符。字段類型24對應于binary、integer、numeric型,25對應于char、varchar、date型。如果比較符為“in”,表示“包含”關系,條件表達式字符串中要使用pos函數。

單選按鈕rb_3、rb_4用來在sel_4中添加邏輯運算符,clicked代碼分別為

sle_4.text=sle_4.text+" and " (添加邏輯運算符)和

sle_4.text=sle_4.text+" or " (添加邏輯運算符)

命令按鈕cb_9的作用是清除單行編輯框sle_4的內容。clicked代碼為

sle_4.text=""

窗口中“查詢”按鈕cb_3的作用是根據選定的表名和第一個標簽頁上單行編輯框sle_1的內容形成sql句法,動態建立數據窗口對象,然后利用第二個標簽頁上單行編輯框sle_3和第三個標簽頁上單行編輯框sle_4的內容進行排序和過濾,達到查詢的目的。代碼如下:

string s_sql,s_err,s_syn,s_sty

s_sql="select "+tab_1.tabpage_1.sle_1.text+" from "+s_tn

s_sty="style(type=grid horizontal_spread = 80)"

s_syn=sqlca.syntaxfromsql(s_sql,s_sty,s_err) //形成sql句法

dw_1.create(s_syn) //建立數據窗口對象

dw_1.settransobject(sqlca)

dw_1.retrieve() //輸出結果

dw_1.setfilter(tab_1.tabpage_3.sle_4.text)

dw_1.filter( ) //進行過濾

dw_1.setsort(tab_1.tabpage_2.sle_3.text) //進行排序

dw_1.sort()

sle_2.text=string(dw_1.rowcount()) //顯示記錄數

窗口中"打印"按鈕cb_5的clicked事件代碼為dw_1.print()。

窗口中"退出"按鈕cb_4的clicked事件代碼為close(parent)。

三、使用

前面設計的查詢窗口可作為一個通用模塊掛接到任意一個pb應用軟件當中,掛接時只要修改窗口中下拉列表框ddlb_1的item屬性和selectionchanged代碼,然后打開該窗口即可。

窗口打開后,通常要做的第一件事,是單擊窗口中“表”右邊的下拉列表,選擇需要的表。表被選中后,相應的字段標題便顯示在三個標簽頁的列表框中。接下來可選擇輸出字段、排序字段,指定條件進行查詢。

1、選擇輸出字段

單擊“字段選擇”標簽頁,在列表框中選擇需要的字段。選擇方法與windows資源管理器選擇文件的方法相同。即,按住ctrl鍵,再單擊,分別選擇,按住shift鍵再單擊,或拖動,連續選擇。單擊“選中”按鈕,選擇生效。單擊“清除”按鈕,取消選擇。

2、設置查詢條件

單擊“檢索條件”標簽頁,在列表框單擊某一字段,單擊“比較符”下拉列表框,選擇一個比較符(關系運算符),在“內容”下邊的單行編輯框中輸入要查詢的部分或全部信息,單擊“選中”按鈕,部分條件表達式填入下面的單行編輯框。

如果繼續指定條件,可單擊單選按鈕“并且”或“或者”,對應的邏輯運算符填入單行編輯框,然后再用前面的方法指定部分條件。

單擊“清除”按鈕,清除單行編輯框中的條件表達式,輸出全部記錄。

指定的查詢條件在單行編輯框中,可左右滾動查看,也可直接修改。

3、設置排序字段

單擊“排序設置”標簽頁,單擊排序方式的“升序”或“降序”單選框,在列表框單擊某一字段或多個字段,查詢結果可按指定字段和方式排序。

單擊“清除”按鈕,清除排序字段,按自然順序輸出。

4、開始查詢

單擊窗口“查詢”按鈕,查詢結果顯示在數據窗口控件中。

5、打印

單擊窗口“打印”按鈕,可打印數據窗口控件中的查詢結果。
中國最大的web開發資源網站及技術社區,
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 纳雍县| 缙云县| 渭源县| 渝中区| 亚东县| 六枝特区| 怀集县| 清水河县| 竹北市| 梅河口市| 南部县| 蚌埠市| 阜平县| 丰镇市| 南和县| 准格尔旗| 哈巴河县| 乐清市| 丘北县| 桂平市| 德昌县| 宜兴市| 定西市| 高碑店市| 平湖市| 武汉市| 宁武县| 罗源县| 绥德县| 阿鲁科尔沁旗| 承德县| 元朗区| 开原市| 桦川县| 柘荣县| 陵水| 大邑县| 湖州市| 玉门市| 上虞市| 虞城县|