数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
组合查询

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

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_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_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_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_row

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

5、在cb_insClicked事件加入:

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_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_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 //最后一行(不加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 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_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 if
dw_query.SetFocus()

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


11、在cb_exitClicked事件加入:

close(parent)




相关文章

相关软件