在PB中利用DataStore实现查询条件的记忆

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

在PB中利用DataStore实现查询条件的记忆----DataStore是非可视的数据窗口控件,它能够为应用程序存储数据而不消耗任何图形资源。除了一些可视特征外,它的功能及行为与数据窗口控件相同。因此,我们可以利用DataStore的特点方便地记忆和维护查询条件。----第一步,在数据库中建立一个查询条件表,其中包含每个要用到的条件字段(如标题、文献来源、开始日期、结束日期等)和一个日期字段、时间字段。该表用来保存最近使用的10个(如果需要可以保存任意个)不同条件,每个条件就是一条记录,后两个字段(日期、时间)用来记载条件的使用时间。----第二步,创建一个包含查询条件表中所有字段的数据窗口对象dw_condation,按使用时间的先后排序。进行查询条件设置时,----第三步,构造如下图的查询条件设置窗口。----四个复选框对应四个条件字段,左、右方向按钮用来浏览设置最近使用过的条件。----第四步,为窗口事件及各控件编写相应的程序。----定义窗口实例变量:datastoreids_Datalongcurrentrow窗口的Open事件:ids_Data=CreateDataStore//创建数据存储实例ids_Data.DataObject=dw_condation//将dw_condation数据窗口对象与ids_Data连接ids_Data.SetTransObject(sqlca)ids_data.retrieve()ifids_data.rowcount()1then//设置当前条件为最后一次使用的条件pb_3.enabled=truecurrentrow=ids_data.rowcount()triggereventue_setquery(ids_data.rowcount())endif窗口自定义事件ue_setquery:stringbt,source//标题、文献来源datestart_day,end_day//开始日期、结束日期longpage//页号//根据参数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=falsecbx_2.checked=falsecbx_3.checked=falsecbx_4.checked=falsesle_1.enabled=falseddlb_1.enabled=falseem_1.enabled=falseem_2.enabled=falseem_3.enabled=false//分别设置各个条件值ifnotisnull(bt)andtrim(bt)thencbx_1.checked=truesle_1.enabled=truesle_1.text=btendififnotisnull(source)andtrim(source)thencbx_2.checked=trueddlb_1.enabled=trueddlb_1.text=sourceendififisnull(start_day)orstart_day=date(1900-1-1)thenem_1.text=string(today(),yyyy-mm-dd)elsecbx_3.checked=trueem_1.enabled=trueem_1.text=string(start_day,yyyy-mm-dd)endififisnull(end_day)orend_day=date(1900-1-1)thenem_2.text=2050-1-1elsecbx_3.checked=trueem_2.enabled=trueem_2.text=string(end_day,yyyy-mm-dd)endififnotisnull(page)andpage0thencbx_4.checked=trueem_3.enabled=trueem_3.text=string(page)endif窗口的Close事件:destroyids_data//清除数据存储实例pb_3(向前按钮)的Clicked事件:ifcurrentrow1then//设置前一个条件为当前条件currentrow=currentrow-1triggereventue_setquery(currentrow)pb_4.enabled=trueifcurrentrow=1thenthis.enabled=falseendifpb_4(向后按钮)的Clicked事件:ifcurrentrowids_data.rowcount()then//设置后一条件为当前条件currentrow=currentrow+1pb_3.enabled=trueifcurrentrow=ids_data.rowcount()thenthis.enabled=falsetriggereventue_setquery(currentrow)endifpb_1(确定按钮)的Clicked事件:stringbt,source,sqltext,sql_all,sql_title,sql_source,sql_date,sql_pagedatestart_day,end_daylongpage,rownum,rowcountbooleanexist//根据用户设置的条件动态生成查询SQL语法ifcbx_1.checkedthenbt=sle_1.textsql_title='index.titlelike'+'%+bt+%'endififcbx_2.checkedthensource=ddlb_1.textsql_source='andindex.sourcelike'+'%+source+%'endififcbx_3.checkedthenstart_day=date(em_1.text)end_day=date(em_2.text)sql_date='andindex.date='+'+string(start_day,yyyy.mm.dd)+'+'and'+'index.date='+'+string(end_day,yyyy.mm.dd)+'endififcbx_4.checkedthenpage=long(em_3.text)sql_page='andindex.page='+string(page)endifsqltext='SELECTindex.num,'&+'index.title,'&+'index.source,'&+'index.date,'&+'index.page,'&+'index.other'&+'FROMindex'&+'WHERE'+sql_title+sql_source+sql_date+sql_page&+'ORDERBYindex.numASC'rowcount=ids_data.rowcount()forrownum=1torowcount//判断该条件是否已经存在ifids_data.object.data[rownum,1]=btand&ids_data.object.data[rownum,2]=sourceand&ids_data.object.data[rownum,3]=start_dayand&ids_data.object.data[rownum,4]=end_dayand&ids_data.object.data[rownum,5]=pagethenids_data.object.data[rownum,6]=now()ids_data.object.data[rownum,7]=today()exist=trueexitendifnextifnotexistthen//条件不存在,记忆新条件ifrowcount10thenelseids_data.deleterow(1)endifrownum=ids_data.insertrow(0)ids_data.object.data[rownum,1]=btids_data.object.data[rownum,2]=sourceids_data.object.data[rownum,3]=start_dayids_data.object.data[rownum,4]=end_dayids_data.object.data[rownum,5]=pageids_data.object.data[rownum,6]=now()ids_data.object.data[rownum,7]=today()endifids_data.update()//根据生成的SQL语句,修改主窗口中的数据窗口语法,进行查询w_index.dw_1.setsqlselect(sqltext)close(parent)ifisvalid(w_index)thenw_index.dw_1.retrieve()pb_2(取消按钮)的Clicked事件:close(parent)转载Datawindow控件实质是一个窗口,而Datastore则是一个隐藏的窗口,即Visible,Redraw属性都为假,这也是为何Datastore操作数据比Datawindow更快的一个原因,它占用的系统资源更少,消耗的系统时间也更少。既然Datawindow与Datastore是一个窗口,那么窗口所具有的属性、消息如打开、关闭、重画它们也有。了解这些对于深入应用数据窗口是非常也好处的。Datawindow与Datastore从某种程度上讲是一个中间件,在用户界面与物理数据库之间加了一层功能,将它们隔离开来,给用户界面提供更友好的数据操作,给数据库提供更稳定的数据显示。Datawindow作为一项专利,是Powersoft(原来的PB开发商,后被SYBASE收购)向美国国家专利与商标局注册的。Datawindow/Datastore控件其基本原理就是Datawindow提供了数据显示界面的格式位置定义,而Datawindow控件提供了数据操作方法与数据容器。为此PB为Datawindow控件提供了操作数据库的函数与几个缓冲区(Primary!,Filter!等),为Datawindow提供了几个显示层次(Foreground、Background等)。用户使用Datawindow控件的数据库操作函数,系统自动转换为特定数据库的SQL语言,提交给数据库,待后台完成后,将数据返回给Datawindow控件,Datawindow控件再根据Datawindow的格式定义将数据显示出来;另外Datawindow控件还要根据Datawindow的属性控制事物完整性等,还要处理一些自己特有的数据处理功能如Filter等。Datawindow控件除具有Windows的窗口的属性与事件还有自己独特的函数与事件,如Retrievestart、Retrieveend、SqlPreview、Printpage等事件与Update,Reset等函数。这些事件有些是系统自动触发的如Dberror,SqlPreview等,这些事件一般都有参数或有相关函数可以获得事件信息,因此我们可以在这些事件中获得、修改数据处理信息。Datawindow函数需要手工调用,包括有关于后台数据处理的Datawindow控件函数,与SQL语言类似,是SQL语言在Datawindow中的表示;有前台数据处理的Datawindow控件函数如Getitem,Setitem等;还有前后台协调的函数Retrieve等。Datawindow定义

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功