1、9.6.1 9.6.1 简单查询的实现简单查询的实现9.6.2 9.6.2 主从表的查询主从表的查询9.6.3 9.6.3 组合查询的实现组合查询的实现9.6 9.6 数据查询设计数据查询设计第第9 9章章 数据库应用系统开发工具数据库应用系统开发工具PBPB2 简单查询的实现较为简单,首先建立一个带参数的简单查询的实现较为简单,首先建立一个带参数的数据窗口,在窗口中除添加数据窗口控件(数据窗口,在窗口中除添加数据窗口控件(dw_1dw_1)和命)和命令按钮(令按钮(cb_1cb_1)外,还需添加一个单行编辑框()外,还需添加一个单行编辑框(sle_1sle_1),),该框主要用于输入数据。例
2、如对该框主要用于输入数据。例如对WzbmbWzbmb建立数据窗口,定建立数据窗口,定义一个字符型参数,并使参数与字段义一个字符型参数,并使参数与字段wzbmwzbm对应起来。在对应起来。在命令按钮命令按钮cb_1cb_1的的clickedclicked事件中写上:事件中写上:dw_1.retrieve(sle_1.text)dw_1.retrieve(sle_1.text)即可。应当注意的是即可。应当注意的是sle_1.textsle_1.text是字符型的,如果数据窗口参数是其它类型,是字符型的,如果数据窗口参数是其它类型,必须进行强制转换。必须进行强制转换。9.6.1 9.6.1 简单查询
3、的实现简单查询的实现第第9 9章章 数据库应用系统开发工具数据库应用系统开发工具PBPB3 在实际应用中会经常出现主从表的查询。其实现方在实际应用中会经常出现主从表的查询。其实现方法为:对主表建立一个数据窗口,对从表建立一个带参法为:对主表建立一个数据窗口,对从表建立一个带参数的数据窗口,其参数对应的字段为主从表的公共字段,数的数据窗口,其参数对应的字段为主从表的公共字段,在窗口中添加两个数据窗口控件(在窗口中添加两个数据窗口控件(dw_1dw_1、dw_2dw_2),dw_1,dw_1对对应主表建立的数据窗口对象,应主表建立的数据窗口对象,dw_2dw_2对应从表建立的数据对应从表建立的数据
4、窗口对象。在窗口对象。在dw_1dw_1的事件的事件doubleclickeddoubleclicked中,获得当前行中,获得当前行的值,即为的值,即为dw_2dw_2的参数值,利用的参数值,利用dw_2.retrieve(dw_2.retrieve(参数值参数值)检索数据即可。这样程序在运行中,鼠标双击检索数据即可。这样程序在运行中,鼠标双击dw_1dw_1中某中某一条记录,在一条记录,在dw_2dw_2中即可查询出与中即可查询出与dw_1dw_1中被双击记录有中被双击记录有关的从表的一些记录。关的从表的一些记录。9.6.2 9.6.2 主从表的查询主从表的查询第第9 9章章 数据库应用系统
5、开发工具数据库应用系统开发工具PBPB41 1查询的基本方法查询的基本方法 对大型数据库的查询,都是用对大型数据库的查询,都是用SQLSQL语句来操纵后台数语句来操纵后台数据库实现的,其关键是构造合适的据库实现的,其关键是构造合适的wherewhere查询子句。查询子句。PBPB提提供的数据窗口和数据存储能通过调用两种查询函数供的数据窗口和数据存储能通过调用两种查询函数dwcontrol.Retrieve(argumentdwcontrol.Retrieve(argument,argument.),argument.)与与dwcontrol.SetFilter(formatdwcontrol.
6、SetFilter(format)和和 dwcontrol.Filterdwcontrol.Filter()()的组合来实现与数据库绝大多数的交互操作的组合来实现与数据库绝大多数的交互操作。9.6.3 9.6.3 组合查询的实现组合查询的实现第第9 9章章 数据库应用系统开发工具数据库应用系统开发工具PBPB52 2设计思路设计思路 通常情况下,用户对表的结构及其查询描述是不清晰通常情况下,用户对表的结构及其查询描述是不清晰的、含糊的,所以,应将表结构展示给用户,由其从中选的、含糊的,所以,应将表结构展示给用户,由其从中选择所需列名,再根据列名设置不同的模糊条件,通过模糊择所需列名,再根据列名
7、设置不同的模糊条件,通过模糊条件的迭代后,形成综合查询条件。经执行查询得到返回条件的迭代后,形成综合查询条件。经执行查询得到返回结果集,最后,由用户决定是使用默认排序,还是根据需结果集,最后,由用户决定是使用默认排序,还是根据需要重新排序。这其中,为了展示各表的结构,可将系统表要重新排序。这其中,为了展示各表的结构,可将系统表pbcatcolpbcatcol导出。为了方便用户对条件的描述和实现数据的导出。为了方便用户对条件的描述和实现数据的一致性约束,采用了下拉式数据窗口的增量式输入的辅助一致性约束,采用了下拉式数据窗口的增量式输入的辅助措施。为了方便用户查询结果集,采用了按字段名的适时措施。
8、为了方便用户查询结果集,采用了按字段名的适时排序方法。而动态模糊排序方法。而动态模糊SQLSQL语句的构造,则采用循环迭代的语句的构造,则采用循环迭代的查询字符串得到查询字符串得到WHEREWHERE查询子句的完整表达和默认排序,实查询子句的完整表达和默认排序,实现了查询程序的高通用性和代码的高重用性。现了查询程序的高通用性和代码的高重用性。9.6.3 9.6.3 组合查询的实现组合查询的实现第第9 9章章 数据库应用系统开发工具数据库应用系统开发工具PBPB63 3通用的动态模糊查询的实现通用的动态模糊查询的实现(1 1)导出系统表导出系统表pbcatcolpbcatcol以实现表中字段的自
9、动显示以实现表中字段的自动显示(2 2)数据窗口中查询条件的设置数据窗口中查询条件的设置(3 3)动态模糊查询条件的生成动态模糊查询条件的生成(4 4)查询结果的显示查询结果的显示9.6.3 9.6.3 组合查询的实现组合查询的实现第第9 9章章 数据库应用系统开发工具数据库应用系统开发工具PBPB79.6.3 9.6.3 组合查询的实现组合查询的实现(1)导出系统表导出系统表pbcatcol以实现表中字段的自动显示以实现表中字段的自动显示 导出系统表导出系统表pbcatcol,设置检索参数为,设置检索参数为pbcatcol.pbc_owner=wz,并选取其中的,并选取其中的pbc-tnam
10、(表名)(表名),pbc-cnam(列名)(列名),pbc-hdr(中文注释)等字段(中文注释)等字段后,把后,把pbc-tnam和和pbc-cnam剪切掉,只保留了剪切掉,只保留了pbc-hdr以构以构造下拉式子数据窗口造下拉式子数据窗口d_cxzd1,并在,并在d_cx1中挂于中挂于“zdlm”字段下,选择字段下,选择pbc-hdr为数据列和显示数据列,并通过外部数为数据列和显示数据列,并通过外部数据源建立数据窗口据源建立数据窗口d_1挂在挂在“value”字段下,字段下,dw_cx1可通过可通过建立表或通过外部数据源建立的数据窗口,其数据窗口形式建立表或通过外部数据源建立的数据窗口,其数
11、据窗口形式如图如图9.5所示。所示。图图9.5 数据窗口数据窗口d_cx1第第9 9章章 数据库应用系统开发工具数据库应用系统开发工具PBPB89.6.3 9.6.3 组合查询的实现组合查询的实现 建立窗口建立窗口w_queryw_query,在其中添加,在其中添加2 2个数据窗口控件个数据窗口控件dw_3dw_3和和dw_4dw_4及及3 3个命令按钮,并在个命令按钮,并在dw_3dw_3的的PropertiesProperties中指定中指定DataObjectDataObject为为d_cx1d_cx1。在窗口在窗口w_queryw_query的定义全局变量如下:的定义全局变量如下:da
12、tawindowchilddatawindowchild dwc,dwc1 dwc,dwc1string string dwsyntax_str,cxbm,tablenamedwsyntax_str,cxbm,tablename datawindowdatawindow dw_all,gd_sourcedw_all,gd_source定义实例变量如下:定义实例变量如下:intint n,seln,sellong long il_lastrowil_lastrowstring lm2,lm1string lm2,lm1第第9 9章章 数据库应用系统开发工具数据库应用系统开发工具PBPB99.6.
13、3 9.6.3 组合查询的实现组合查询的实现 窗口窗口w_query的的open事件中用脚本根据表名参数过滤事件中用脚本根据表名参数过滤出相应的表字段,并在条件设置数据窗口出相应的表字段,并在条件设置数据窗口dw_3中显示出来:中显示出来:dw_4.visible=falsetablename=wzbmbdw_3.getchild(zdlm,dwc)/得到子数据窗口得到子数据窗口dwc.settransobject(sqlca)/设置事物对象设置事物对象dwc.setfilter(pbc_tnam=+tablename+)/根据全局根据全局变量变量tablename设置过滤条件设置过滤条件dw
14、c.filter()/根据设置好的过滤条件过滤根据设置好的过滤条件过滤dwc.retrieve()/过滤后再检索,否则无数据过滤后再检索,否则无数据第第9 9章章 数据库应用系统开发工具数据库应用系统开发工具PBPB109.6.3 9.6.3 组合查询的实现组合查询的实现(2)数据窗口中查询条件的设置数据窗口中查询条件的设置 对应于不同的字段列名,有不同的属性和数据类型,而用对应于不同的字段列名,有不同的属性和数据类型,而用户很难分清具体的差别并给予正确的值的输入,所以,必须在户很难分清具体的差别并给予正确的值的输入,所以,必须在字段选好后,就把相应的属性及数据类型配置好供用户选取和字段选好后
15、,就把相应的属性及数据类型配置好供用户选取和修改。因此,我们采用了在数据窗口输入条件时动态地修改下修改。因此,我们采用了在数据窗口输入条件时动态地修改下拉式数据窗口相关属性的方式保证用户输入的准确性,并用增拉式数据窗口相关属性的方式保证用户输入的准确性,并用增量式输入技术对用户输入数据进行适时跟踪和向导。量式输入技术对用户输入数据进行适时跟踪和向导。在在dw_3的的itemchanged事件里用事件里用describe()和和modify()函数组函数组合来实现动态子数据窗口功能,其主要程序段如下:合来实现动态子数据窗口功能,其主要程序段如下:第第9 9章章 数据库应用系统开发工具数据库应用系
16、统开发工具PBPB119.6.3 9.6.3 组合查询的实现组合查询的实现IF this.getcolumnname()=zdlm THENlm1=dataSELECT count()INTO:count FROM pbcatcol WHERE Pbcatcol.pbc_ownr=wz AND pbcatcol.pbc_hdr=:lm1;IF count0 THEN Sel=0 RETURNEND IF第第9 9章章 数据库应用系统开发工具数据库应用系统开发工具PBPB149.6.3 9.6.3 组合查询的实现组合查询的实现dddwcol=this.describe(value.dddw.di
17、splaycolumn)/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.rowco
18、unt()0 THEN/如果有记录时如果有记录时 firstline=dwc1.getitemstring(1,aa)/找到过滤后子数据窗口的第一找到过滤后子数据窗口的第一行行/aa为为value字段的下拉数据窗口字段的下拉数据窗口d_1的字段名。的字段名。第第9 9章章 数据库应用系统开发工具数据库应用系统开发工具PBPB159.6.3 9.6.3 组合查询的实现组合查询的实现 this.settext(firstline)/设置浮动数据设置浮动数据 this.selecttext(len(input)+1,len(firstline)/选中选中firstline中还未输中还未输入部分入部分
19、 Sel=this.selectedlength()/选中的字符长选中的字符长 ELSE/如果没有满足过滤条件的记录时如果没有满足过滤条件的记录时 this.selecttext(len(input),len(input)/选中没有匹配上的用户刚输选中没有匹配上的用户刚输入的字符入的字符 Sel=1 beep(1)/发出警告声发出警告声END IF END IFEND IF第第9 9章章 数据库应用系统开发工具数据库应用系统开发工具PBPB169.6.3 9.6.3 组合查询的实现组合查询的实现 对于增量式输入还可通过用户定制事件对于增量式输入还可通过用户定制事件pbm_downkey来实现,
20、但效果不如来实现,但效果不如editchanged事件好,事件好,且还需考虑其他键值(如退格键且还需考虑其他键值(如退格键Backspace)的影响。通)的影响。通过过setfilter()和和filter()函数的搭配使用来设置过滤条件,尤函数的搭配使用来设置过滤条件,尤其在本方法中经检索函数其在本方法中经检索函数retrieve()后再过滤,是从缓冲区后再过滤,是从缓冲区而不是数据库过滤记录,不会带来额外的系统开销。而不是数据库过滤记录,不会带来额外的系统开销。第第9 9章章 数据库应用系统开发工具数据库应用系统开发工具PBPB179.6.3 9.6.3 组合查询的实现组合查询的实现(3)
21、动态模糊查询条件的生成动态模糊查询条件的生成 先取出数据窗口先取出数据窗口dw_3中的模糊条件的相应字段,根据不同的字段类型和运算符中的模糊条件的相应字段,根据不同的字段类型和运算符进行预处理,再用循环得到最终的条件组合,构成的优化和标准的进行预处理,再用循环得到最终的条件组合,构成的优化和标准的where子句。即子句。即在在确定条件确定条件按钮的按钮的clicked事件中,编写如下脚本:事件中,编写如下脚本:integer m,kstring data_typem=1string cnam,n1,n2,n3,n4,cxtj,errors,cxbm1,orderby,n3plusstring
22、n3plusplus1,n3plusplus2,cxtj1datawindow dw_ylboolean netn=dw_3.rowcount()/n为行数全局变量为行数全局变量IF dw_3.getrow()=n AND n0 THEN dw_3.setitem(n,ljf,and)END IF第第9 9章章 数据库应用系统开发工具数据库应用系统开发工具PBPB189.6.3 9.6.3 组合查询的实现组合查询的实现FOR k=1 TO n/查看查看dw-3中条件填写是否完全中条件填写是否完全net=(isnull(dw_3.getitemstring(k,zdlm)=true OR isn
23、ull(dw_3.getitemstring(k,ysf)=true OR isnull(dw_3.getitemstring(k,value)=true OR isnull(dw_3.getitemstring(k,ljf)=true)or net NEXTIF n0 AND net=false THEN/完全条件数完全条件数=1时时 DO WHILE m=n/循环取查询条件标准化循环取查询条件标准化n1=dw_3.getitemstring(m,2,primary!,false)/取出第取出第m行的列名行的列名zdlm SELECT pbc_cnam INTO:cnam FROM pbca
24、tcol WHERE pbc_hdr=:n1 AND pbc_tnam=:tablename;IF m=1 THENorderby=cnam/默认第默认第1条件为排序条件条件为排序条件END IF第第9 9章章 数据库应用系统开发工具数据库应用系统开发工具PBPB199.6.3 9.6.3 组合查询的实现组合查询的实现n2=dw_3.getitemstring(m,3,primary!,false)n3=dw_3.getitemstring(m,4,primary!,false)n4=dw_3.getitemstring(m,5,primary!,false)/假设只有字符型和数字型两假设只有
25、字符型和数字型两种类型种类型SELECT data_type INTO:data_type FROM user_tab_column WHERE owner=wz AND table_name=:tablename AND column_name=:cnam;IF lower(data_type)number THENn3plus=ELSE n3plus=END IFIF isnull(n4)=true OR m=n THEN/处理逻辑符处理逻辑符n4=END IF第第9 9章章 数据库应用系统开发工具数据库应用系统开发工具PBPB209.6.3 9.6.3 组合查询的实现组合查询的实现CHO
26、OSE CASE n2/按按ysf分类处理查询条件,分类处理查询条件,CASE=,=,n3plusplus1=n3plusplus2=CASE like,not liken3plusplus1=%n3plusplus2=%END CHOOSE第第9 9章章 数据库应用系统开发工具数据库应用系统开发工具PBPB219.6.3 9.6.3 组合查询的实现组合查询的实现cxtj1=cxtj1+cnam+n2+n3plus+n3plusplus1+n3+n3plusplus2+n3plus+n4+“/最终的查询条件最终的查询条件m=m+1/计数器增加计数器增加1 LOOPcxtj1=select*fr
27、om+tablename+where+cxtj1+order by+orderbydwsyntax_str=sqlca.syntaxfromsql(cxtj1,style(type=grid),errors)/设置数据窗口的语法设置数据窗口的语法IF Len(ERRORS)0 THEN/语法出错警报语法出错警报MessageBox(Caution,SyntaxFromSQL caused these errors:+ERRORS)RETURNEND IF第第9 9章章 数据库应用系统开发工具数据库应用系统开发工具PBPB229.6.3 9.6.3 组合查询的实现组合查询的实现dw_4.rese
28、t()dw_4.Create(dwsyntax_str,ERRORS)/根据语法动态创建一个数据窗口根据语法动态创建一个数据窗口dw_4.settransobject(sqlca)dw_4.retrieve()/检索得到最终的查询结果检索得到最终的查询结果dw_4.Object.DataWindow.ReadOnly=Yes/设置动态的数据窗口为只读设置动态的数据窗口为只读属性属性IF dw_4.retrieve()0 THEN/创建动态数据窗口的出错警报创建动态数据窗口的出错警报MessageBox(Caution,Create causethese errors:+ERRORS)第第9 9
29、章章 数据库应用系统开发工具数据库应用系统开发工具PBPB239.6.3 9.6.3 组合查询的实现组合查询的实现RETURNEND IF ELSEmessagebox(提示提示:,没有或不全的查询条件,请填写完整后再查没有或不全的查询条件,请填写完整后再查询询!,stopsign!)returnEND IFdw_4.visible=truedw_4.setrowfocusindicator(hand!)以上脚本只包含基本的运算符,但可以论证余下的以上脚本只包含基本的运算符,但可以论证余下的in,between,not等等运算符均可以通过简单运算符的组合来实现,亦即以上运算符已构成了一运算符均
30、可以通过简单运算符的组合来实现,亦即以上运算符已构成了一个完备集,可对任何记录查询。个完备集,可对任何记录查询。第第9 9章章 数据库应用系统开发工具数据库应用系统开发工具PBPB249.6.3 9.6.3 组合查询的实现组合查询的实现(4)查询结果的显示查询结果的显示 在生成查询条件时,默认按第一查询条件的升序排列,但在实际在生成查询条件时,默认按第一查询条件的升序排列,但在实际应用中,用户往往希望可以动态改变查询结果集的显示效果来找到最适应用中,用户往往希望可以动态改变查询结果集的显示效果来找到最适合的记录。为此,在查询结果的显示数据窗口合的记录。为此,在查询结果的显示数据窗口dw_4中,
31、通过中,通过doubleclicked事件来实现按指定列的升序来显示记录,其脚本如下:事件来实现按指定列的升序来显示记录,其脚本如下:sort_str=this.getcolumnname()+Athis.SetRedraw(false)/关闭重绘,防止闪烁关闭重绘,防止闪烁this.SetSort(sort_str)/设置排序条件设置排序条件this.Sort()/按排序条件排序按排序条件排序this.SetRedraw(true)/开启重绘功能开启重绘功能以上脚本中使用的是升序排列,如需要按降序排列,只需将以上脚本中使用的是升序排列,如需要按降序排列,只需将setsort()函函数中的参数改为数中的参数改为“D”,同时在窗口中加入一个单选框,其中包含升序,同时在窗口中加入一个单选框,其中包含升序和降序单选按钮。一个查询实例如图和降序单选按钮。一个查询实例如图9.6所示:所示:第第9 9章章 数据库应用系统开发工具数据库应用系统开发工具PBPB25 图图9.6 组合查询结果显示组合查询结果显示
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。