组合查询

用 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_conditiondatawindow用以输入查询条件 Datawindow Object Name 为前所建数据窗口对象 d_tabular_query
cb_addcommand button增加一查询条件
cb_delcommand button删除一查询条件
cb_inscommand button插入一查询条件
cb_clearcommand button清除所有询条件
cb_okcommand button由查询条件得出结果
dw_querydatawindow查询结果 Datawindow Object Name 为空,继承后的子窗口再加入。
cb_allcommand button显示所有记录
cb_printcommand button打印查询结果
cb_exitcommand 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)

Published At
Categories with 数据库类
comments powered by Disqus