当前位置:文档之家› 通用查询模块的设计与实现

通用查询模块的设计与实现

通用查询模块的设计与实现摘要:目前信息管理系统(MIS)已经广泛应用于各行各业,但对数据库中数据的查询缺乏统一有效的实现方法。

介绍了在Delphi中通过数据集(ClientDataSet)添加条件实现通用多条件查询的一种有效方法,使Delphi开发的信息管理系统有一种统一有效的查询方法,从而加快应用程序的开发速度。

关键词:Delphi;数据集(ClientDataSet);通用;查询0 引言目前信息管理系统(MIS)已经广泛应用于各行各业,而对数据信息的查询操作是这些信息管理系统最常用的操作之一,也是这些信息管理系统必不可少的核心功能之一。

Delphi是常用的数据库信息管理系统开发工具之一,在利用它开发的信息管理系统中,对数据的查询往往只能对其中的几个字段进行有限的查询,这些往往是程序中已设置好的对应的查询条件,因此每个应用程序都必须编制自己特有的查询模块,这些查询模块不能通用,极大地影响了软件的开发效率,同时也不能方便用户灵活地自定义查询条件。

为此下面将介绍一种根据查询数据集(ClientDataSet)自动提取可用于查询的字段,并由用户根据自己需要,自由设置查询条件的Delphi通用查询模块,供所有的Delphi应用程序调用。

1 查询的分析及实现在Delphi中,基于三层结构的数据查询一般可由以下几种方法实现:①在TClientDataSet组件的SQL属性中设置Where条件过滤指定的记录;②设置数据集(TClientDataSet对象)的Filter属性过滤指定的记录;③设置数据集(TClientDataSet对象)的OnFilterRecord事件过滤指定的记录。

由于本文介绍的是根据查询数据集自动提取可用于查询字段的通用查询模块,在三层结构中,考虑到效率的因素,因此使用第一种方法实现通用查询。

1.1 通用查询的算法分析为了实现通用多条件查询,其它模块使用本模块提供的TDataSource组件并通过其DataSet属性向本模块传递一个所需查询的数据集:①首先从得到的数据集中取得用户可用于查询的字段的信息与查询字段所使用的TComboBox对象(cbFields.Items)中保存,供用户查询时取用;②初始化查询条件,将TListBox内容清空用于存放用户输入的条件。

本文使用两个TListBox控件:lbFilter1用于显示查询条件;lbFilter用于存放程序中使用的查询条件,其Visible属性为False;③选择要查询的字段名、查询的条件运算符,输入该字段的查询值,程序根据选择的查询字段名及条件生成一个用于查询的简化表达式;④单击“添加条件”按钮,添加一个查询条件,程序转到③)处继续执行,可以输入下一个查询条件,从而生成复合条件的查询;⑤单击“确定”按钮,程序根据lbFilter1中的多个查询条件及连接运算符生成一个对应的Where查询条件表达式,并应用于数据集,最终得到用户所需的查询结果。

1.2 使用的组件及其属性设置为了实现多条件查询,本模块中使用的组件及具体窗口如图1所示:1.3 查询功能的实现按以上界面设置组件的属性后,就可以通过定义程序使用的变量及设置所需的事件来完成所需的查询任务。

(1) 为了实现程序的任务,在类中定义如下的变量:F_FindCondition:TF_FindCondition;cdsTemp:TClientDataSet;sFlag,sCondition,sDisplay:String;//1:查看其中cdsTemp用来存放传递过来的TClientDataSet查询的数据集信息;sCondition变量用于存放用户自定义的条件,以便程序中使用;sDisplay变量用来存放显示用户自定义的条件,仅用于显示。

(2) 在类中定义一个过程ShowFindCondition用来创建显示该查询条件窗体。

具体实现代码如下:procedure ShowFindCondition(CDS:TClientDataSet;flag:string;varcondition,display:string;parentWindow:TForm);begincdsTemp:= CDS;sFlag:= flag;sCondition:= condition;sDisplay:= display;Application.CreateForm(TF_FindCondition,F_FindCondition);if flag ='1' thenbeginF_FindCondition.FormStyle:= fsNormal;F_FindCondition.Visible:= False;F_FindCondition.Position:= poScreenCenter;F_FindCondition.ShowModal;condition:= sCondition;display:= sDisplay;endelseF_FindCondition.Show;end;(3) 设置窗体的OnCreate事件,完成程序的初始化工作。

将ShowFindCondition 过程传递过来的数据集cdsTemp 的内容与用来存放项目的下拉组合框cbFields进行关联;如果当前有查询条件,将其在列表框lbFilter1中显示出来。

具体实现如下:procedure TF_FindCondition.FormCreate(Sender:TObject);vari:Integer;begininherited;for i:= 0 to cdsTemp.FieldCount -1 dobeginif cdsTemp.Fields.Fields[i].Visible thenbegin cbFields.Items.AddObject(cdsTemp.Fields.Fields[i].DisplayLabel,cdsTemp.Fields.Fields[i]);end;end;cbLink.ItemIndex:= 0;while pos(';',sCondition)<>0 dobeginlbFilter1.Items.Add(Copy(sDisplay,1,pos(';',sDisplay)));delete(sDisplay,1,pos(';',sDisplay));lbFilter.Items.Add(Copy(sCondition,1,pos(';',sCondition)));delete(sCondition,1,pos(';',sCondition));end;end;(4) 设置cbFields的OnChange事件。

当项目的字段改变后,将改变后的字段对应的值填入值下拉列表框cbValue中,以方便用户的操作。

具体实现代码详见源程序。

(5) 当单击添加条件按钮时,将用户选择的条件添加到lbFilter1中,在处理时应根据选择的运算符及对应字段的数据类型来组织条件。

具体代码见源程序。

(6) 当单击清除条件按钮时,将用户原来选择的条件清空。

lbFilter1.Clear;lbFilter.Clear;sCondition:='';sDisplay:='';(7) 当单击确定按钮时,生产用户添加的条件,并通过变量sCondition,sDisplay返回给调用程序,并关闭该窗体。

具体代码如下:procedure TF_FindCondition.btOkClick(Sender:TObject);vari:Integer;begininherited;for i:=0 to lbFilter.Items.Count -1 dobeginsCondition:= sCondition + lbFilter.Items.Strings[i];sDisplay:= sDisplay + lbFilter1.Items.Strings[i];end;Close;end;2 模块的调用及查询的实现其它Delphi应用程序需要使用通用查询模块时,只需将通用查询模块的单元文件F_FindCondition.Pas和对应的窗体文件F_FindCondition.dfm拷贝到应用程序的目录中,并通过Delphi主菜单的“Project”→“Add to Project”命令将F_FindCondition.Pas加入当前应用程序中,并在应用程序中的适当位置,通过下面的代码就可调用通用查询模块,实现通用多条件查询。

以下是客户询价单中调用查询模块实现查询功能的具体代码:procedure TF_XjdQueryTest.ToolButton5Click(Sender:TObject);varsWhere1:String;begininherited;ShowFindCondition(ClientDataSet1,'1',sCondition,sDisplay,Self);sWhere1:=StringReplace(sCondition,';',' ',[rfReplaceAll]);if sWhere = sWhere1 then Exit;sWhere:= sWhere1;ClientDataSet1.Close;if sWhere<> '' thenmandText:= 'select * from v_XjdTitle where'+ sWhereelsemandText:= 'select * from v_XjdTitle ';ClientDataSet1.Open;end;3 系统测试现在就可以在你的Delphi应用程序中调用该模块实现通用数据查询,下面是客户询价单中调用查询模块实现查询功能的实际效果,如图2所示:用户先在图2中单击查询按钮。

弹出查询条件窗口,在“项目”列表框中选择要查询的字段名;在“运算符”列表框中选择要实现查询的条件;在“值”列表框中输入或选择当前查询字段的查询值;输入一个完整的查询条件后,可以通过单击“添加条件”按钮继续添加查询条件,也可以单击“删除条件”将当前条件删除。

查询条件输入完成后,单击“确定”按钮,程序通过调用“确定”按钮单击事件自动生成查询表达式,并关闭查询窗口,最终符合条件的查询结果在界面的Grid中显示。

4 结束结通过上述通用查询模块,用户可以非常方便地在Delphi开发的信息管理系统中加入风格统一的查询模块,为快速编写应用程序提供了很大的帮助,同时也方便了用户灵活地自定义查找条件,最大限度地满足用户的需求。

相关主题