我做了一个程序,需要对数据库中的几张表进行综合查询,而且查询的条件有10个左右,我想任意的组合起来,这样的话,用Query控件实现。
比如有以下几个条件的输入框:
edit1/edit2.....edit8/combobox1....combobox3,共11个输入、选择框,请问,要是用Query来查询,那应该如何写SQL语句呢?
比如有以下几个条件的输入框:
edit1/edit2.....edit8/combobox1....combobox3,共11个输入、选择框,请问,要是用Query来查询,那应该如何写SQL语句呢?
TCombobox选择字段
TEdit输入数据
TCombobox选择 (And/Or)
再组合如:
有字段:F1,F2,F3,F4
cmbSearchType.add('字段1')....
TEdit1,....
cmbJoin1,....我写两句,其它以此类推
var
tmpField,tmpJoin1,tmpValue1,tmpJoin2,tmpValue2,tmpSQL: String;
case cmbSearchType.ItemIndex of
0:tmpField := 'F1';
1:tmpField := 'F2';
2:tmpField := 'F3';
end;tmpSQL := 'SELECT * FROM [TABLE] WEHRE ' + tmpField ' = ' + tmpValue1 + ' tmpJoin1' ...大概就是这样,稍加变通,可以写Like,日期,>=,<=等等查询,我这些代码写得粗,你看看应该明白意思
eidt1、edit2、edit3
我写的语句:
var
sq1:string; //定义一个字符型变量if CheckBox1.Checked=true then
begin
sq1:='select jbxx.zhh as 总户号,jbxx.hm as 户名,jbxx.dh as 段号,jbxx.dxh as 段序号,jbxx.dz as 地址,jhxx.jbh as 局编号 from jbxx,jhxx where jbxx.zhh=jhxx.zhh and jbxx.zhh='+edit1.Text;
end;
memo1.Text:=sq1;
with cfglDM.Query1 do
begin
Close;
SQL.Clear;
SQL.Add(sq1);
Open
end;可是在运行时就会报错:
标准表达式中数据类型不匹配我也没找出是哪里不对。
var
a1,sq1:string; sq1:='select jbxx.zhh as 总户号,jbxx.hm as 户名,jbxx.dh as 段号,jbxx.dxh as 段序号,jbxx.dz as 地址,jhxx.jbh as 局编号 from jbxx,jhxx where jbxx.zhh=jhxx.zhh ';
if CheckBox1.Checked=true then sq1:=sq1+'and jbxx.zhh=:a1';
memo1.Text:=sq1;
with cfglDM.Query1 do
begin
Close;
SQL.Clear;
SQL.Add(sq1);
ParamByName('a1').asstring:=edit1.Text;
Open
end;可是要是把另两个条件放进去,在运行时,只选择一个条件时就会出现错误,程序如下:
var
a1,a2,a3,sq1:string; sq1:='select jbxx.zhh as 总户号,jbxx.hm as 户名,jbxx.dh as 段号,jbxx.dxh as 段序号,jbxx.dz as 地址,jhxx.jbh as 局编号 from jbxx,jhxx where jbxx.zhh=jhxx.zhh ';
if CheckBox1.Checked=true then sq1:=sq1+'and jbxx.zhh=:a1';
if CheckBox2.Checked=true then sq1:=sq1+'and jbxx.dh=:a2';
if CheckBox3.Checked=true then sq1:=sq1+'and jbxx.hm=:a3';
memo1.Text:=sq1;
with cfglDM.Query1 do
begin
Close;
SQL.Clear;
SQL.Add(sq1);
ParamByName('a1').asstring:=edit1.Text;
ParamByName('a2').asstring:=edit2.Text;
ParamByName('a3').asstring:=edit3.Text;
Open
end;出现的错误是:
Query1:Parameter 'a2' not found
请教Query1的参数要怎么解决?
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from records ');
ADOQuery1.SQL.Add('where kehmc like ''%'+ trim(kehmc.Text) +'%''');
ADOQuery1.SQL.Add('and leib like ''%'+ trim(leib.Text) +'%''');
ADOQuery1.SQL.Add('and jinbr like ''%'+ trim(jinbr.Text) +'%''');
ADOQuery1.SQL.Add('and shenf like ''%'+ trim(shenf.Text) +'%''');
ADOQuery1.SQL.Add('and riq >'''+datetostr(DateStart.date)+'''and riq <'''+ datetostr(DateEnd.date)+'''' );
ADOQuery1.SQL.Add('order by ±ào? desc' ) ;
ADOQuery1.Open;====CSDN 小助手 V2.0 2005年10月16日发布====
CSDN小助手是一款脱离浏览器也可以访问Csdn论坛的软件
界面:http://blog.csdn.net/Qqwwee_Com/archive/2005/10/16/504620.aspx
下载:http://szlawbook.com/csdnv2/csdnv2.rar为神六喝彩,向所有科技工作者致敬!
拒绝日货。
AdoQuery1.SQL.Text:='Select * from Table Where 1=1'
if Edit1.text<>'' then
AdoQuery1.SQL.Add(' and 条件1='+#39+Edit1.text+#39);
if Edit2.text<>'' then
AdoQuery1.SQL.Add(' and 条件2='+#39+Edit2.text+#39);
if Edit3.text<>'' then
AdoQuery1.SQL.Add(' and 条件3='+#39+Edit3.text+#39);
if Edit1.text<>'' then
AdoQuery4.SQL.Add(' and 条件1='+#39+Edit4.text+#39);
.
.
.
if Edit11.text<>'' then
AdoQuery1.SQL.Add(' and 条件11='+#39+Edit11.text+#39);
AdoQuery1.Open;
//如果条件是数字刚不加“#39”。“#39”表示“'“。
if Edit1.Text<>'' then sqlstr:=sqlstr+' and field1='''+Edit1.Text+'''';
if Edit2.Text<>'' then sqlstr:=sqlstr+' and field2='''+Edit2.Text+'''';
if Edit3.Text<>'' then sqlstr:=sqlstr+' and field3='''+Edit3.Text+'''';
if Edit4.Text<>'' then sqlstr:=sqlstr+' and field4='''+Edit4.Text+'''';
if Edit5.Text<>'' then sqlstr:=sqlstr+' and field5='''+Edit5.Text+'''';
....
能不能把这几个引号和加号说明一下。
程序虽然运行成功,但我想了解一下。
begin
sql:='SELECT 客户编号, 客户名称, 编码, 品名, 单位, 厚, SUM(件数) AS 件数, SUM(数量) AS 数量, '
+' 单价, SUM(数量 * 单价) AS 金额 , COUNT(单号) AS 付单 ,是否打印'
+' FROM CCMD ' ;s:='';if CheckBox1.Checked then //这里是不是模糊查询
begin
strlik:=' like ' ;
strlike1:='''%';
strlike2:='%''';
end else begin
strlik:=' = ';
strlike1:='''';
strlike2:='''';
end;if trim(Edit1.Text)<>'' then
begin
s:= ' where 单号 ' +strlik+ strlike1 +Edit1.Text+strlike2;
end;
if trim(ComboBox2.Text)<>'' then
begin
if s<>'' then s:=S+' and ' else s:=' where ';
s:= S+ ' 单据类型 ' +strlik+ strlike1 +ComboBox2.Text+strlike2;
end; if trim(cxLookupComboBox1.Text)<>'' then
begin
if s<>'' then s:=S+' and ' else s:=' where ';
s:= S+ ' 客户编号 ' +strlik+ strlike1 +cxLookupComboBox1.Text+strlike2;
end; if trim(ComboBox1.Text)<>'' then
begin
if s<>'' then s:=S+' and ' else s:=' where ';
s:= S+ ' 销售部门 ' +strlik+ strlike1 +ComboBox1.Text+strlike2;
end;
if trim(ComboBox3.Text)<>'' then
begin
if s<>'' then s:=S+' and ' else s:=' where ';
s:= S+ ' 付款方式 ' +strlik+ strlike1 +ComboBox3.Text+strlike2;
end;
//======================================
if trim(ComboBox4.Text)<>'' then
begin
if s<>'' then s:=S+' and ' else s:=' where ';
s:= S+ ' 编码 ' +strlik+ strlike1 +ComboBox4.Text+strlike2;
end; if trim(ComboBox5.Text)<>'' then
begin
if s<>'' then s:=S+' and ' else s:=' where ';
s:= S+ ' 品名 ' +strlik+ strlike1 +ComboBox5.Text+strlike2;
end; if trim(Edit5.Text)<>'' then
begin
if s<>'' then s:=S+' and ' else s:=' where ';
s:= S+ ' 厚 = '+Edit5.Text;
end;
//----------------------------------------------------
if trim(Edit3.Text)<>'' then
begin
if s<>'' then s:=S+' and ' else s:=' where ';
s:= S+ ' 长 = '+Edit3.Text+' or 装箱长 = '+Edit3.Text;
end; if trim(Edit4.Text)<>'' then
begin
if s<>'' then s:=S+' and ' else s:=' where ';
s:= S+ ' 宽 = '+Edit4.Text+' or 装箱宽 = '+Edit4.Text;
end;
//---------------------------------------if CheckBox3.State = cbChecked then
begin
if s<>'' then s:=S+' and ' else s:=' where ';
S:=S+' 是否打印 = 1';
end
else
if CheckBox3.State = cbUnchecked then
begin
if s<>'' then s:=S+' and ' else s:=' where ';
S:=S+' 是否打印 = 0';
end;//=============================================== 这里是打开 DM.CDanHao.open 这里的
SQL:=SQL+S+' GROUP BY 客户编号, 编码, 品名, 单价, 客户名称, 厚, 单位 ,是否打印' );
我是这样写的~~~~~