澳门二十一点游戏赌场 澳门二十一点游戏赌场
    您现在的位置:首页 >> 软件应用 >> SQL教程 >> 内容

    组合查询

    时间:2012/7/23 20:07:59 点击:

      核心提示:用PB进行数据库应用系统开发时,我们经常要对大量的数据进行筛选、查询,得到符合要求的记录,这就需要用到组合条件查询功能。我在作应用系统开发时,就自己编写了一个简单而又实用的组合条件查询模板窗口,只要用...
    用PB进行数据库应用系统开发时,我们经常要对大量的数据进行筛选、查询,得到符合要求的记录,这就需要用到组合条件查询功能。我在作应用系统开发时,就自己编写了一个简单而又实用的组合条件查询模板窗口,只要用到组合条件查询的地方,都可从此窗口继承而来,非常方便。下面是给出其实现方法。
    一、建一个外部数据源的dataobject对象,取名为:d_tabular_query ,各列如下:
    Name TypeLenthDeccolumn_namestring10 comparestring3 valuestring255 and_orstring3 
           

    二、建一窗口w_condition_query_template,Title设置为:“组合条件查询窗口模板”,并加入控件:
    控件名   类型    说明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_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_Enterkeydown,Event 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_add的Clicked事件加入:

    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_del的Clicked事件加入:

    long ll_row

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

    5、在cb_ins的Clicked事件加入:

    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_clear的Clicked事件加入:

    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_ok的Clicked事件加入:

    //-----------------------------------------------------------------------//
    // 条件组合查询 柯建勋 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 //最后一行(不加and、or)
            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_query的Constractor事件中加入如下脚本:

    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_print的Clicked事件加入:
    if messagebox("提示信息","确认打印?", question!,Yesno!,1) = 1 then
    if PrintSetup () = -1 then
        messagebox('出错信息','打印机设置出错!',Exclamation!)
        return else dw_query.Print() end if
    end if

    11、在cb_exit的Clicked事件加入:
    close(parent)

    Tags:组合 合查 查询   
    作者:佚名 来源:不详

    共有评论 0相关评论
    发表我的评论
    • 大名:
    • 内容:
  • 澳门二十一点游戏赌场(www.0769online.com) © 2018 版权所有 All Rights Reserved. 邮箱:103150@qq.com 业务QQ:103150 手机:13549753683

    Power By Laoy8 SQL 3.0SP1 粤ICP备10098668号
  •