欢迎光临
我们一直在努力

组合查询-数据库专栏,SQL Server

建站超值云服务器,限时71元/月

用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)

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 组合查询-数据库专栏,SQL Server
分享到: 更多 (0)