PowerBuilder中通用组合条件查询模板的实现

PowerBuilder中通用组合条件查询模板的实现收藏
 
PowerBuilder中通用组合条件查询模板的实现

 

(待修改) 未经许可,不得转载  ,谢谢合作!

1999.07.06 Kukoc

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

 

四、继承调用

      经过上面步骤,组合条件查询继承窗口模板就建好了,我们马上就可把它派上用场了。作为例子,我们通过继承窗口w_condition_query_template创建一窗口w_condition_query_template,并将datawindow 对象d_grid_关联至数据窗口d_query。运行后效果如下:

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yishanhai/archive/2008/11/13/3294370.aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值