Solved

Assistance needed with SQL Syntax

Posted on 2007-11-21
22
172 Views
Last Modified: 2010-04-05
Hi all,

I need some assistance with some code that I would like to expand on:

Here is the code:

if sModels.Text<>'ANY' then
    Begin
      ADOQuery1.SQL.Add(
        'Select * from motors where (Make) = '
        + Quotedstr(ComboBox1.text)
        + ' AND ((Model) LIKE "%'  
        + ComboBox2.text            //Fiesta
        + '%")'                     // %")
        );
     
    end;

I need to add

AND (Price) <= PriceComboBox.text

also PriceComboBox.text is a String ....Do I need to Add StrToInt for it to work???

Hope you can help

ST3VO
0
Comment
Question by:ST3VO
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 9
  • 6
  • 5
  • +1
22 Comments
 
LVL 13

Expert Comment

by:rfwoolf
ID: 20326780
Try this. And because you are inserting SQL as a string, you want to send it through as a string not an integer anyway.
if sModels.Text<>'ANY' then
    Begin
      ADOQuery1.SQL.Add(
        'Select * from motors where (Make) = '
        + Quotedstr(ComboBox1.text) 
        + ' AND ((Model) LIKE "%'  
        + ComboBox2.text            //Fiesta
        + '%")'                     // %")
        + ' AND ((Price) <= '
        + PriceComboBox.text
        + ')
        );
     
    end;

Open in new window

0
 

Author Comment

by:ST3VO
ID: 20326815
I'm getting a syntax error:

if sModels.Text<>'ANY' then
    Begin
      ADOQuery1.SQL.Add(
        'Select * from motors where (Make) = '
        + Quotedstr(ComboBox1.text)
        + ' AND ((Model) LIKE "%'  
        + ComboBox2.text            //Fiesta
        + '%")'                     // %")
        + ' AND ((Price) <= '
        + PriceComboBox.text
        + ') <-- HERE
        );
     
    end;

Undetermined String...
0
 
LVL 19

Expert Comment

by:Limbeck
ID: 20326838
add a ' after the )

but also test if the price is a valid price

f.i.

var iDummy:integer;
if sModels.Text<>'ANY'  then
try
  iDummy=StrToInt(PriceComboBox.text);
      ADOQuery1.SQL.Add(
        'Select * from motors where (Make) = '
        + Quotedstr(ComboBox1.text)
        + ' AND ((Model) LIKE "%'  
        + ComboBox2.text            //Fiesta
        + '%")'                     // %")
        + ' AND ((Price) <= '
        + PriceComboBox.text
        + ') '
        );
  //etc
except
  //errorhandling
end;
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:ST3VO
ID: 20326858
Hmmm...Query won't run...Sytax Error :o/
0
 
LVL 19

Expert Comment

by:Limbeck
ID: 20326868
what are the values for PriceComboBox.TEXT,ComboBox2.text  & ComboBox1.text ?
0
 

Author Comment

by:ST3VO
ID: 20326891
Here is the Exact error message:

Syntax error in query expression '(Make) = 'Ford' AND ((Model) LIKE "%Mondeo%")
Select * From motors where (Make)='Ford' AND ((Model) LIKE "%Mondeo%") AND ((Price) <=10000)'

Hope it helps!!!

0
 
LVL 13

Accepted Solution

by:
rfwoolf earned 250 total points
ID: 20326982
Hmm... do you know if your Price field is an integer or string or what... but it might not even matter ...

Also I suppose it wouldn't hurt to add a bracket around the first condition...


var iDummy:integer;
if sModels.Text<>'ANY'  then
try
  iDummy=StrToInt(PriceComboBox.text);
      ADOQuery1.SQL.Add(
        'Select * from motors where ((Make) = '
        + Quotedstr(ComboBox1.text) 
        + ') AND ((Model) LIKE "%'  
        + ComboBox2.text         
        + '%") AND ((Price) <= '
        + PriceComboBox.text
        + ')'
        );
  //etc
except
  //errorhandling
end;
 
 
////ALSO TRY:
 
 
var iDummy:integer;
if sModels.Text<>'ANY'  then
try
  iDummy=StrToInt(PriceComboBox.text);
      ADOQuery1.SQL.Add(
        'Select * from motors where ((Make) = '
        + Quotedstr(ComboBox1.text) 
        + ') AND ((Model) LIKE "%'  
        + ComboBox2.text         
        + '%") AND ((Price) <= "'
        + PriceComboBox.text
        + '")'
        );
  //etc
except
  //errorhandling
end;

Open in new window

0
 

Author Comment

by:ST3VO
ID: 20327010
The Query now works but the Price is not working properly!

I selected Price of 4000 and it's showing prices of 10000 etc  

Any ideas?

Thanks

ST3VO
0
 
LVL 19

Expert Comment

by:Limbeck
ID: 20327031
what type is the field price in the database? sounds like it is a string/varchar; not a int :)
0
 

Author Comment

by:ST3VO
ID: 20327050
Yes it's a string as it's reading from a CSV file
0
 
LVL 19

Expert Comment

by:MerijnB
ID: 20327058
why don't you use format() ? In generally it makes your code much better readable with such complex string 'generation'
if sModels.Text<>'ANY'  then
  ADOQuery1.SQL.Add(Format('select * from motors where Make = %s AND ((Model like "%%%s%%") and ((Price <= %s)',
                           [QuotedStr(ComboBox1.Text), ComboBox2.Text, PriceCombobox.Text]);

Open in new window

0
 
LVL 19

Expert Comment

by:Limbeck
ID: 20327077
not sure if this will work but try:

       + '%") AND (Val(Price) <= '

instead of        
      + '%") AND ((Price) <= '

0
 

Author Comment

by:ST3VO
ID: 20327125
MerijnB:

I get a Syntax error with your code see below:
Missing ),], or item in query expression 'Make = 'Ford' AND ((Model like "%Mondeo%") AND ((Price <= 4000)'

Limbeck:
Syntax  error too.

Sorry guys :o/

0
 
LVL 19

Assisted Solution

by:MerijnB
MerijnB earned 250 total points
ID: 20327132
oops...

can you check the typedef of the price table...?
if sModels.Text<>'ANY'  then
  ADOQuery1.SQL.Add(Format('select * from motors where Make = %s AND ((Model like "%%%s%%") and (Price <= %s))',
                           [QuotedStr(ComboBox1.Text), ComboBox2.Text, PriceCombobox.Text]);

Open in new window

0
 

Author Comment

by:ST3VO
ID: 20327148
Hmmm...

Type Mismatch error

0
 
LVL 19

Expert Comment

by:MerijnB
ID: 20327155
where do you get this error?
0
 

Author Comment

by:ST3VO
ID: 20327236
After running the Query
0
 
LVL 19

Expert Comment

by:MerijnB
ID: 20327264
so, this error comes from the DB, not from delphi?

Can you post the resulting query?
0
 
LVL 19

Expert Comment

by:Limbeck
ID: 20327403
might be the "" . try it like this:

var sLike:String;
sLike:='%'+ComboBox2.text+ '%'

     + ') AND ((Model) LIKE '  
        + Qutedstr(sLike)
0
 
LVL 19

Expert Comment

by:Limbeck
ID: 20327519
Quotedstr(sLike)
0
 

Author Comment

by:ST3VO
ID: 20327547
Here is the whole code:

Hope it helps!

Thanks again

ST3VO

procedure TForm1.Button12Click(Sender: TObject);
 var WhereClause: string;
    WhereClauseParts: TStringList;
    i: integer;
    Query: string;
begin
   
 
  ADOQuery1.active := false;
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
 
  /////////////////////////////////////////////////////////////
 
 
begin
 WhereClauseParts := TStringList.Create();
 
 // check make combobox
 if sco.Text <> 'ANY' then
  WhereClauseParts.Add(Format('(Make = %s)', [QuotedStr(sco.Text)]));
 
 // check model combobox
 if sModels.Text <> 'ANY' then
  WhereClauseParts.Add(Format('(Model like "%%%s%%")', [sModels.Text]));
 
 // check price combobox
 if sPrice.Text <> 'ANY' then
  WhereClauseParts.Add(Format('(Price <= %s)', [sPrice.Text]));
 
 // check postcode combobox
 if sPostCode.Text <> 'ANY' then
  WhereClauseParts.Add(Format('(Postcode like "%s%%")', [Copy(sPostCode.Text, 1, 3)]));
 
 // now combine all where clauses
 if WhereClauseParts.Count > 0 then
 begin
  WhereClause := ' where';
  for i := 0 to WhereClauseParts.Count - 1 do
  begin
   WhereClause := WhereClause + ' ' + WhereClauseParts[i];
 
   if i < WhereClauseParts.Count - 1 then
    WhereClause := WhereClause + ' AND';
  end;
 end;
 
 WhereClauseParts.Free();
 
 
 
 // now we have the where clause, make the rest of the query
 Query:=('select * from motors' + WhereClause);
end;
 
 
 
 
 
 ////////////////////////////////////////////////////////////////
 
   if not sCheckBox1.Checked then
   begin
  ADOQuery1.SQL.Add('UNION  ALL SELECT TOP 200 * from motors where Make <> "' + (sco.Text) + '"');
   end;
 
//  ADOQuery1.Active := true;
 //  ADOQuery1.Open;
 
   if ADOQuery1.EOF  then
  begin
    sMessageDlg('Sorry No Matches Found! Please try another search!', mtInformation, [mbOK], 0);
 
  Exit;
end;
 
 
 
 
end;

Open in new window

0
 
LVL 19

Expert Comment

by:MerijnB
ID: 20327570
I don't see where you use the contents of the string 'Query'?
0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
Hello everybody This Article will show you how to validate number with TEdit control, What's the TEdit control? TEdit is a standard Windows edit control on a form, it allows to user to write, read and copy/paste single line of text. Usua…
Finds all prime numbers in a range requested and places them in a public primes() array. I've demostrated a template size of 30 (2 * 3 * 5) but larger templates can be built such 210  (2 * 3 * 5 * 7) or 2310  (2 * 3 * 5 * 7 * 11). The larger templa…

738 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question