組合查詢

PB進行數據庫應用系統開發時,我們經常要對大量的數據進行篩選、查詢,得到符合要求的記錄,這就需要用到組合條件查詢功能。我在作應用系統開發時,就自己編寫了一個簡單而又實用的組合條件查詢模板窗口,只要用到組合條件查詢的地方,都可從此窗口繼承而來,非常方便。下面是給出其實現方法。

一、建一個外部數據源的

dataobject對象,取名爲:d_tabular_query ,各列如下:
Name  Type Lenth Dec
column_name string 10  
compare string 3  
value string 255  
and_or string 3  

       

二、建一窗口w_condition_query_templateTitle設置爲:“組合條件查詢窗口模板”,並加入控件:

控件名    類型     說明
dw_query_condition    datawindow    用以輸入查詢條件                                               Datawindow Object Name 爲前所建數據窗口對象 d_tabular_query       
cb_add   command button  增加一查詢條件
cb_del command button 刪除一查詢條件
cb_ins command button 插入一查詢條件
cb_clear command button 清除所有詢條件
cb_ok command button 由查詢條件得出結果
dw_query   datawindow 查詢結果 Datawindow Object Name 爲空,繼承後的子窗口再加入。
cb_all command button 顯示所有記錄
cb_print command button    打印查詢結果
cb_exit   command button  退出


三、編寫腳本

1、在dw_query_condition的Constractor事件中加入如下腳本:

//-------------------------------------------------------------//
// 功能說明:根據數據窗口dw_query設定可組合項,供組合查詢選擇
// 注意事項:數據窗口dw_query的對象中text命名須用默認值,
// 即:列名+ _t
// 柯建勳 於1999年4月27日
//-----------------------------------------------------------------------//

long ll_column_count
long ll_i
long ll_row
string ls_column
string ls_column_name

this.settransobject(sqlca)
ll_row = this.insertrow(0)
this.setitem(ll_row,'compare','=')
this.setitem(ll_row,'and_or','and')

ll_column_count = long(dw_query.Describe("DataWindow.Column.Count")) //總列數

this.ClearValues("column_name")
for ll_i = 1 to ll_column_count
    if dw_query.Describe("#"+string(ll_i)+".Visible") = '1' then
        ls_column = dw_query.Describe("#"+string(ll_i)+".Name") //列名
        ls_column_name = dw_query.Describe(ls_column + "_t.text") //列名對應文本
        this.SetValue("column_name", ll_i , ls_column_name + "~t" + ls_column)
    end if
next

2

、定義dw_query_condition的用戶事件ue_EnterkeydownEvent ID選擇pbm_dwnProcessEnter
當我們按下Enter鍵時,將觸發此事件。在ue_Enterkeydown事件中加入如下腳本:

//回車鍵(Enter)切換列焦點
              long ll_column_count
      long ll_column

ll_column_count = long(this.Describe("DataWindow.Column.Count"))

ll_column = this.getcolumn()
if ll_column = ll_column_count then
    cb_add.triggerevent(clicked!) //增加一行
else
    this.setcolumn(ll_column + 1)
end if

3、在cb_addClicked事件加入:

long ll_row

ll_row = dw_query_condition.insertrow(0)
dw_query_condition.setitem(ll_row,'compare','=')
dw_query_condition.setitem(ll_row,'and_or','and')
dw_query_condition.SetColumn(1)

4、在cb_delClicked事件加入:

long ll_row

ll_row = dw_query_condition.getrow()
dw_query_condition.DeleteRow(ll_row)

5、在cb_insClicked事件加入:

long ll_row
long ll_new_row

ll_row = dw_query_condition.getrow()
ll_new_row = dw_query_condition.InsertRow(ll_row)
dw_query_condition.setitem(ll_new_row,'compare','=')
dw_query_condition.setitem(ll_new_row,'and_or','and')
dw_query_condition.SetColumn(1)

6、在cb_clearClicked事件加入:

long ll_row

dw_query_condition.reset()
ll_row = dw_query_condition.insertrow(0)
dw_query_condition.setitem(ll_row,'compare','=')
dw_query_condition.setitem(ll_row,'and_or','and')

7、在cb_okClicked事件加入:

//-----------------------------------------------------------------------//
// 條件組合查詢 柯建勳 1999.04.27
//-----------------------------------------------------------------------//

long ll_rowcount
long ll_row
long ll_j
string ls_filter_condition
string ls_column
string ls_compare
string ls_value
string ls_and_or
string ls_column_type

if dw_query_condition.AcceptText() = -1 then return

ll_rowcount = dw_query_condition.rowcount()
if ll_rowcount <=0 then return

ls_filter_condition = ''
for ll_row = 1 to ll_rowcount
    ls_column = dw_query_condition.getitemstring(ll_row, 'column_name')
    ls_compare = dw_query_condition.getitemstring(ll_row, 'compare')
    ls_value = dw_query_condition.getitemstring(ll_row, 'value')
    ls_and_or = dw_query_condition.getitemstring(ll_row, 'and_or')
    ls_column_type = dw_query.Describe(ls_column + ".ColType") //
    ls_column_type = left(ls_column_type, 3)
    if ll_row = ll_rowcount then //最後一行(不加andor)
        choose case ls_column_type //根據數據類型設置Filter條件
            case 'cha' ,'var' ,'str' // 字符型
                ls_filter_condition = ls_filter_condition + &
                                        ls_column + ls_compare + "'" + ls_value + "'"
             case 'num','dec','lon','rea','ulo' // 數值型
                ls_filter_condition = ls_filter_condition + &
                                        ls_column + ls_compare + ls_value
            case 'dat','tim' //日期型
                ls_filter_condition = ls_filter_condition + "string(" + &
                                        ls_column + ")" + ls_compare + "'" + ls_value + "'"
            case else
        end choose
    else
        choose case ls_column_type //根據數據類型設置Filter條件
            case 'cha','var','str' // 字符型
                ls_filter_condition = ls_filter_condition + &
                                        ls_column + ls_compare + "'" + ls_value + "' " &
                                        + ls_and_or + " "
            case 'num','dec','lon','rea','ulo' // 數值型
                ls_filter_condition = ls_filter_condition + &
                                            ls_column + ls_compare + ls_value + " " &
                                            + ls_and_or + " "
            case 'dat','tim' //日期型
                ls_filter_condition = ls_filter_condition + "string(" +                                                          &      ls_column + ")" + ls_compare+ "" +          ls_value+ "' " &
                        + ls_and_or + " "
        case else

        end choose
    end if
next

dw_query.setredraw(false)
dw_query.setFilter(ls_filter_condition)
if dw_query.filter() = 1 and dw_query.rowcount() > 0 then
    ls_column = dw_query_condition.getitemstring(1, 'column_name')
    dw_query.setsort(ls_column + ' A')
    dw_query.sort()
    dw_query.SetColumn(ls_column)
    dw_query.selectrow(0,false)
    dw_query.selectrow(1,true)
    dw_query.setrow(1)
end if
dw_query.setredraw(true)

8、在dw_queryConstractor事件中加入如下腳本:

this.Object.DataWindow.ReadOnly="Yes"
this.settransobject(sqlca)
this.retrieve()

if this.rowcount() > 0 then
    this.selectrow(0,false)
    this.selectrow(1,true)
    this.setrow(1)
end if

9、在cb_all的Clicked事件加入:

dw_query.SetFilter('')
dw_query.Filter()
if dw_query.rowcount() > 0 then
    dw_query.selectrow(0,false)
    dw_query.selectrow(1,true)
    dw_query.setrow(1)
end if
dw_query.SetFocus()

10、在cb_printClicked事件加入:
if messagebox("提示信息","確認打印?", question!,Yesno!,1) = 1 then
if PrintSetup () = -1 then
    messagebox('出錯信息','打印機設置出錯!',Exclamation!)
    return else dw_query.Print() end if
end if


11、在cb_exitClicked事件加入:

close(parent)

發佈了24 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章