组合查询

    技术2022-05-11  129

    PB 进行数据库应用系统开发时,我们经常要对大量的数据进行筛选、查询,得到符合要求的记录,这就需要用到组合条件查询功能。我在作应用系统开发时,就自己编写了一个简单而又实用的组合条件查询模板窗口,只要用到组合条件查询的地方,都可从此窗口继承而来,非常方便。下面是给出其实现方法。

    一、建一个外部数据源的dataobject对象,取名为:d_tabular_query ,各列如下:

    Name TypeLenthDec
    column_namestring10 
    comparestring3 
    valuestring255 
    and_orstring3 

           

    二、建一窗口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_printcommand 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_ilong ll_rowstring ls_columnstring ls_column_namethis.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 ifnext

    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_rowll_row = dw_query_condition.getrow()dw_query_condition.DeleteRow(ll_row)

    5、在cb_insClicked事件加入:

    long ll_rowlong ll_new_rowll_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_rowcountlong ll_rowlong ll_jstring ls_filter_conditionstring ls_columnstring ls_comparestring ls_valuestring ls_and_orstring ls_column_type

    if dw_query_condition.AcceptText() = -1 then returnll_rowcount = dw_query_condition.rowcount()if ll_rowcount <=0 then returnls_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 ifnext

    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 ifdw_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 ifdw_query.SetFocus()

    10、在cb_printClicked事件加入:if messagebox("提示信息","确认打印?", question!,Yesno!,1) = 1 then if PrintSetup () = -1 then     messagebox('出错信息','打印机设置出错!',Exclamation!)     return else dw_query.Print() end ifend if11、在cb_exitClicked事件加入:close(parent)


    最新回复(0)