PB7.0通用选字段查询窗口的设计

** PB7.0 ** ** 通用选字段查询窗口的设计 ** ** **

本文介绍一个在 PB7.0 下实现的通用查询窗口,可实现对任意表的查询,输出字段、排序字段、查询条件都可以随意指定。功能丰富,使用方便、灵活,可挂接到任何 PB 应用软件中,从而大大提高软件的开发效率。

本文是《 PB7.0 通用全字段查询技术》(计算机世界周报 2000 年第 3 期)的姊妹篇。两篇文章介绍的技术方案不同,做出查询窗口的风格、形式和用法也不同,可同时使用,丰富系统功能。

在 PB7.0 中,数据库中表的内容通常用数据窗口对象显示输出,而数据窗口对象一般都要事先建立。能不能在程序运行过程中根据用户指定的字段,动态建立数据窗口对象,进一步,再通过用户指定的条件对记录进行过滤,达到查询的目的?回答是肯定的。我们设计了一个窗口,不仅实现了上述功能,而且可以挂接到任何 PB 应用软件当中,对任意表进行查询、排序和打印,很有实用价值,愿与读者分享。下面介绍实现方法和具体步骤。

一、准备

1 .首先建立一个应用程序对象 serch ,并对其 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_serch) // 打开通用选字段查询窗口

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

二、窗口设计

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

首先,建立一个窗口对象 w_serch 。其中包含一个数据窗口控件 dw_1 ,一个下拉列表 ddlb_1 ,三个命令按钮 cb_3 、 cb_4 、 cb_5 ,一个单行编辑框 sle_2 和一个标签 tab_1 。

标签 tab_1 的第一个标签页 tabpage_1 上放置一个列表框 lb_1 、一个单行编辑框 sle_1 和两个命令按钮 cb_1 、 cb_2 。

窗口和第一个标签页 tabpage_1 如下图所示。

为进行窗口各控件之间的数据传递,声明以下四个实例变量:

_ string s_tn _ // 表名变量

_ string s_seq="A" _ // 排序方式变量 ( 默认升序 )

_ string s_cn,s_ct,s_cp _ // 字段名、字段类型、比较符变量

_ string t_c[50,3] _ // 存放表中各“字段名”、“字段类型”和“字段标题”

窗口中下拉列表框 ddlb_1 的作用是选择不同的表。在它的 item 属性中设置两项:“农户信息 " 和“生产信息”,作为表名提示信息。当选择某一项时,通过代码将对应的表名送实例变量 s_tn 。通过修改和添加 item 项以及相应代码,即可选择不同的表,从而实现对任意表的查询。这里设置的“农户信息”、“生产信息”是两个例子。

当下拉列表框 ddlb_1 的选项改变时,产生 selectionchanged 事件,通过下面程序代码,将选定的表名送变量 s_tn ,该表的各个字段名、字段类型、字段标题送数组 t_c ,各字段标题添加到三个标签页上的列表框 lb_1 、 lb_2 、 lb_3 中。其中,数组 t_c 的第一个下标表示字段序号,第二个下标值 1 、 2 、 3 分别表示字段名、字段类型和字段标题。这里用到了系统表 pbcatcol ,它的字段 pbc_tnam 、 pbc_cnam 、 pbc_jtfy 和 pbc_hdr 值分别存储表名、字段名、字段类型和字段标题。

integer i // 循环变量 ( 数组下标 )

CHOOSE CASE ddlb_1.text // 根据表名提示信息,确定相应的表名

CASE " 农户信息 "

s_tn="nhxx"

CASE " 生产信息 "

s_tn="tjzl"

END CHOOSE

DECLARE tab_col CURSOR FOR // 定义游标

SELECT "pbcatcol"."pbc_tnam", // 表名

"pbcatcol"."pbc_cnam", // 字段名

"pbcatcol"."pbc_jtfy", // 字段类型

"pbcatcol"."pbc_hdr" // 字段标题

FROM "pbcatcol"

WHERE "pbcatcol"."pbc_tnam" = :s_tn ;

OPEN tab_col; // 打开游标

i=1

// 字段名、类型、标题送数组

FETCH tab_col into :s_tn,:t_c[i,1],:t_c[i,2],:t_c[i,3];

DO While SQLCA.SQLCode=0

// 设置列表信息(字段标题)

tab_1.tabpage_1.lb_1.AddItem(t_c[i,3])

tab_1.tabpage_2.lb_2.AddItem(t_c[i,3])

tab_1.tabpage_3.lb_3.AddItem(t_c[i,3])

i++

FETCH tab_col into :s_tn,:t_c[i,1],:t_c[i,2],:t_c[i,3];

Loop

CLOSE tab_col; // 关闭游标

第一个标签页 tabpage_1 上列表框 lb_1 列出当前表各字段的标题,用于确定输出字段。为了能按 windows 资源管理器方式选择字段,应设置它的 multiselect 属性。

命令按钮 cb_2 的作用是将 lb_1 中选中的字段标题转换为字段名,形成字段表列放到单行编辑框 sle_1 中。其 clicked 代码如下:

int k // 循环计数器

For k=1 to lb_1.totalitems() // 列表项目数

If lb_1.state(k)=1 then // 该项被选中

If sle_1.text="" then

// 得到字段名

sle_1.text=t_c[k,1]

Else

// 拼接列名

sle_1.text=sle_1.text+","+t_c[k,1]

End If

End If

Next

命令按钮 cb_1 的作用是清除单行编辑框 sle_1 的内容。 clicked 代码只有一行:

sle_1.text=""

第二个标签页 tabpage_2 如下图所示。其中有一个列表框 lb_2 ,一个单行编辑框 sle_3 ,一个命令按钮 cb_6 ,两个单选按钮 rb_1 和 rb_2 。

列表框 lb_2 列出当前表的各字段标题。单击某一项时,产生 selectionchanged 事件,下面代码得到字段名,添加 s_seq 变量值(“ A" 或“ D" ),形成排序字符串放到单行编辑框 sle_3 。

integer k // 循环计数器

For k=1 to lb_2.totalitems() // 列表项目总数

If lb_2.state(k)=1 then // 该项被选中

If sle_3.text="" then

// 形成排序字符串

sle_3.text=t_c[k,1]+" "+s_seq

Else

// 拼接排序字符串

sle_3.text=sle_3.text+","+t_c[k,1]+" "+s_seq

End If

End If

Next

单选按钮 rb_1 、 rb_2 用来设置排序方式变量 s_seq 的值, clicked 代码分别为

s_seq="A" (升序)和

s_seq="D" (降序)

命令按钮 cb_6 的作用是清除单行编辑框 sle_3 的内容。 clicked 代码为

sle_3.text=""

第三个标签页 tabpage_3 如图 3 所示。它上面放有一个列表框 lb_3 ,一个下拉列表框 ddlb_2 ,两个单行编辑框 sle_4 和 sle_5 ,两个单选按钮 rb_3 和 rb_4 ,两个命令按钮 cb_8 和 cb_9 。

列表框 lb_3 列出当前表的各字段标题。单击某一项时,产生 selectionchanged 事件,通过下面代码将对应的字段名、字段类型分别送实例变量 s_cn 和 s_ct 。

int k // 循环计数器

For k = 1 to lb_3.totalitems() // 列表项目数

If lb_3.state(k)=1 then // 该项被选中

s_cn=t_c[k,1] // 取出字段名

s_ct=t_c[k,2] // 取出字段类型

End If

Next

下拉列表框 ddlb_2 列出常用关系运算符(比较符)的描述文字,选择某一项后,产生 selectionchanged 事件,通过下面代码得到相应的关系运算符送实例变量 s_cp 。

CHOOSE CASE ddlb_2.text

CASE " 等于 "

s_cp=" = "

......

CASE " 含有 "

s_cp="in"

END CHOOSE

单行编辑框 sle_5 用来输入比较内容。

单击按钮 cb_8 (选中),通过以下代码形成条件表达式字符串送单行编辑框 sle_4 。

If s_ct="24" THEN

// 形成条件表达式字符串 ( 数值类 )

<SPAN lang=EN-US style="FONT-SIZE: 9pt; mso-bidi-font-size: 1

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