[返回]
计算机世界2001年第3期

PB7.0通用全字段查询技术

吉林省四平师范学院计算机系 李 政

查询是数据库管理系统中不可缺少的功能。本文介绍一种在 PB( PowerBuilder)下实现的可对任意指定的表、对所有字段、按任意指定条件进行查询的技术。该查询模块简单、实用,可挂接在任意 PB应用软件中,提高软件的开发效率。

在 PB 7.0中,数据库中各表的内容通过数据窗口对象显示输出。在输出过程中,我们可以通过程序设置过滤条件,达到对记录筛选查询的目的。但是如何让用户尽可能方便、灵活地指定过滤条件,使查询更加有效和迅速,是软件开发时必须要考虑的问题。

本文介绍一种方法,对任意数据窗口对象,只要在任意字段上输入一个值,然后选择一个关系运算符,就可以得到一个该字段的关系表达式,进一步,还可以产生一个一般的逻辑表达式作为过滤条件,进行过滤,达到查询的目的。下面介绍实现方法和具体步骤。

准备

1.首先建立一个应用程序对象 Search,并对其 Open事件编写如下代码:

SQLCA.DBMS=ProfileString(“ PB.INI",“ Database” ,“ DBMS” ,“” )

SQLCA.DbParm=ProfileString(“ PB.INI” ,“ Database” ,“ DbParm” ,“” )

CONNECT USING SQLCA;

If sqlca.sqlcode <> 0 Then

MessageBox(“数据库连接失败” ,

sqlca.sqlerrtext)

//终止应用程序

Halt

End If

//打开通用全字段查询窗口

open(w_search)

2.在应用程序对象中定义以下两个全局变量:

//关系运算符变量

string op_r

//复合查询标志变量

boolean cmx=False

3.建立一个数据库(例如 Adaptive Server Anywhere 6.0数据库 test.db),配置 ODBC、 Profile,建立需要的若干个表。如: nhxx(农户信息表)、 scxx(生产信息表)等。也可以使用任何已有的数据库和表。

4.建立需要的数据窗口对象。例如: d_nhxx(农户信息、网格样式)、 d_scxx(生产信息、自由表样式)等。也可以使用任何已有的数据窗口对象。

5.建立一个弹出式菜单 m_popup,其中只有一个菜单条选项 m_r(操作符),具体菜单项定义如下表:

菜单项文本

Clicked事件代码

等于

op_r='='

不等于

op_r='<>'

小于

op_r='<'

小于等于

op_r='<='

大于

op_r='>'

大于等于

op_r='>='

含有

op_r='in'

窗口设计

通用查询是在窗口中实现的,核心技术都体现在窗口的控件设计当中。

首先,建立一个如图 1所示的数据窗口对象。

其中包含一个数据窗口控件 dw_1, 4个图形按钮 pb_1、 pb_2、 pb_3、 pb_4,一个下拉列表 ddlb_1, 3个命令按钮 cb_1、 cb_2、 cb_3, 3个单行编辑框 sle_1、 sle_2、 sle_3。

下拉列表框 ddlb_1的作用是选择不同的表。在它的 item属性中设置两项:“农户信息 "和“生产信息”,作为表名提示信息。当选择某一项时,通过代码设置与该表对应的数据窗口对象。通过修改和添加 item项以及相应代码,可以在数据窗口控件中动态挂接任意数据窗口对象,从而实现对任意表的查询。这里设置的“农户信息”、“生产信息”两项,只是例子。

当下拉列表框 ddlb_1的选项改变时,产生 SelectionChanged事件,通过下面程序代码,确定与表对应的数据窗口对象,动态挂接到数据窗口控件 dw_1上,显示其内容,以便下一步查询。

//表名提示信息,数据窗口对象名

string t_n_s,t_n_d

//取出表名提示信息

t_n_s=ddlb_1.text

CHOOSE CASE t_n_s //确定相应的数据窗口对象名

CASE“农户信息”

t_n_d=“ d_nhxx”

CASE“生产信息”

t_n_d=“ d_scxx”

END CHOOSE

//重新设置窗口标题

parent.title=“通用全字段查询窗口→”+ t_n_s

//动态指定数据窗口对象

parent.dw_1.dataobject=t_n_d

parent.dw_1.SetTransObject(SQLCA)

parent.dw_1.Retrieve()

//显示记录总数

sle_1.text=string(dw_1.RowCount())

//显示当前记录号

sle_2.text=string(dw_1.GetRow())

//激活“擦除条件”的“ Clicked”事件

Parent.cb_1.TriggerEvent(“ Clicked” )

按钮 cb_1(擦除条件)的作用是清除单行编辑框 sle_3中的查询条件表达式,并将复合查询标志 cmx置成“假”。复合查询标志 cmx为“真”表示条件表达式中带有逻辑运算符(只使用 AND),否则为简单的关系表达式。 cb_1的 Clicked事件只有两行代码:

cmx=False //清复合查询标志

sle_3.text=“” //清查询条件表达式

“开始查询”按钮 cb_2的作用是从单行编辑框 sle_3中取出查询条件表达式,并以此作为过滤条件,对数据窗口控件的内容进行过滤,实现查询。 cb_2的 Clicked事件代码为:

//设置过滤条件

dw_1.SetFilter(sle_3.text)

//激活过滤

dw_1.Filter( )

//显示记录总数

sle_1.text=string(dw_1.RowCount())

//显示当前记录号

sle_2.text=string(dw_1.GetRow())

为了在数据窗口控件中输入查询内容,同时又不破坏表中原来的数据,我们给数据窗口控件 dw_1的 ItemChanged事件编写一行代码:

//拒绝数据

return 1

再给 ItemError事件编写一行代码:

//拒绝数据并改变焦点

return 3

为显示当前记录号,在数据窗口控件 dw_1的 rowFocusChanged事件中编写一行代码:

//显示当前记录号

sle_2.text=string(dw_1.GetRow())

接下来,最重要的一件事是对数据窗口控件 dw_1的 rButtonDown事件编码。当单击鼠标右键时,需要弹出一个关系描述符菜单,根据选择的菜单项,确定对应的关系运算符,并保存到全局变量 op_r中。比如,选择“小于等于”,得到关系运算符“ <=” ,且赋给全局变量 op_r。然后,取得当前列名、类型和当前控件的内容,组合成一个关系表达式。如果复合查询标志 cmx的值为“真”,则用逻辑运算符“ AND”组成逻辑表达式。关系表达式或逻辑表达式作为过滤条件字符串保存到 sle_3.text中,显示在屏幕上并供“开始查询”按钮的 Clicked事件引用。

数据窗口控件 dw_1的 rButtonDown事件代码如下:

//列名、列类型、列类型的左 4个字符、列信息

string FieldName,FieldType,FT,cts

//菜单变量声明

m_popup m_new

//建立弹出菜单

m_new=create m_popup

//弹出关系符描述菜单

m_new.m_ r .PopMenu(parent .pointerX(),parent .pointerY()) //取得当前列名

FieldName=GetColumnName()

//取得当前列类型

FieldType=Describe(FieldName+“ .ColType” )

//列名左边四个字符

FT=left(FieldType,4)

//取得当前控件内容

cts=GetText()

//复合条件

If cmx Then sle_3.text=sle_3.text+“ AND”

//形成过滤条件 (数值型 )

If FT=“ numb” or FT=“ deci” or FT=“ long” or FT=“ real” THEN

sle_3.text=sle_3.text+ FieldName+ op_r+ cts

Else //形成过滤条件 (C,d,t型 )

If op_r=“ in” Then

sle_3.text=sle_3.text+“ Pos(”+ FieldName+“ ,‘”+ cts+“ ')>0”

Else

sle_3.text=sle_3.text+ FieldName+ op_r+“‘”+ cts+“ '”

End If

End If

//置复合条件标志

cmx=True

//返回

Return

用来控制当前记录的 4个图形按钮 pb_1、 pb_2、 pb_3、 pb_4的 Clicked事件代码分别为:

//第一条记录

dw_1.ScrollToRow(1)

//前一记录

dw_1.ScrollPriorRow()

//下一记录

dw_1.ScrollNextRow()

//最后一条记录

dw_1.ScrollToRow(dw_1.RowCount())

每改变当前记录后,都用一行代码 :sle_2.text=string(dw_1.GetRow())显示当前记录号。

“退出 "按钮 cb_3的 Clicked事件代码为 :

close(parent)

至此,一个可对任意数据窗口对象、任意字段设置条件的通用查询窗口设计完成。

使用

前面设计的查询窗口可作为一个通用模块挂接在任意一个 PB应用软件当中,挂接时只要修改窗口中下拉列表框 ddlb_1的 item属性和 Clicked代码,然后打开该窗口即可。

窗口打开后,通常要做的第一件事是单击窗口中“表名”右边的下拉列表,选择需要的表所对应的数据窗口对象。某一数据窗口对象被选中后,便显示在数据窗口控件中,同时改变窗口标题并显示出记录总数和当前记录号。接下来便可指定条件进行查询。

1.设置查询条件

单击某一字段的编辑区,输入要查询的部分或全部信息,单击鼠标右键,弹出一个菜单,从菜单中选择需要的某一项(关系运算符),即可在下面“查询条件”右边的单行编辑框中显示出关系表达式。单行编辑框中形成由逻辑运算符“ AND”连接多个关系表达式的逻辑表达式。

2.开始查询

按 Alt+ Q或单击“开始查询”按钮,查询结果、满足条件的记录数、当前记录号显示在窗口。

3.擦除和修改条件

用前面方法设置的查询条件表达式在单行编辑框中可以左右滚动查看。如果操作有误或想重新设置查询条件,可按 Alt+ C或单击“擦除条件”按钮,也可在单行编辑框中直接修改查询条件。

条件表达式被擦除后,再进行查询,得到的便是当前数据窗口对象的所有记录。

4.记录翻阅单击窗口上的四个图形按钮或用 Ctrl+ Home、 PgUp或↑、 PgDn或↓、 Ctrl+ End,或拖动滚动条,均可实现对记录的翻阅。

结束语

本文介绍的通用查询窗口精巧、灵活、实用性强,已用于多个管理信息系统,提高了软件的开发效率。