前往Shuct.Net首页

Shudepb PB反编译专家长时间以来,为业内同类软件事实上的唯一选择.细节,彰显专业.态度,决定品质.

关于PowerBuilder的搜索

针对PowerBuilder中条件查询的几点改进 - program - 博客大巴 program << 针对PowerBuilder中条件查询的几点改进 | 首页 | 怎样用PowerBuilder开发WEB应用 >> 2005-12-31 针对PowerBuilder中条件查询的几点改进 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://www.blogbus.com/programs-logs/1772272.html i社区用户: 密码:搜索: 站内搜索 智能搜索 全文搜索 周报文章检索 IT书搜索 专题搜索首页| 资讯| 信息化| 产品| 专题| 创业| 技术天地| 企业中心| 企业论坛| 职场| 周报全文| 商城| 市场会展| Blog| i社区| 社区联盟| RSS| 电子杂志| 发行| 直播| IT两会| i 搜| 下载| 上网导航| CIO俱乐部数码 笔记本 手机 台式机 DIY 软件 网络产品 服务器计算机世界 华东站 华南站 西北站 东北站 西南站  e街 IT经理世界 网络世界 微电脑世界 计世资讯 数码精品 消费电子世界 --> --> CIO俱乐部 焦点 | 数据 | 中小企业 | CIO生活 | 方案·案例展示中心 | 供求与招投标 | 专家库 | CIO俱乐部章程 --> --> --> --> --> --> --> -->首页|文库|数据中心|方案中心|专家库|厂商黄页|供求招标| 责编电话:010-68130909-1053针对PowerBuilder中条件查询的几点改进山东省胜利油田电力公司职工培训中心 吴磊 02-2-1 下午 02:43:17PB是一个很优秀的数据库前端平台开发软件,其数据展示功能强大,比较适合于进行MIS系统的开发,因此应用十分广泛。在当今网络时代,任何事物都或多或少的与e沾亲带故,作为一个系统开发软件,PB自然也不能免俗。在网上,介绍PB相关设计技巧的的网站不记其数,其中不乏一些质量较高的示例,这对于提高PB水平自然很有好处,但奇怪的是,大家对于其他方面的技巧介绍的都比较详细,唯独对数据检索方面讲得比较少,而且其技巧大多也很雷同。其实在MIS系统中,检索是很常用的一个模块,设计出一个良好的检索模块对于提高用户对数据库中数据的了解和利用会有很大的好处,我针对当前比较常见的检索模块作了一些改进使其可以更充分的满足用户对数据检索的需要。首先,我们先设计一个简单的数据库表jyb,其结构如下所示:列名数据类型长度zzidvarchar6zzcnvarhcar2namevarchar8我们来看一下目前比较常见的一种检索模块。设计思路:本例将创建一个简单的多字段查询,它提供给用户这样的操作界面:选择查询字段、查询操作符,输入查询值得到查询结果。实现方法:首先获取原有数据窗口的SQL SELECT语句,然后根据用户的选择拼接成新的SQL SELECT 语句,最后利用该SQL SELECT语句对原有数据窗口进行检索。操作步骤:1、创建一个窗口,以名“win4_1"保存。在该窗口上放置两个DropuDownLIstBox 控件,其名称分别为ddlb_1,ddlb_2;放置一个SingLineEdit控件,命名为sle_1,text值为空;最后放置一个CommandButton控件,其名称为cb_1,text值为"检索"。在调好它们的位置后,在其下放置一个DateWindows(创建过程从略)。2、定义一个全局变量 string ls_newsql3、在"win4_1"窗口的Open事件中加入如下脚本://向ddlb_1中添加查询字段名ddlb_1.additem("zzid")ddlb_1.additem("zzqkh")ddlb_1.additem("jyr")//向ddlb_2中添加操作符ddlb_2.additem("=")ddlb_2.additem(">")ddlb_2.additem(">=")ddlb_2.additem("<")ddlb_2.additem("<=")ddlb_2.additem("<>")//检索数据dw_1.settransobject(sqlca)dw_1.retrieve()4、在“检索”按钮的chick事件中加入如下脚本:string ls_oldsql//获取数据窗口的SQL语句放入ls_oldsql中ls_oldsql = parent.dw_1.getsqlselect()//将拼接成的新SLQ语句放入ls_newsql中ls_newsql = ls_oldsql + " where " + parent.ddlb_1.text &+ parent.ddlb_2.text + parent.sle_1.text //对原有数据窗口进行新的查询if parent.dw_1.setsqlselect(ls_newsql) = -1 thenbeep(3)//失败则发出警告 messagebox("警告", "检索失败",stopsign!)else//成功则进行检索,并将数据窗口中的SQL语句还原,以便进行下一次查询parent.dw_1.settransobject(sqlca)parent.dw_1.retrieve()parent.dw_1.setsqlselect(ls_oldsql)end if在这个窗口中,在第一个下拉列表中可以选择字段名称,在第二个下拉列表中可以选择比较符,在文本框中输入相应的字段值,点击检索后可显示满足条件的数据。其最后结果如图1所示很显然,这是一个只能完成十分简单查询功能的模块,对于要求比较复杂的查询它就无能为力了。下面我们就在它的基础上进行一些改进。改进一:将第一个下拉列表中显示的英文改为中文。设计思路:除非是用户对本数据库的各字段值的含义很了解,否则他将对第一个下拉列表中显示的值不知如何去选择,因此,我们将ddlb_1中的值改为字段值的含义,以便用户进行选择。实现方法:在ddlb_1中放入字段含义,设计一个命令按钮进行转换,转换结果放入全局变量text_1中,在检索时激活。1、定义一个全局变量 string text_12、将"win4_1"窗口的Open事件中的脚本作如下修改://向ddlb_1中添加查询字段含义ddlb_1.additem("编号")ddlb_1.additem("期刊号")ddlb_1.additem("借阅人")//向ddlb_2中添加操作符ddlb_2.additem("=")ddlb_2.additem(">")ddlb_2.additem(">=")ddlb_2.additem("<")ddlb_2.additem("<=")ddlb_2.additem("<>")//检索数据dw_1.settransobject(sqlca)dw_1.retrieve()3、将cb_4的visible属性设为false,在cb_4按钮的chick事件中加入如下脚本://将ddlb_1的中的汉字进行转换成相应的字段名choose case parent.ddlb_1.textcase "编号"text_1="zzid"case "期刊号"text_1="zzcn"case "借阅人"text_1="name"end choose4、在“检索”按钮的chick事件中加入如下脚本:string ls_oldsql//将字段含义转换为字段值,放入text_1中cb_4.triggerevent(clicked!)//获取数据窗口的SQL语句ls_oldsql = parent.dw_1.getsqlselect()ls_newsql = ls_oldsql + " where " + text_1 &+ parent.ddlb_2.text + parent.sle_1.text //对原有数据窗口进行新的查询if parent.dw_1.setsqlselect(ls_newsql) = -1 thenbeep(3)messagebox("警告", "检索失败",stopsign!)elseparent.dw_1.settransobject(sqlca)parent.dw_1.retrieve()parent.dw_1.setsqlselect(ls_oldsql)end if改进二:在第一个列表项中选择了字段值后,可以在第三个列表项中列出当前数据库中所有被选字段的值以供用户选择。设计思路:有时用户并不知道当前数据库中与字段对应的值有哪些,因此,我们可以把第三个选择框设计成下拉列表的形式,列表值为当前数据库中对应字段的所有值。实现方法:定义三个游标,将所有不同的字段值分别放入的相应的游标中,根据ddlb_1.text的值,选择相应的游标中的值依次放入ddlb_3 中。1、将sle_1删除,加入一个名为ddlb_3的控件。2、在ddlb_1的selectionchanged事件中加入如下脚本:string lx1_1,lx1_2,lx1_4//将所有不同的字段值分别放入的相应的游标中declare lc_x cursor for select distinct zzid from jyb ;declare lc_x1 cursor for select distinct zzqkh from jyb ;declare lc_x4 cursor for select distinct jyr from jyb ;choose case parent.ddlb_1.text//根据ddlb_1.text的值,选择相应的游标中的值依次放入ddlb_3 中case "编号"//使用前先清空ddlb_3.reset()open lc_x ;fetch lc_x into : lx1_1 ;do while sqlca.sqlcode = 0ddlb_3.additem(lx1_1)fetch lc_x into : lx1_1 ;loopcase "期刊号"ddlb_3.reset()open lc_x1 ;fetch lc_x1 into : lx1_2 ;do while sqlca.sqlcode = 0ddlb_3.additem(lx1_2)fetch lc_x1 into : lx1_2 ;loopcase "借阅人"ddlb_3.reset()open lc_x4 ;fetch lc_x4 into : lx1_4 ;do while sqlca.sqlcode = 0ddlb_3.additem(lx1_4)fetch lc_x4 into : lx1_4 ;loopend choose//关闭游标close lc_x;close lc_x1;close lc_x4;改进三:加入and 和 or逻辑符,使其可以进行复合条件的查询设计思路:有时用户不是对一个特定的值进行查询,而是要对某一个特定范围内的值进行查询,这时就需要设计出AND和OR按钮来进行复合条件的查询。实现方法:加入and、or按钮,在点击它时完成连接SQL语句的功能,并在语句的最后加入and或or。1、在"win4_1"窗口的Open事件中加入如下脚本://向ddlb_1中添加查询字段名ddlb_1.additem("zzid")ddlb_1.additem("zzqkh")ddlb_1.additem("jyr")//向ddlb_2中添加操作符ddlb_2.additem("=")ddlb_2.additem(">")ddlb_2.additem(">=")ddlb_2.additem("<")ddlb_2.additem("<=")ddlb_2.additem("<>")//检索数据dw_1.settransobject(sqlca)dw_1.retrieve()//用自定义的查询语句代替数据窗口中本身的SQL 语句ls_newsql="SELECT jyb.zzid,jyb.zzcn,jyb.name FROM jyb where "2、在窗口上加入两个CommandButton控件,其名称分别为cb_2、cb_3cb_2的text属性为"and",在cb_2的chick事件中加入如下脚本:cb_4.triggerevent(clicked!)ls_newsql = ls_newsql + text_1+&parent.ddlb_2.text + parent.ddlb_3.textls_newsql=ls_newsql+" and "cb_3的text属性为"or",在cb_3的chick事件中加入如下脚本:cb_4.triggerevent(clicked!)ls_newsql = ls_newsql + text_1+&parent.ddlb_2.text + parent.ddlb_3.textls_newsql=ls_newsql+" or "4、在“检索”按钮的chick事件中加入如下脚本:string ls_oldsql//进行转换cb_4.triggerevent(clicked!)//获取数据窗口的SQL语句ls_oldsql = parent.dw_1.getsqlselect()ls_newsql = ls_newsql+text_1+&parent.ddlb_2.text+parent.ddlb_3.text//对原有数据窗口进行新的查询if parent.dw_1.setsqlselect(ls_newsql) = -1 thenbeep(3)messagebox("警告", "检索失败",stopsign!)elseparent.dw_1.settransobject(sqlca)parent.dw_1.retrieve()parent.dw_1.setsqlselect(ls_oldsql)end if这样对这个表来说,这个完成的模块就基本上可以进行任意条件的查询了,对于结构更复杂的表,只要在这个模块的基础上做一些改变和增加,就可以很容易的完成相应的功能了。至在本模块进行复合条件查询时,如果有的人希望可以看到查询条件话,这点也很容易做到只要在窗口加入一个文本框,再把SQL语句的where部写入就可以了。大家也许注意到了,我设计的这个表的字段类型都varchar类型的,这是因为根据我的经验,在设计库结构时,如果可能的话,尽量把字段类型高设为varhcar类型,这虽然增加了一些类型间转换的工作量,但字符类型函数比较多,操作进来比较容易,比较容易实现一些很复杂的设计,在本例中尤其如此,大家可以试一下,如果在设计此表时加入一个date字段,其类型为datetime类型,要实现此字段的查询就非常困难,当然这已不是本文所要讨论的范围了。以上程序在pb7.0和pb8.0均调试通过,如果大家能有更好的改进方案请不吝指教,我的Email是:skxw11297770@sohu.com 。(网页编辑:风之翼)?频道全文检索 主题检索 周报全文检索 模糊词检索 相关专题Windows XP中的组件服务 相关文章在PB 7.0中实现多数据窗口的连续打印怎样用PowerBuilder开发WEB应用在Adaptive Server Anywhere和Oracle之间构造通用函数第四十讲:图形用户界面设计(续)第三十九讲:图形用户界面设计 关于我们 | 客服热线 | 广告服务 | 法律声明 | 投稿指南 | 联系方式 | 计世媒体 Copyright(C) ccw.com.cn,All rights reserved 中国计算机世界出版服务公司内容版权所有 京ICP证010182 分享到: 历史上的今天:Win32 API 与PB编程 2005-12-31怎样用PowerBuilder开发WEB应用 2005-12-31针对PowerBuilder中条件查询的几点改进 2005-12-31针对PowerBuilder中条件查询的几点改进 2005-12-31 Tag:pb 引用地址: ~蜗牛~ 发表于16:03:48 | 编辑 | 分享 0 个人资料 ~蜗牛~ 日历 搜索 管理 进入后台 写新日志 文章管理 评论管理 更换模板 访问统计 文章分类 Tag vb[41] pb[12] js[2] vb操作注册表[1] C[1] More.. 最新文章 用VB操作注册表 关机代码 将数据窗口保存为word文档 Win32 API 与PB编程 怎样用PowerBuilder开发WEB应用 针对PowerBuilder中条件查询的几点改进 针对PowerBuilder中条件查询的几点改进 针对PowerBuilder中条件查询的几点改进 利用VB6.0设计屏幕保护程序 用VB实现Win2000用户限时登录 全部日志>> 最新评论 链接 http://www.diary365.net/book/view.asp?bookid=181020&s=-1&t=&p=&n=7&f=0 存档 2006 [3]2005 [65] 什么是RSS? 博客大巴使用指南博客大巴模板中心免费注册博客大巴一键博客搬家工具中文互动杂志城客 Copyright &copy; 2002-2014 BlogBus.com, All Rights Reserved. 博客大巴 版权所有 博客大巴模板设计:蓝蝴蝶 | 作者: innocent_sin