你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 计算机安全与维护
PowerBuilder数据窗口中实现模糊查询
 

  要:模糊查询是现在比较流行的查询方式,本文详细介绍了在PowerBuilder的数据窗口中实现模糊查询的方法,可实现任意列的组合查询。

关键词:PowerBuilder,数据窗口,MISSQL,查询。

 

一、引言

在使用PowerBuilder (以下简称PB)开发的MIS系统中,一般都会使用数据窗口控件(Datawindows control )来提高开发效率。而模糊查询是现在MIS系统不可缺少的查询方式。

二、设计思路及原理

       PB中数据窗口显示的数据可通过修改其SQL SELECT语句来选择,本文的查询方法即通过修改数据窗口的SELECT语句来实现。

       实现原理如下:首先,获取数据窗口的所有列名;然后在一个新窗口中设置查询的条件;

最后修改数据窗口的SQL SELECT语句实现查询。

三、实现

条件:数据库及数据源已建立好(本文数据源采用ODBC数据源,数据源名称为“test”,数据库用SQL server 2000建立。数据库中建立三个表:test,用来存放我们需查询的信息;columnname,用来存放从数据窗口中获取的列名,仅有一列,列名为“列名”;selecttable,用来形成设置查询条件的数据窗口,有四列,列名分别为“列名,“操作符”,“值”,“逻辑运算符”,本表不存放任何信息。表Columnnameselecttable可不要,但程序实现中会比较复杂。)

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_testDataObject属性设置为d_test;创建命令按钮控件cb_findcb_exit,属性cb_find.text为“查找”,cb_exit.text为“退出”。

7.新建一窗口,取名为:w_cxtj,在窗口w_cxtj中创建一datawindow control,取名为:dw_selectDataObject属性设置为d_sqlselect;创建命令按钮控件cb_okcb_cancel,属性cb_ok.text为“确定”,cb_cancel.text为“取消”。

8.为窗口w_mainopen事件编写代码如下:

dw_test.SetTransObject(SQLCA)

dw_test.Retrieve()

9.为cb_findclicked事件编写代码如下:

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_cxtjopen事件编写代码如下:

dw_select.SetTransObject(SQLCA)

dw_select.Retrieve()

dw_select.insertrow(0)

11.为数据窗口控件dw_selectitemchanged事件编写代码如下:

//如果当前列为最后一列,然后插入新列并滚动到新列

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_okclicked事件编写代码如下:

string ls_oldsql,ls_newsql

integer li_rowcount,li_row

li_rowcount = dw_select.rowcount()

ls_oldsql = w_main.dw_test.getsqlselect()      //获取dw_testselect语句

//根据查询条件构成新的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_testselect语句

       messagebox("警告","查询条件设置失败!",stopsign!)

else

       w_main.dw_test.settransobject(sqlca)

       w_main.dw_test.retrieve()

       w_main.dw_test.setsqlselect(ls_oldsql)  //恢复dw_testselect语句

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”,否则不能获取各列的列名。在输入查询条件后单击确定按钮之前应按回车键确认输入的条件。

  推荐精品文章

·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 
·2023年7月目录
·2023年6月目录 
·2023年5月目录
·2023年4月目录 
·2023年3月目录 
·2023年2月目录 
·2023年1月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089