论文部分内容阅读
摘要:本文详细介绍了在Delphi中,如何对数据库中的数据错综复杂的复合查询。
关键词: Delphi;复合查询
中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)04-10899-02
1 引言
在编写有关数据库管理系统时,设计单一的数据查询很容易,但要实现多功能的复合查询就需要费一点周折。本人在编写企业安全管理系统时实现了较为复杂的查询功能;在此拿出来与大家共同探讨。系统的前台环境为Delphi6.0,后台数据库单机版不做限制,网络版采用SQL Server2000,这里以Microsoft Access数据库为例做简单介绍。
2 设计思想
要实现错综复杂的复合查询,只要能够动态生成合法的SQL查询语句即可。换句话说,就是要动态的得到要显示的字段和查询的条件,然后再把取得的要显示的字段和待查询的条件组合成合法的SQL语句送往数据库执行查询。
3 实现方法
3.1 数据库
表字段名最好用英文,这是因为Delphi对中文字段名支持的不是很好。
3.2 本程序所用到的控件的属性(略)
3.3 编码
(1)在窗体Picture_Zoom的Public部分定义如下全局变量:
(2)在窗体Pictue_Zoom的FormShow事件中编写如下代码:
procedure Tcar_Date_Complex_Query.BitBtn7Click(Sender: Tobject);
beginwhile Listbox2.Items.Count>0 do
beginListbox2.Items.Delete(0); end;
bitbtn7.Enabled :=false;move :='true';query :='false';end;
(7)在Bitbt6的Click事件编写如下代码(负责组合SQL语句,最后执行查询命令):
procedure Tcar_Date_Complex_Query.BitBtn6Click(Sender: Tobject);
var str1,str2,str3 :string;var ldh :integer;
beginstr1 :=''; str2 :='';str3 :='';Exist_No_No :='false';
if (listbox2.Items.Count=0) and (listbox4.Items.Count<>0) then
beginquery :='true';end;
if (query ='true') and (listbox4.Items.Count<>0) then
begin for ldh :=0 to listbox4.Items.Count-1 do
begin Exist_No_No:='true'; end;
if (group_by ='true') and (Listbox4.items[ldh] ='number') then
begin exist_number :='true';end
elsebegin
if str1<>'' then
beginstr1 :=str1+','+Listbox4.items[ldh];end
elsebegin str1 :=Listbox4.items[ldh]; end;
for ldh :=0 to listbox2.Items.Count-1 do
begin Listbox2.items[ldh] :=Car_Date_CdataFieldToEDataField(Listbox2.items[ldh]);
if ldh=0 thenbeginstr2 :=' where '; end;
if ldh beginstr2 :=str2+ChineseExpressionToEnglishExpression(Listbox2.items[ldh])+' '; end
else beginstr2:=str2+ChineseExpressionToEnglishExpression(Listbox2.items[ldh]); end; if (group_by ='false') or (exist_number ='false') then
beginstr :='select '+str1+' from '+tablename+str2;end
else begin
if (listbox4.Items.Count =1) and (listbox4.Items[0] ='number') then
begin str1 :='number'; str :='select '+str1+' from '+tablename+str2;end
if group_by ='true' then
begin str :='select '+str1+',count('+Car_Date_CdataFieldToEDataField(Listbox4.items[0])+') as 数量'+str3+' from '+tablename+str2+' group by '+str1; end;
DataModule23.cnjdcldazldjb_query_ADODataSet.active:= false;
DataModule23.cnjdcldazldjb_query_ADODataSet.active:= true; BitBtn10.Click; end
end; end;
(8)在Bitbt12的Click事件编写如下代码:
procedure Tcar_Date_Complex_Query.BitBtn12Click(Sender: Tobject);
var I :integer;
beginCar_Date_Report_Forms :=Tcar_Date_Report_Forms.Create(Application); with Car_Date_Report_Forms do
begin
if DataModule23.cnjdcldazldjb_query_ADODataSet.Eof =false then
begin QRDBText1.DataField:='';QRDBText2.DataField:='';QRDBText3.DataField :='';
QuickRep1.DataSet :=DataModule23.cnjdcldazldjb_query_ADODataSet;
for I :=0 to DBGrid1.Columns.Count – 1do
begin if DBGrid1.Columns[I].Title.Caption ='车辆编号' then
beginQRDBText1.Enabled :=true; QRDBText1.DataField :='Car_No'; end
else if DBGrid1.Columns[I].Title.Caption ='车辆种类' then
beginQRDBText4.Enabled :=true; QRDBText4.DataField :='Car_Kind';end
else if DBGrid1.Columns[I].Title.Caption ='厂牌' then
beginQRDBText5.Enabled :=true;QRDBText5.DataField :='Manufacturer_License_Plate'; end
else if DBGrid1.Columns[I].Title.Caption ='燃油种类' then
beginQRDBText9.Enabled :=true; QRDBText9.DataField :='Fuel_Style'; end
else if DBGrid1.Columns[I].Title.Caption ='发动机型号' then
begin QRDBText10.Enabled :=true; QRDBText10.DataField :='Engine_Style';end
elsebeginmessagedlg('没有查到数据,您不能打印!!!',mtError,[mbok],0);end;
end;end;
(9)在Bitbt8的Click事件编写如下代码(关闭程序):
procedure Tcar_Date_Complex_Query.BitBtn8Click(Sender: Tobject);
begin Close; end;
4 结束语
查询在数据库管理系统中是非常重要的功能,如何实现快速、高效、功能强大的查询,是编程人员必须认真考虑的重点。本文所述功能,基本能满足用户任意组合查询条件,得到查询结果。
参考文献:
[1]只飞.Delphi数据库开发指南[M].北京希望电子出版社,2003年3月第1版.
[2]陈豫龙.Delphi数据库系统开发实例导航[M].人民邮电出版社出版,2002年3月第1版.
本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
关键词: Delphi;复合查询
中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)04-10899-02
1 引言
在编写有关数据库管理系统时,设计单一的数据查询很容易,但要实现多功能的复合查询就需要费一点周折。本人在编写企业安全管理系统时实现了较为复杂的查询功能;在此拿出来与大家共同探讨。系统的前台环境为Delphi6.0,后台数据库单机版不做限制,网络版采用SQL Server2000,这里以Microsoft Access数据库为例做简单介绍。
2 设计思想
要实现错综复杂的复合查询,只要能够动态生成合法的SQL查询语句即可。换句话说,就是要动态的得到要显示的字段和查询的条件,然后再把取得的要显示的字段和待查询的条件组合成合法的SQL语句送往数据库执行查询。
3 实现方法
3.1 数据库
表字段名最好用英文,这是因为Delphi对中文字段名支持的不是很好。
3.2 本程序所用到的控件的属性(略)
3.3 编码
(1)在窗体Picture_Zoom的Public部分定义如下全局变量:
(2)在窗体Pictue_Zoom的FormShow事件中编写如下代码:
procedure Tcar_Date_Complex_Query.BitBtn7Click(Sender: Tobject);
beginwhile Listbox2.Items.Count>0 do
beginListbox2.Items.Delete(0); end;
bitbtn7.Enabled :=false;move :='true';query :='false';end;
(7)在Bitbt6的Click事件编写如下代码(负责组合SQL语句,最后执行查询命令):
procedure Tcar_Date_Complex_Query.BitBtn6Click(Sender: Tobject);
var str1,str2,str3 :string;var ldh :integer;
beginstr1 :=''; str2 :='';str3 :='';Exist_No_No :='false';
if (listbox2.Items.Count=0) and (listbox4.Items.Count<>0) then
beginquery :='true';end;
if (query ='true') and (listbox4.Items.Count<>0) then
begin for ldh :=0 to listbox4.Items.Count-1 do
begin Exist_No_No:='true'; end;
if (group_by ='true') and (Listbox4.items[ldh] ='number') then
begin exist_number :='true';end
elsebegin
if str1<>'' then
beginstr1 :=str1+','+Listbox4.items[ldh];end
elsebegin str1 :=Listbox4.items[ldh]; end;
for ldh :=0 to listbox2.Items.Count-1 do
begin Listbox2.items[ldh] :=Car_Date_CdataFieldToEDataField(Listbox2.items[ldh]);
if ldh=0 thenbeginstr2 :=' where '; end;
if ldh
else beginstr2:=str2+ChineseExpressionToEnglishExpression(Listbox2.items[ldh]); end; if (group_by ='false') or (exist_number ='false') then
beginstr :='select '+str1+' from '+tablename+str2;end
else begin
if (listbox4.Items.Count =1) and (listbox4.Items[0] ='number') then
begin str1 :='number'; str :='select '+str1+' from '+tablename+str2;end
if group_by ='true' then
begin str :='select '+str1+',count('+Car_Date_CdataFieldToEDataField(Listbox4.items[0])+') as 数量'+str3+' from '+tablename+str2+' group by '+str1; end;
DataModule23.cnjdcldazldjb_query_ADODataSet.active:= false;
DataModule23.cnjdcldazldjb_query_ADODataSet.active:= true; BitBtn10.Click; end
end; end;
(8)在Bitbt12的Click事件编写如下代码:
procedure Tcar_Date_Complex_Query.BitBtn12Click(Sender: Tobject);
var I :integer;
beginCar_Date_Report_Forms :=Tcar_Date_Report_Forms.Create(Application); with Car_Date_Report_Forms do
begin
if DataModule23.cnjdcldazldjb_query_ADODataSet.Eof =false then
begin QRDBText1.DataField:='';QRDBText2.DataField:='';QRDBText3.DataField :='';
QuickRep1.DataSet :=DataModule23.cnjdcldazldjb_query_ADODataSet;
for I :=0 to DBGrid1.Columns.Count – 1do
begin if DBGrid1.Columns[I].Title.Caption ='车辆编号' then
beginQRDBText1.Enabled :=true; QRDBText1.DataField :='Car_No'; end
else if DBGrid1.Columns[I].Title.Caption ='车辆种类' then
beginQRDBText4.Enabled :=true; QRDBText4.DataField :='Car_Kind';end
else if DBGrid1.Columns[I].Title.Caption ='厂牌' then
beginQRDBText5.Enabled :=true;QRDBText5.DataField :='Manufacturer_License_Plate'; end
else if DBGrid1.Columns[I].Title.Caption ='燃油种类' then
beginQRDBText9.Enabled :=true; QRDBText9.DataField :='Fuel_Style'; end
else if DBGrid1.Columns[I].Title.Caption ='发动机型号' then
begin QRDBText10.Enabled :=true; QRDBText10.DataField :='Engine_Style';end
elsebeginmessagedlg('没有查到数据,您不能打印!!!',mtError,[mbok],0);end;
end;end;
(9)在Bitbt8的Click事件编写如下代码(关闭程序):
procedure Tcar_Date_Complex_Query.BitBtn8Click(Sender: Tobject);
begin Close; end;
4 结束语
查询在数据库管理系统中是非常重要的功能,如何实现快速、高效、功能强大的查询,是编程人员必须认真考虑的重点。本文所述功能,基本能满足用户任意组合查询条件,得到查询结果。
参考文献:
[1]只飞.Delphi数据库开发指南[M].北京希望电子出版社,2003年3月第1版.
[2]陈豫龙.Delphi数据库系统开发实例导航[M].人民邮电出版社出版,2002年3月第1版.
本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。