通用查询模块的设计与实现.docx
- 文档编号:6856988
- 上传时间:2023-01-11
- 格式:DOCX
- 页数:6
- 大小:18.16KB
通用查询模块的设计与实现.docx
《通用查询模块的设计与实现.docx》由会员分享,可在线阅读,更多相关《通用查询模块的设计与实现.docx(6页珍藏版)》请在冰豆网上搜索。
通用查询模块的设计与实现
通用查询模块的设计与实现
摘要:
目前信息管理系统(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用来创建显示该查询条件窗体。
具体实现代码如下:
procedureShowFindCondition(CDS:
TClientDataSet;flag:
string;varcondition,display:
string;parentWindow:
TForm);
begin
cdsTemp:
=CDS;
sFlag:
=flag;
sCondition:
=condition;
sDisplay:
=display;
Application.CreateForm(TF_FindCondition,F_FindCondition);
ifflag='1'then
begin
F_FindCondition.FormStyle:
=fsNormal;
F_FindCondition.Visible:
=False;
F_FindCondition.Position:
=poScreenCenter;
F_FindCondition.ShowModal;
condition:
=sCondition;
display:
=sDisplay;
end
else
F_FindCondition.Show;
end;
(3)设置窗体的OnCreate事件,完成程序的初始化工作。
将ShowFindCondition过程传递过来的数据集cdsTemp的内容与用来存放项目的下拉组合框cbFields进行关联;如果当前有查询条件,将其在列表框lbFilter1中显示出来。
具体实现如下:
procedureTF_FindCondition.FormCreate(Sender:
TObject);
var
i:
Integer;
begin
inherited;
fori:
=0tocdsTemp.FieldCount-1do
begin
ifcdsTemp.Fields.Fields[i].Visiblethen
begincbFields.Items.AddObject(cdsTemp.Fields.Fields[i].DisplayLabel,cdsTemp.Fields.Fields[i]);
end;
end;
cbLink.ItemIndex:
=0;
whilepos(';',sCondition)<>0do
begin
lbFilter1.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返回给调用程序,并关闭该窗体。
具体代码如下:
procedureTF_FindCondition.btOkClick(Sender:
TObject);
var
i:
Integer;
begin
inherited;
fori:
=0tolbFilter.Items.Count-1do
begin
sCondition:
=sCondition+lbFilter.Items.Strings[i];
sDisplay:
=sDisplay+lbFilter1.Items.Strings[i];
end;
Close;
end;
2模块的调用及查询的实现
其它Delphi应用程序需要使用通用查询模块时,只需将通用查询模块的单元文件F_FindCondition.Pas和对应的窗体文件F_FindCondition.dfm拷贝到应用程序的目录中,并通过Delphi主菜单的“Project”→“AddtoProject”命令将F_FindCondition.Pas加入当前应用程序中,并在应用程序中的适当位置,通过下面的代码就可调用通用查询模块,实现通用多条件查询。
以下是客户询价单中调用查询模块实现查询功能的具体代码:
procedureTF_XjdQueryTest.ToolButton5Click(Sender:
TObject);
var
sWhere1:
String;
begin
inherited;
ShowFindCondition(ClientDataSet1,'1',sCondition,sDisplay,Self);
sWhere1:
=StringReplace(sCondition,';','',[rfReplaceAll]);
ifsWhere=sWhere1thenExit;
sWhere:
=sWhere1;
ClientDataSet1.Close;
ifsWhere<>''then
ClientDataSet1.CommandText:
='select*fromv_XjdTitlewhere'+sWhere
else
ClientDataSet1.CommandText:
='select*fromv_XjdTitle';
ClientDataSet1.Open;
end;
3系统测试
现在就可以在你的Delphi应用程序中调用该模块实现通用数据查询,下面是客户询价单中调用查询模块实现查询功能的实际效果,如图2所示:
用户先在图2中单击查询按钮。
弹出查询条件窗口,在“项目”列表框中选择要查询的字段名;在“运算符”列表框中选择要实现查询的条件;在“值”列表框中输入或选择当前查询字段的查询值;输入一个完整的查询条件后,可以通过单击“添加条件”按钮继续添加查询条件,也可以单击“删除条件”将当前条件删除。
查询条件输入完成后,单击“确定”按钮,程序通过调用“确定”按钮单击事件自动生成查询表达式,并关闭查询窗口,最终符合条件的查询结果在界面的Grid中显示。
4结束结
通过上述通用查询模块,用户可以非常方便地在Delphi开发的信息管理系统中加入风格统一的查询模块,为快速编写应用程序提供了很大的帮助,同时也方便了用户灵活地自定义查找条件,最大限度地满足用户的需求。
由于篇幅有限,有些程序代码未在文章中详细列出。
参考文献:
[1]李文立.Delphi数据库系统开发案例精选[M].北京:
人民邮电出版社,2006.
[2]刘艺.Delphi5企业级解决方案及应用剖析[M].北京:
机械工业出版社,2000.
[3]陈海燕.多数据库系统中的关键技术研究[D].武汉:
武汉理工大学,2007.
[4]李瑞轩,卢正鼎.多数据库系统原理与技术[M].北京:
电子工业出版社,2005.
TheDesignandImplementationofGeneralInquirestheModule
Abstract:
Atpresent,informationmanagementsystem(MIS)hasbeenwidelyusedinmanyfields,buttothedatabasedataquerylackseffectiverealizationmethod.ThispaperintroducesinDelphithroughthedataset(ClientDataSet)addconditionsensuregeneralmanyconditionsinquires,aneffectivemethodtothedevelopmentofDelphiinformationmanagementsystemtohaveaunifiedeffectiveinquiresthemethod,thusspeedingupdevelopmentspeedofapplications.
KeyWords:
Delphi;ClientDataSet;GeneralMotors;Inquires
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 通用 查询 模块 设计 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)