摘 要:模糊查询是现在比较流行的查询方式,本文详细介绍了在PowerBuilder的数据窗口中实现模糊查询的方法,可实现任意列的组合查询。
关键词:PowerBuilder,数据窗口,MIS,SQL,查询。
一、引言
在使用PowerBuilder (以下简称PB)开发的MIS系统中,一般都会使用数据窗口控件(Datawindows control )来提高开发效率。而模糊查询是现在MIS系统不可缺少的查询方式。
二、设计思路及原理
在PB中数据窗口显示的数据可通过修改其SQL SELECT语句来选择,本文的查询方法即通过修改数据窗口的SELECT语句来实现。
实现原理如下:首先,获取数据窗口的所有列名;然后在一个新窗口中设置查询的条件;
最后修改数据窗口的SQL SELECT语句实现查询。
三、实现
条件:数据库及数据源已建立好(本文数据源采用ODBC数据源,数据源名称为“test”,数据库用SQL server 2000建立。数据库中建立三个表:test,用来存放我们需查询的信息;columnname,用来存放从数据窗口中获取的列名,仅有一列,列名为“列名”;selecttable,用来形成设置查询条件的数据窗口,有四列,列名分别为“列名”,“操作符”,“值”,“逻辑运算符”,本表不存放任何信息。表Columnname和selecttable可不要,但程序实现中会比较复杂。)
1.新建一Application,取名为:test。
2.新建数据窗口d_test,显示风格为Grid,采用Quick Select数据源,选择表test的所有列建立数据窗口。
3.新建数据窗口d_colname,显示风格为Grid,采用Quick Select数据源,选择表columnname的所有列建立数据窗口。
4.新建数据窗口d_sqlselect,显示风格为Grid,采用Quick Select数据源,选择表selecttable的所有列建立数据窗口。设置列的 Edit Style Type(编辑风格类型)如下:列“列名”为“DropDownDW”(下拉式数据窗口),DataWindow(数据窗口)为“d_colname”,Display Column(显示列)和Data Column(数据列)均为“列名”;列“操作符”为“DropDownListBox”(下拉列表框),Code Table(代码表)如图1所示;列“值”为“Edit”(编辑框);列“逻辑运算符”为“DropDownListBox”(下拉列表框),Code Table(代码表)如图2所示
5.新建一窗口,取名为:w_main。
6.在窗口w_main中创建一datawindow control,取名为:dw_test,DataObject属性设置为d_test;创建命令按钮控件cb_find和cb_exit,属性cb_find.text为“查找”,cb_exit.text为“退出”。
7.新建一窗口,取名为:w_cxtj,在窗口w_cxtj中创建一datawindow control,取名为:dw_select,DataObject属性设置为d_sqlselect;创建命令按钮控件cb_ok和cb_cancel,属性cb_ok.text为“确定”,cb_cancel.text为“取消”。
8.为窗口w_main的open事件编写代码如下:
dw_test.SetTransObject(SQLCA)
dw_test.Retrieve()
9.为cb_find的clicked事件编写代码如下:
string ls_colname
integer li_columncount,li_column
dw_test.Retrieve()
li_columncount = integer(dw_test.object.datawindow.column.count) //取列数
delete from columnname;
for li_column = 1 to li_columncount
dw_test.setcolumn(li_column)
ls_colname = dw_test.GetColumnName() //获取列名,并存入表columnname中
INSERT INTO columnname
( 列名 )
VALUES ( :ls_colname ) ;
next
open( w_cxtj)
10.为窗口w_cxtj的open事件编写代码如下:
dw_select.SetTransObject(SQLCA)
dw_select.Retrieve()
dw_select.insertrow(0)
11.为数据窗口控件dw_select的itemchanged事件编写代码如下:
//如果当前列为最后一列,然后插入新列并滚动到新列
if this.getcolumn() = 4 and this.getrow()=this.rowcount() then
this.insertrow(0)
this.scrolltorow(this.getrow()+1)
this.Setcolumn( 1 )
end if
12.为cb_ok的clicked事件编写代码如下:
string ls_oldsql,ls_newsql
integer li_rowcount,li_row
li_rowcount = dw_select.rowcount()
ls_oldsql = w_main.dw_test.getsqlselect() //获取dw_test的select语句
//根据查询条件构成新的select语句字符串
if li_rowcount > 0 then
for li_row = 1 to li_rowcount
if li_row = 1 then
ls_newsql = ls_oldsql+ "where" +"("+ dw_select.getitemstring(li_row,1) + dw_select.getitemstring(li_row,2) + "'" + dw_select.getitemstring(li_row,3) + "')"
else
ls_newsql = ls_newsql + dw_select.getitemstring(li_row - 1,4) +"("+dw_select.getitemstring(li_row,1) + dw_select.getitemstring(li_row,2) + "'" + dw_select.getitemstring(li_row,3) + "')"
end if
next
end if
if w_main.dw_test.setsqlselect( ls_newsql ) = -1 then //修改dw_test的select语句
messagebox("警告","查询条件设置失败!",stopsign!)
else
w_main.dw_test.settransobject(sqlca)
w_main.dw_test.retrieve()
w_main.dw_test.setsqlselect(ls_oldsql) //恢复dw_test的select语句
end if
13.为Application test加入open事件代码如下:
sqlca.DBMS="ODBC"
sqlca.database="test"
sqlca.userid=""
sqlca.dbpass=""
sqlca.dbparm="ConnectString='DSN=test;UID=sa;PWD='"
connect using sqlca;
if sqlca.sqlcode<>0 then
messagebox("不能连接","连接数据库失败!")
halt
else
open (w_main)
end if
四、结束语
本文的程序在PB 8.0下调试通过,在实现过程中表selectable可以不建,而采用外部数据源建立数据窗口d_sqlselect。据窗口d_test各列的Tab Order不能设置为“0”,否则不能获取各列的列名。在输入查询条件后单击确定按钮之前应按回车键确认输入的条件。
|