| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4594 人关注过本帖
标题:PB新手请教查询问题
只看楼主 加入收藏
glider
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-8-21
收藏
 问题点数:0 回复次数:5 
PB新手请教查询问题

本人是刚学PB的新手,请问诸位前辈,我在用PB8.0做用一个组合条件查询窗口,如何在数据窗口中实现双击记录行,返回行号,并按该行的某个字段进行执行下一步查询,并在同一层上显示多个数据窗口。
还有就是怎样取输入的日期,按起止日期查询呢?
万分感谢!

搜索更多相关主题的帖子: 查询 
2006-08-22 09:20
ヤ順祺冄繎ヤ
Rank: 8Rank: 8
等 级:贵宾
威 望:42
帖 子:3032
专家分:0
注 册:2005-11-9
收藏
得分:0 
网上有通用查询,可以完成这种功能
2006-08-24 16:33
潇洒老乌龟
Rank: 5Rank: 5
等 级:贵宾
威 望:18
帖 子:407
专家分:0
注 册:2005-12-13
收藏
得分:0 

在进行数据库应用系统开发时,经常要对大量的数据进行筛选、查询,得到符合要求的记录,这就需要用到组合查询功能。本文提供一个实用的组合条件查询模块的实现方法,只要用到组合条件查询的地方,都可以从此窗口模块继承而来,非常方便。
创建过程如下:
1、建立一个工作空间(workspace),取名为:query。

2、建立一个应用(application),取名为:query。

3、建立一个Tabular风格,外部数据源的数据窗口对象,取名为:d_dddw_value,各列如下表所示:
列名 类型 长度 说明
Dispvalue String 255
Datavalue String 255 设置为不可见。

4、建立一个Tabular风格,外部数据源的数据窗口对象,取名为:d_tabular_query,该数据窗口用于输入查询的各种条件,各列如下表所示:
列 名 类型 长度 编辑风格 说明
Column_name String 100 DropDownListBox
Compare String 4 DropDownListBox Code Table:=,<,>,<=,>=,<>,like。
Value String 255 DropDownDW Datawindow:d_dddw_value;Display Column:dispvalue;Data Table:datavalue
And_or String 3 DropDownListBox
数据窗口对象d_tabular_query设计如下图所示:

5、建立一个Main类型窗口w_condition_query_template,窗口标题(title)设置为:组合条件查询窗口模板,并加入下表所示的控件:
控件名 类 型 说 明
Dw_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 退出。
窗口w_condition_query_template设计如下图所示:

6、编写脚本
1)、窗口open事件
2)、窗口函数wf_setdddw(),定义如下:

//-----------------------------------------------------------------//
// 函数名称: wf_setdddw
// 功能描述: 当被查询字段的编辑风格为DDDW时,将此字段列表所有值写入dw_condition的value列表
// 参数说明: as_field: 字段名
// 返 回 值: 无
// 使用说明: wf_setdddw(columnname) ,columnname为要查询的字段名
//-----------------------------------------------------------------//
datawindowchild ldwc_value
datawindowchild ldwc_query
int li_count,li_row,li_i
string ls_datCol,ls_dispCol
String ls_type //列类型
string ls_datavalue,ls_dispvalue

//取得DDDW
dw_condition.GetChild('value',ldwc_value)
//重置
ldwc_value.Reset()
//被查询子数据窗口
dw_query.GetChild(as_field, ldwc_query)

//数据列
ls_datCol = dw_query.Describe(as_field+".DDDW.DataColumn")
//显示列
ls_dispCol = dw_query.Describe(as_field+".DDDW.DisplayColumn")
//获得被查询子数据窗口的行数
li_count = ldwc_query.rowcount()
//获得列类型
ls_type = ldwc_query.describe(ls_datCol + ".ColType")
ls_type = lower(left(ls_type,3))
CHOOSE CASE ls_type
CASE "cha" //字符型
FOR li_i = 1 TO li_count
li_row = ldwc_value.insertrow(0)
ls_datavalue = ldwc_query.GetItemString(li_i, ls_datCol)
ls_dispvalue = ldwc_query.GetItemString(li_i, ls_dispCol)
ldwc_value.SetItem(li_row, 'datavalue', ls_datavalue)
ldwc_value.SetItem(li_row, 'dispvalue', ls_dispvalue)
NEXT
CASE 'num','dec','lon','rea','ulo','int' //数值型
FOR li_i = 1 TO li_count
li_row = ldwc_value.insertrow(0)
ls_datavalue = string(ldwc_query.GetItemNumber(li_i, ls_datCol))
ls_dispvalue = ldwc_query.GetItemString(li_i, ls_dispCol)
ldwc_value.SetItem(li_row,'datavalue', ls_datavalue)
ldwc_value.SetItem(li_row,'dispvalue', ls_dispvalue)
NEXT
END CHOOSE
3)窗口函数wf_setddlb(),定义如下:

//-----------------------------------------------------------------//
// 函数名称: wf_setddlb
// 功能描述: 当被查询字段的编辑风格为DDLB或RadioButtons时,
// 将此字段列表所有值写入dw_condition的value列表
// 参数说明: as_field: 字段名
// 返 回 值: 无
// 使用说明: wf_setddlb(columnname) ,columnname为要查询的字段名
//-----------------------------------------------------------------//

datawindowchild ldwc_value
int li_insertrow,li_i,li_pos
string ls_dat,ls_disp
String ls_values
dw_condition.GetChild('value',ldwc_value)
ldwc_value.Reset()
//获取DDLB列表的值,包括显示和实际值
//行之间以“/”分隔,域之间以TAB键“~t”分隔
ls_values = dw_query.Describe(as_field + ".Values")
//分拆列表值,并逐行插入到value域的DDDW中
DO WHILE pos(ls_values,"~t") > 0
li_i = pos(ls_values,"~t")
ls_disp = left(ls_values, li_i - 1)
li_pos = pos(ls_values,"/")
IF li_pos = 0 then
ls_dat = mid(ls_values, li_i + 1)
ls_values = ''
Else
ls_dat = mid(ls_values, li_i+1, li_pos - li_i - 1 )
ls_values = mid(ls_values, li_pos + 1)
END IF
//插入新行
li_insertrow = ldwc_value.insertrow(0)
//实际值
ldwc_value.SetItem(li_insertrow,"datavalue",ls_dat)
//显示值
ldwc_value.SetItem(li_insertrow,"dispvalue",ls_disp)
Loop
4)、dw_condition的constractor事件
//--------------------------------------------------------------------//
// 功能说明:根据数据窗口dw_query设定可组合项,供组合查询选择
// 注意事项:数据窗口dw_query的对象中text命名须用默认值,即列名+ _t
//--------------------------------------------------------------------//
long ll_column_count
long ll_i
long ll_row
string ls_column
string ls_column_name

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")
//循环设置可查询列,写入到DDLB列'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")
//列text文本说明
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
5)、dw_condition的用户自定义事件,ue_setvalue,Event ID:none
//自动设定列的编辑风格
String ls_Edit_Style
Long ll_row
String ls_column_name
DataWindowChild ldwc_value
ll_row = This.getrow()
IF ll_row<=0 then return
//获得列名
ls_column_name = This.GetItemString(ll_row, "column_name")
IF IsNull(ls_column_name) OR ls_column_name = '' THEN
RETURN
END IF
//获取列的编辑风格
ls_Edit_Style = dw_query.Describe(ls_column_name + ".Edit.Style")
CHOOSE CASE ls_Edit_Style
CASE 'ddlb' //下拉列表
//调用wf_setddlb()函数,设置value列可供选择的数据
wf_setddlb(ls_column_name)
//不允许编辑,只允许选择
This.Modify("value.DDDW.AllowEdit=No")
CASE 'dddw' //下拉数据窗口
//调用wf_setdddw()函数,设置value列可供选择的数据
wf_setdddw(ls_column_name)
//不允许编辑,只允许选择
This.Modify("value.DDDW.AllowEdit=No")
CASE 'radiobuttons' //单选
//调用wf_setddlb()函数,设置value列可供选择的数据
wf_setddlb(ls_column_name)
//不允许编辑,只允许选择
This.Modify("value.DDDW.AllowEdit=No")
CASE ELSE //其它风格不从DDDW中选择,让用户直接输入查询值
//获得DDDW
This.GetChild('value',ldwc_value)
//将DDDW重置
ldwc_value.Reset()
//允许编辑,即可让用户输入查询值
This.Modify("value.DDDW.AllowEdit=Yes")
END CHOOSE
6)、dw_condition的ItemChanged事件
//根据选择的查询列来自动设置DDDW列'value'的可选值
IF dwo.name="column_name" then
This.post event ue_setvalue()
END IF
7)、dw_condition的ItemFocusChanged事件
//item切换处理
IF dwo.name = "column_name" then
This.event ue_setvalue()
END IF
8)、dw_condition的RowFocusChanged事件
//查询条件换行处理
string ls_dat
IF currentrow <= 0 THEN RETURN
ls_dat = This.GetitemString(currentrow,'value')
This.event ue_setvalue()
This.SetItem(currentrow, 'value', ls_dat)
9)、dw_condition的用户自定义事件,ue_Enterkey,Event ID:pbm_dwnProcessEnter,当按下Enter键时,触发此事件。
//回车键(Enter)切换列焦点
// Enter --> Tab
Send(Handle(this),256,9,Long(0,0))
Return 1
10)、cb_add的clicked事件
//增加一查询条件
long ll_row
ll_row = dw_condition.insertrow(0)
dw_condition.SetItem(ll_row,'compare','=')
dw_condition.SetItem(ll_row,'and_or','and')
dw_condition.SetColumn(1)
dw_condition.SetRow(ll_row)
dw_condition.SetFocus()
11)、cb_del的clicked事件
//删除一查询条件
long ll_row
ll_row = dw_condition.getrow()
dw_condition.DeleteRow(ll_row)
12)、cb_ins的clicked事件
//插入一查询条件
long ll_row
long ll_new_row
ll_row = dw_condition.getrow()
ll_new_row = dw_condition.InsertRow(ll_row)
dw_condition.SetItem(ll_new_row,'compare','=')
dw_condition.SetItem(ll_new_row,'and_or','and')
dw_condition.SetColumn(1)
dw_condition.SetRow(ll_row)
dw_condition.SetFocus()
13)、cb_clear的clicked事件
//清除当前查询条件
long ll_row
dw_condition.reset()
ll_row = dw_condition.insertrow(0)
dw_condition.SetItem(ll_row,'compare','=')
dw_condition.SetItem(ll_row,'and_or','and')
14)、cb_ok的clicked事件
//--------------------------------------------------------------------//
// 条件组合查询
// 根据数据窗口dw_condition取组合条件、检索数据
//--------------------------------------------------------------------//
long ll_rowcount
long ll_row
string ls_filter_condition
string ls_column
string ls_compare
string ls_value
string ls_and_or
string ls_column_type
IF dw_condition.AcceptText() = -1 THEN RETURN
ll_rowcount = dw_condition.RowCount()
IF ll_rowcount <=0 THEN RETURN
ls_filter_condition = ''
//循环组织过滤表达式
for ll_row = 1 to ll_rowcount
//列名
ls_column = dw_condition.GetItemString(ll_row, 'column_name')
//比较符号
ls_compare = dw_condition.GetItemString(ll_row, 'compare')
//比较值
ls_value = dw_condition.GetItemString(ll_row, 'value')
//逻辑关联符号
ls_and_or = dw_condition.GetItemString(ll_row, 'and_or')
//列类型
ls_column_type = dw_query.Describe(ls_column + ".ColType")
ls_column_type = left(ls_column_type, 3)
IF Isnull(ls_value) THEN ls_value = ''
// like的特殊处理
IF Trim(ls_compare) = 'like' THEN
ls_compare = ' like '
ls_value = '%' + ls_value + '%'
END IF
//根据数据类型设置Filter条件
CHOOSE Case ls_column_type
Case 'cha' ,'var' ,'str'//字符型
ls_filter_condition = ls_filter_condition + &
ls_column + ls_compare + "'" + ls_value + "'"
Case 'int','num','dec','lon','rea','ulo' //数值型
ls_filter_condition = ls_filter_condition + &
ls_column + ls_compare + ls_value
Case 'dat' //日期型
IF Not IsDate(ls_value) THEN
MessageBox("提示信息", "“" + ls_value + &
"”日期格式不对或不是合法日期!", Exclamation!)
RETURN
END IF
ls_filter_condition = ls_filter_condition + ls_column + &
ls_compare + "date('" + &
string(date(ls_value), "yyyy-mm-dd") + "')"
Case 'tim' //时间型
IF Not IsTime(ls_value) THEN
MessageBox("提示信息", "“" + ls_value + &
"”时间格式不对或不是合法时间!", Exclamation!)
RETURN
END IF
ls_filter_condition = ls_filter_condition + ls_column + &
ls_compare + "time('" + &
string(time(ls_value), "hh:mm:ss") + "')" END CHOOSE
//不是最后一行,加逻辑关联符号(and、or)
IF ll_row < ll_rowcount THEN
ls_filter_condition = ls_filter_condition + " " + ls_and_or + " "
END IF
Next
IF ls_filter_condition = '' THEN RETURN
dw_query.setredraw(FALSE)
//过滤数据
dw_query.SetFilter(ls_filter_condition)
IF dw_query.filter() = 1 AND dw_query.rowcount() > 0 THEN
//所查找的第一个列
ls_column = dw_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)
15)、dw_query的constructor事件
//设置数据窗口只读属性,检索数据
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
16)、dw_query的clicked事件
IF Row <=0 Then Return 1
//单击选择行
dw_query.SelectRow(0,FALSE)
dw_query.SelectRow(Row,true)
dw_query.SetRow(Row)
17)、dw_query的RowFocusChanged事件
IF CurrentRow <=0 Then Return 1
dw_query.SelectRow(0,FALSE)
dw_query.SelectRow(CurrentRow,true)
dw_query.SetRow(CurrentRow)
18)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()
19)、cb_print的clicked事件
//数据窗口打印
IF messagebox("提示信息","确认打印?", question!,Yesno!,1) = 1 Then
IF PrintSetup () = -1 Then
MessageBox('出错信息','打印机设置出错!',Exclamation!)
Return
ELSE
dw_query.Print()
END IF
END IF
20)、cb_exit的clicked事件
//关闭窗口
Close(Parent)

7、继承调用
通过窗口w_condition_query_template创建一窗口,并将数据窗口对象关联到数据窗口控件dw_query,不用写任何脚本。运行后效果图如下:

上图是员工号>110的记录。

[此贴子已经被作者于2006-9-2 22:16:19编辑过]


乌龟学堂http://www. 承接各种软件开发、系统集成、网络搭建。 QQ:124030710
2006-09-02 22:15
heavenRain
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2006-9-5
收藏
得分:0 
佩服,老乌龟挺有奈心~~请允许我代表新手们向你致敬~~
2006-09-05 19:42
ヤ順祺冄繎ヤ
Rank: 8Rank: 8
等 级:贵宾
威 望:42
帖 子:3032
专家分:0
注 册:2005-11-9
收藏
得分:0 
呵呵,的确挺有奈心
2006-09-08 12:31
冰山一角
Rank: 1
等 级:新手上路
帖 子:385
专家分:0
注 册:2006-9-5
收藏
得分:0 
佩服死了。

做程序员太乏味?来这里www..cn试试吧,你肯定能找到乐趣!
2006-09-08 16:00
快速回复:PB新手请教查询问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016087 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved