资源预览内容
第1页 / 共25页
第2页 / 共25页
第3页 / 共25页
第4页 / 共25页
第5页 / 共25页
第6页 / 共25页
第7页 / 共25页
第8页 / 共25页
第9页 / 共25页
第10页 / 共25页
第11页 / 共25页
第12页 / 共25页
第13页 / 共25页
第14页 / 共25页
第15页 / 共25页
第16页 / 共25页
第17页 / 共25页
第18页 / 共25页
第19页 / 共25页
第20页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第9章 数据库应用系统开发工具PB,*,9.6.1 简单查询的实现,9.6.2 主从表的查询,9.6.3 组合查询的实现,9.6 数据查询设计,9.6 数据查询设计,简单查询的实现较为简单,首先建立一个带参数的数据窗口,在窗口中除添加数据窗口控件(dw_1)和命令按钮(cb_1)外,还需添加一个单行编辑框(sle_1),该框主要用于输入数据。例如对Wzbmb建立数据窗口,定义一个字符型参数,并使参数与字段wzbm对应起来。在命令按钮cb_1的clicked事件中写上:dw_1.retrieve(sle_1.text)即可。应当注意的是sle_1.text是字符型的,如果数据窗口参数是其它类型,必须进行强制转换。,9.6.1 简单查询的实现,9.6.1 简单查询的实现,在实际应用中会经常出现主从表的查询。其实现方法为:对主表建立一个数据窗口,对从表建立一个带参数的数据窗口,其参数对应的字段为主从表的公共字段,在窗口中添加两个数据窗口控件(dw_1、dw_2),dw_1对应主表建立的数据窗口对象,dw_2对应从表建立的数据窗口对象。在dw_1的事件doubleclicked中,获得当前行的值,即为dw_2的参数值,利用dw_2.retrieve(参数值)检索数据即可。这样程序在运行中,鼠标双击dw_1中某一条记录,在dw_2中即可查询出与dw_1中被双击记录有关的从表的一些记录。,9.6.2 主从表的查询,9.6.2 主从表的查询,1查询的基本方法,对大型数据库的查询,都是用SQL语句来操纵后台数据库实现的,其关键是构造合适的where查询子句。PB提供的数据窗口和数据存储能通过调用两种查询函数dwcontrol.Retrieve(argument,argument.)与dwcontrol.SetFilter(format)和 dwcontrol.Filter()的组合来实现与数据库绝大多数的交互操作,。,9.6.3 组合查询的实现,9.6.3 组合查询的实现,2设计思路,通常情况下,用户对表的结构及其查询描述是不清晰的、含糊的,所以,应将表结构展示给用户,由其从中选择所需列名,再根据列名设置不同的模糊条件,通过模糊条件的迭代后,形成综合查询条件。经执行查询得到返回结果集,最后,由用户决定是使用默认排序,还是根据需要重新排序。这其中,为了展示各表的结构,可将系统表pbcatcol导出。为了方便用户对条件的描述和实现数据的一致性约束,采用了下拉式数据窗口的增量式输入的辅助措施。为了方便用户查询结果集,采用了按字段名的适时排序方法。而动态模糊SQL语句的构造,则采用循环迭代的查询字符串得到WHERE查询子句的完整表达和默认排序,实现了查询程序的高通用性和代码的高重用性。,9.6.3 组合查询的实现,2设计思路9.6.3 组合查询的实现,3通用的动态模糊查询的实现,(1)导出系统表pbcatcol以实现表中字段的自动显示,(2)数据窗口中查询条件的设置,(3)动态模糊查询条件的生成,(4)查询结果的显示,9.6.3 组合查询的实现,9.6.3 组合查询的实现,9.6.3 组合查询的实现,(1)导出系统表pbcatcol以实现表中字段的自动显示 导出系统表pbcatcol,设置检索参数为pbcatcol.pbc_owner=wz,并选取其中的pbc-tnam(表名),pbc-cnam(列名),pbc-hdr(中文注释)等字段后,把pbc-tnam和pbc-cnam剪切掉,只保留了pbc-hdr以构造下拉式子数据窗口d_cxzd1,并在d_cx1中挂于“zdlm”字段下,选择pbc-hdr为数据列和显示数据列,并通过外部数据源建立数据窗口d_1挂在“value”字段下,dw_cx1可通过建立表或通过外部数据源建立的数据窗口,其数据窗口形式如图9.5所示。,图9.5 数据窗口d_cx1,9.6.3 组合查询的实现(1)导出系统表pbcatcol,9.6.3 组合查询的实现,建立窗口w_query,在其中添加2个数据窗口控件dw_3和dw_4及3个命令按钮,并在dw_3的Properties中指定DataObject为d_cx1。,在窗口w_query的定义全局变量如下:,datawindowchild dwc,dwc1,string dwsyntax_str,cxbm,tablename,datawindow dw_all,gd_source,定义实例变量如下:,int n,sel,long il_lastrow,string lm2,lm1,9.6.3 组合查询的实现 建立窗口w_query,,9.6.3 组合查询的实现,窗口w_query的open事件中用脚本根据表名参数过滤出相应的表字段,并在条件设置数据窗口dw_3中显示出来:,dw_4.visible=false,tablename=wzbmb,dw_3.getchild(zdlm,dwc)/得到子数据窗口,dwc.settransobject(sqlca)/设置事物对象,dwc.setfilter(pbc_tnam=+tablename+)/根据全局变量tablename设置过滤条件,dwc.filter()/根据设置好的过滤条件过滤,dwc.retrieve()/过滤后再检索,否则无数据,9.6.3 组合查询的实现 窗口w_query,9.6.3 组合查询的实现,(2)数据窗口中查询条件的设置,对应于不同的字段列名,有不同的属性和数据类型,而用户很难分清具体的差别并给予正确的值的输入,所以,必须在字段选好后,就把相应的属性及数据类型配置好供用户选取和修改。因此,我们采用了在数据窗口输入条件时动态地修改下拉式数据窗口相关属性的方式保证用户输入的准确性,并用增量式输入技术对用户输入数据进行适时跟踪和向导。,在dw_3的itemchanged事件里用describe()和modify()函数组合来实现动态子数据窗口功能,其主要程序段如下:,9.6.3 组合查询的实现,9.6.3 组合查询的实现,IF this.getcolumnname()=zdlm THEN,lm1=data,SELECT count()INTO:count FROM pbcatcol,WHERE Pbcatcol.pbc_ownr=wz AND pbcatcol.pbc_hdr=:lm1;,IF count0 THEN,Sel=0,RETURN,END IF,9.6.3 组合查询的实现 在 dw_3中用e,9.6.3 组合查询的实现,dddwcol=this.describe(value.dddw.displaycolumn)/value列子数据窗口的当前显示列,input=this.gettext()/得到输入数据,IF input THEN/有输入数据时,input=lower(left(input,len(input)-this.selectedlength()/除选中字符外输入字符长度,condition=dddwcol+like+input+%,dwc1.setfilter(condition)/设置过滤条件,dwc1.filter()/根据过滤条件过滤记录,IF dwc1.rowcount()0 THEN/如果有记录时,firstline=dwc1.getitemstring(1,aa)/找到过滤后子数据窗口的第一行,/aa为value字段的下拉数据窗口d_1的字段名。,9.6.3 组合查询的实现dddwcol=this.desc,9.6.3 组合查询的实现,this.settext(firstline)/设置浮动数据,this.selecttext(len(input)+1,len(firstline)/选中firstline中还未输入部分,Sel=this.selectedlength()/选中的字符长,ELSE/如果没有满足过滤条件的记录时,this.selecttext(len(input),len(input)/选中没有匹配上的用户刚输入的字符,Sel=1,beep(1)/发出警告声,END IF,END IF,END IF,9.6.3 组合查询的实现 this.settext(fir,9.6.3 组合查询的实现,对于增量式输入还可通过用户定制事件pbm_downkey来实现,但效果不如editchanged事件好,且还需考虑其他键值(如退格键Backspace)的影响。通过setfilter()和filter()函数的搭配使用来设置过滤条件,尤其在本方法中经检索函数retrieve()后再过滤,是从缓冲区而不是数据库过滤记录,不会带来额外的系统开销。,9.6.3 组合查询的实现 对于增量式输入还可,9.6.3 组合查询的实现,(3)动态模糊查询条件的生成,先取出数据窗口dw_3中的模糊条件的相应字段,根据不同的字段类型和运算符进行预处理,再用循环得到最终的条件组合,构成的优化和标准的where子句。即在确定条件按钮的clicked事件中,编写如下脚本:,integer m,k,string data_type,m=1,string cnam,n1,n2,n3,n4,cxtj,errors,cxbm1,orderby,n3plus,string n3plusplus1,n3plusplus2,cxtj1,datawindow dw_yl,boolean net,n=dw_3.rowcount()/n为行数全局变量,IF dw_3.getrow()=n AND n0 THEN,dw_3.setitem(n,ljf,and),END IF,9.6.3 组合查询的实现(3)动态模糊查询条件的生成,9.6.3 组合查询的实现,FOR k=1 TO n/查看dw-3中条件填写是否完全,net=(isnull(dw_3.getitemstring(k,zdlm)=true OR isnull(dw_3.getitemstring(k,ysf)=true OR isnull(dw_3.getitemstring(k,value)=true OR isnull(dw_3.getitemstring(k,ljf)=true)or net,NEXT,IF n0 AND net=false THEN/完全条件数=1时,DO WHILE m=,n3plusplus1=,n3plusplus2=,CASE like,not like,n3plusplus1=%,n3plusplus2=%,END CHOOSE,9.6.3 组合查询的实现,9.6.3 组合查询的实现,cxtj1=cxtj1+cnam+n2+n3plus+n3plusplus1+n3+n3plusplus2+n3plus+n4+“/最终的查询条件,m=m+1/计数器增加1,LOOP,cxtj1=select*from+tablename+where+cxtj1+order by+orderby,dwsyntax_str=sqlca.syntaxfromsql(cxtj1,style(type=grid),errors)/设置数据窗口的语法,IF Len(ERRORS)0 THEN/语法出错警报,MessageBox(Caution,SyntaxFromSQL caused these errors:+ERRORS),RETURN,END IF,9.6.3 组合查询的实现cxtj1=cxtj1+cna,9.6.3 组合查询的实现,dw_4.reset(),dw_4.Create(dwsyntax_str,ERRORS)/根据语法动态创建一个数据窗口,dw_4.settransobject(sqlca),dw_4.retrieve()/检索得到最终的查询结果,dw_4.Object.DataWindow.ReadOnly=Yes/设置动态的数据窗口为只读属性,
点击显示更多内容>>

最新DOC

最新PPT

最新RAR

收藏 下载该资源
网站客服QQ:3392350380
装配图网版权所有
苏ICP备12009002号-6