---- 随着MIS开发工具的日益完善,人们对信息检索的要求也越来越高,以往每次查询时都由用户输入,然后进行检索的方式已越来越无法满足用户的要求,许多用户都希望系统具有自动记忆查询条件的功能,这样经常使用的查询条件就不必重复输入了。
PowerBuilder(以下简称PB)中的DataStore(数据存储)可以帮助开发人员方便地解决这一问题。PB作为C/S环境下的数据库开发工具,其面向对象、可视化以及方便移植等特点引人注目,成为目前非常流行的数据库前端开发工具。本文以一个文献索引数据库为实例,详细介绍如何在PB中利用DataStore实现查询条件的记忆。
---- DataStore是非可视的数据窗口控件,它能够为应用程序存储数据而不消耗任何图形资源。除了一些可视特征外,它的功能及行为与数据窗口控件相同。因此,我们可以利用DataStore的特点方便地记忆和维护查询条件。
---- 第一步,在数据库中建立一个查询条件表,其中包含每个要用到的条件字段(如标题、文献来源、开始日期、结束日期等)和一个日期字段、时间字段。该表用来保存最近使用的10个(如果需要可以保存任意个)不同条件,每个条件就是一条记录,后两个字段(日期、时间)用来记载条件的使用时间。
---- 第二步,创建一个包含查询条件表中所有字段的数据窗口对象
dw_condation,按使用时间的先后排序。进行查询条件设置时,
---- 第三步,构造如下图的查询条件设置窗口。
---- 四个复选框对应四个条件字段,左、右方向按钮用来浏览设置最近使用过的条件。
---- 第四步,为窗口事件及各控件编写相应的程序。
---- 定义窗口实例变量:
datastore ids_Data
long currentrow
窗口的Open事件:
ids_Data = Create DataStore
//创建数据存储实例
ids_Data.DataObject = "dw_condation"
//将dw_condation数据窗口对象与ids_Data连接
ids_Data.SetTransObject(sqlca)
ids_data.retrieve()
if ids_data.rowcount() >1 then
//设置当前条件为最后一次使用的条件
pb_3.enabled=true
currentrow=ids_data.rowcount()
trigger event ue_setquery(ids_data.rowcount())
end if
窗口自定义事件ue_setquery:
string bt,source
//标题、文献来源
date start_day,end_day//开始日期、结束日期
long page
//页号
//根据参数rownum从数据存储实例中得到各条件值
bt=ids_Data.Object.bt[rownum]
source=ids_Data.Object.source[rownum]
start_day=ids_Data.Object.begin[rownum]
end_day=ids_Data.Object.end[rownum]
page=ids_Data.Object.page[rownum]
//初始化各窗口控件的状态
cbx_1.checked=false
cbx_2.checked=false
cbx_3.checked=false
cbx_4.checked=false
sle_1.enabled=false
ddlb_1.enabled=false
em_1.enabled=false
em_2.enabled=false
em_3.enabled=false
//分别设置各个条件值
if not isnull(bt) and trim(bt)< >"" then
cbx_1.checked=true
sle_1.enabled=true
sle_1.text=bt
end if
if not isnull(source) and trim(source)< >"" then
cbx_2.checked=true
ddlb_1.enabled=true
ddlb_1.text=source
end if
if isnull(start_day) or
start_day=date("1900-1-1") then
em_1.text=string(today(),"yyyy-mm-dd")
else
cbx_3.checked=true
em_1.enabled=true
em_1.text=string(start_day,"yyyy-mm-dd")
end if
if isnull(end_day) or
end_day=date("1900-1-1") then
em_2.text="2050-1-1"
else
cbx_3.checked=true
em_2.enabled=true
em_2.text=string(end_day,"yyyy-mm-dd")
end if
if not isnull(page) and page< >0 then
cbx_4.checked=true
em_3.enabled=true
em_3.text=string(page)
end if
窗口的Close事件:
destroy ids_data
//清除数据存储实例
pb_3(向前按钮)的Clicked事件:
if currentrow >1 then
//设置前一个条件为当前条件
currentrow=currentrow - 1
trigger event ue_setquery(currentrow)
pb_4.enabled=true
if currentrow=1 then this.enabled=false
end if
pb_4(向后按钮)的Clicked事件:
if currentrow< ids_data.rowcount() then
//设置后一条件为当前条件
currentrow=currentrow + 1
pb_3.enabled=true
if currentrow=ids_data.rowcount()
then this.enabled=false
trigger event ue_setquery(currentrow)
end if
pb_1(确定按钮)的Clicked事件:
string bt,source,sqltext,sql_all,sql_title,
sql_source,sql_date,
sql_page
date start_day,end_day
long page,rownum,rowcount
boolean exist
//根据用户设置的条件动态生成查询SQL语法
if cbx_1.checked then
bt=sle_1.text
sql_title='"index"."title" like '
+"'%"+bt +"%'"
end if
if cbx_2.checked then
source=ddlb_1.text
sql_source=' and "index"."source" like '
+"'%"+source +"%'"
end if
if cbx_3.checked then
start_day=date(em_1.text)
end_day=date(em_2.text)
sql_date='and"index"."date" >='+"'"
+string(start_day,"yyyy.mm.dd")
+"'"+'and '+'"index"."date"
< ='+"'"+string(end_day,"yyyy.mm.dd")
+"'"
end if
if cbx_4.checked then
page=long(em_3.text)
sql_page=' and "index"."page"='+string(page)
end if
sqltext='SELECT "index"."num", ' &
+'"index"."title", ' &
+'"index"."source", ' &
+'"index"."date", ' &
+'"index"."page", ' &
+'"index"."other" ' &
+' FROM "index" ' &
+' WHERE '+sql_title +sql_source
+sql_date+sql_page &
+' ORDER BY "index"."num" ASC '
rowcount=ids_data.rowcount()
for rownum=1 to rowcount
//判断该条件是否已经存在
if ids_data.object.data[rownum,1]=bt and &
ids_data.object.data[rownum,2]=source and &
ids_data.object.data[rownum,3]=start_day and &
ids_data.object.data[rownum,4]=end_day and &
ids_data.object.data[rownum,5]=page then
ids_data.object.data[rownum,6]=now()
ids_data.object.data[rownum,7]=today()
exist=true
exit
end if
next
if not exist then
//条件不存在,记忆新条件
if rowcount< 10 then
else
ids_data.deleterow(1)
end if
rownum=ids_data.insertrow(0)
ids_data.object.data[rownum,1]=bt
ids_data.object.data[rownum,2]=source
ids_data.object.data[rownum,3]=start_day
ids_data.object.data[rownum,4]=end_day
ids_data.object.data[rownum,5]=page
ids_data.object.data[rownum,6]=now()
ids_data.object.data[rownum,7]=today()
end if
ids_data.update()
//根据生成的SQL语句,
修改主窗口中的数据窗口语法,
进行查询
w_index.dw_1.setsqlselect(sqltext)
close(parent)
if isvalid(w_index)
then w_index.dw_1.retrieve()
pb_2(取消按钮)的Clicked事件:
close(parent)
---- 以上程序在Pb6.5、Sybase SQL Anywhere5.0下运行通过,读者对它稍加修改就可应用在自己开发的MIS系统中。
分享到:
相关推荐
在IT领域,尤其是在软件开发中,PowerBuilder(PB)是一种常用的企业级应用程序开发工具,尤其适合构建数据库应用。PowerBuilder提供了丰富的内置函数和对象,使得文件的读取和写入操作变得简单易行。本篇文章将详细...
5. **CSV导入流程**:在PowerBuilder中,使用nvo对象和Datastore Import的步骤大致如下: - 创建Datastore对象并指定其数据源为CSV文件。 - 设置Datastore的列映射,确保文件的列与Datastore的字段匹配。 - 使用...
在本书中,读者将深入理解如何利用PowerBuilder 9.0的强大功能来优化数据库开发流程,提升软件工程效率。 1. PowerBuilder 9.0基础:首先,我们探讨PowerBuilder 9.0的核心特性,包括其拖放式用户界面(UI)设计、...
在PowerBuilder 6中,主要包含以下几个核心知识点: 1. **数据窗口**:这是PowerBuilder最具特色的一部分,它能够方便地处理数据库中的数据。数据窗口可以动态地从各种数据库源获取数据,包括SQL Server、Oracle、...
通过以上分析可以看出,虚拟DataStore在PowerBuilder开发中具有重要的作用。合理地利用虚拟DataStore不仅可以提高程序的性能,还可以简化数据处理逻辑,使得开发过程更加高效。开发者可以根据具体的应用场景灵活运用...
在 PowerBuilder 9(简称 PB9)开发过程中,异常处理是一项关键的技术,它能帮助开发者有效地管理和解决程序中出现的错误,确保系统的稳定运行。在实际应用中,开发者经常会遇到各种预知和不可预知的问题,如系统级...
- **DataWindowObject**:在PowerBuilder或DataWindowDesigner中设计的对象,用于访问、展示或处理来自关系数据库或其他数据源的数据。 - **DataWindowControls及DataStores**: - **DataWindowControl**:用于存储...
案例10 数据窗口排序 案例11 利用DataStore共享数据 案例12 关联与条件查询 案例13 数据查询 案例14 模糊查询 案例15 键盘模拟器 案例16 将数据保存到Word文件中 案例17 将数据保存到...
在PowerBuilder(PB)开发中,DataStore是一个重要的对象,用于存储和操作数据库中的数据。在本示例中,我们详细探讨如何创建、查询、取值以及释放DataStore。 1. **创建DataStore**: 创建一个名为`ds_sale`的...
学习并掌握如何使用PowerBuilder与Access DB交互,不仅可以提升开发效率,还能帮助你在项目中实现更灵活的数据管理策略。对于那些需要处理多个数据库环境的开发者,这是一个非常实用且关键的技能。
分布式PowerBuilder设计是一种在1996年引入的PowerBuilder 5.0版本中的新特性,它支持分布式计算方式,即Distributing PowerBuilder。这种计算方式是针对传统的客户端/服务器两层架构的一种扩展,引入了第三层——...
- **PowerScript语言**:PowerBuilder 6.0的核心编程语言,用于实现业务逻辑。 - **数据窗口**:一种强大的数据展现和处理机制,可以方便地与数据库交互。 - **多层架构支持**:支持构建客户端、应用服务器和数据库...
Sybase PowerBuilder在90年代到21世纪初的软件开发领域非常流行,尤其是在企业级应用开发中。 从给出的文件信息来看,文件标题为“powerbuilder.pdf”,描述为“方法方式”,标签为“1121d”,虽然提供的内容较少,...
在PowerBuilder应用程序中,可以利用Windows API函数来实现图形输出功能。例如,可以通过`GetDC`函数获取设备上下文(Device Context),再通过`TextOut`函数实现在指定位置绘制文本。代码示例中展示了如何设置背景...
2. SQL Script:用于处理数据库操作,PowerBuilder的DataWindow控件中内嵌了SQL Script,允许用户自定义数据查询、更新和删除等操作。 三、PowerBuilder 8.0核心组件 1. DataWindow:PowerBuilder的核心组件之一,...
在PowerBuilder(PB)开发环境中,动态创建DataWindow(DW)和动态添加检索参数是提高应用程序灵活性和可扩展性的重要技术。DataWindow是PB的核心组件,用于数据展示、编辑和检索,而动态创建则允许我们在运行时根据...
在 PowerBuilder 开发过程中,为了确保代码的一致性和可读性,遵循一定的命名规范是非常重要的。PowerBuilder 的对象名称定义通常采用如下的格式: **pfcobject_type_objectname** 其中: - **pfcobject**:该部分...
压缩包中的"PowerBuilder 9.0实用教程代码"很可能包含了上述概念的示例代码,可以帮助初学者或经验丰富的开发者深入理解如何在实践中应用这些知识点。通过学习和实践这些代码,你可以掌握PowerBuilder 9.0的核心技术...
在IT行业中,PowerBuilder是一款强大的可视化开发工具,尤其在数据窗口(DataWindow)的设计和管理上表现出色。本文将深入探讨如何使用PowerBuilder将Excel数据导入到DataWindow中,这是一项常见的数据迁移任务,...
1. **数据窗口(DataWindow)**:数据窗口是PowerBuilder的核心组件,用于显示、编辑和管理数据库中的数据。你可以通过多种方式设计数据窗口,包括表格、网格、图表等形式,并支持SQL查询和自定义事件处理。 2. **...