SQL-запросы к БД (Поиск)

midletarket
Дата: 16.05.2011 20:45:35
Доброго времени суток!
Пытаюсь реализовать поиск по БД в Delphi, только вот неправильный результат всё время выскакивает
var
  s1,s2,s3,s4,s5,s6,s7:string;
  str1,str2,str3,str4,str5,str6,str7:string;
begin
str1:='Город';
str2:='Улица';
str3:='Дом';
str4:='Этаж'; //в таблице Access определен, как численный тип
str5:='Количество комнат';//в таблице Access определен, как численный тип
str6:='Метраж (кв м)';//в таблице Access определен, как численный тип
str7:='Вид заявки (продажа, обмен)';
FDM.ADOQuery1.Active:=false;
FDM.ADOQuery1.SQL.Clear;
FDM.ADOQuery1.SQL.Add('Select * From Table1');
FDM.ADOQuery1.SQL.Add('where ((' + str1 + ' = ' + '"'+s1+'") AND ('+ str5+
      ' = ' + '"'+s5+'") AND ('+str7+' = ' + s7 +')) OR (' + str2 + ' = ' + '"'+s2+'") OR (' + str3 + 
' = ' + '"'+s3+'") OR (' + str4 + 
' = ' + '"'+s4+'") OR (' + str6 + ' = ' + '"'+s6+'")');
end;
Пишет, то неправильно введен запрос (пропущен оператор), то не выдаёт ответа, хотя он явно есть.
Помогите пожалуйста.
Anatoly Podgoretsky
Дата: 16.05.2011 20:54:09
Параметры, параметры
midletarket
Дата: 16.05.2011 21:03:46
Anatoly Podgoretsky
Параметры, параметры

Я с sql первый день столкунулся, не могли бы вы объяснить что означает ваша фраза?
-===DiMas===-
Дата: 16.05.2011 22:13:23
midletarket,

во первых не рекомендуется использовать русские символы в названиях полей, во-вторых попробуйту названия полей заключить в квадратные скобки [Город] =...

В общем попробуйте так:
    FDM.ADOQuery1.SQL.Clear;
    FDM.ADOQuery1.SQL.Add('SELECT * FROM Table1 ' +
                          'WHERE ((['+str1+']='''+s1+''') AND (['+str5+']='''+s5+''') AND (['+str7+']='''+s7+''')) '+
                          'OR (['+str2+']='''+s2+''') OR (['+str3+']='''+s3+''') OR (['+str4+']='''+s4+''') OR (['+str6+']='''+s6+''')');


а лучше выведите запрос через ShowMessage(FDM.ADOQuery1.SQL) чтобы найти ошибки
-===DiMas===-
Дата: 16.05.2011 22:16:37
хотя там некоторые числовые типы в базе, тогда так:
    FDM.ADOQuery1.SQL.Clear;
    FDM.ADOQuery1.SQL.Add('SELECT * FROM Table1 ' +
                          'WHERE ((['+str1+']='''+s1+''') AND (['+str5+']='+s5+') AND (['+str7+']='''+s7+''')) '+
                          'OR (['+str2+']='''+s2+''') OR (['+str3+']='''+s3+''') OR (['+str4+']='+s4+') OR (['+str6+']='+s6+')');
Dmitry Arefiev
Дата: 16.05.2011 22:22:07
Anatoly Podgoretsky
Параметры, параметры

Хор поддерживает !
midletarket
Дата: 16.05.2011 22:30:40
-===DiMas===-
хотя там некоторые числовые типы в базе, тогда так:
    FDM.ADOQuery1.SQL.Clear;
    FDM.ADOQuery1.SQL.Add('SELECT * FROM Table1 ' +
                          'WHERE ((['+str1+']='''+s1+''') AND (['+str5+']='+s5+') AND (['+str7+']='''+s7+''')) '+
                          'OR (['+str2+']='''+s2+''') OR (['+str3+']='''+s3+''') OR (['+str4+']='+s4+') OR (['+str6+']='+s6+')');

Пишет что лишняя скобка
автор
)
midletarket
Дата: 16.05.2011 22:33:02
midletarket,
Точнее когда я заполняю все поля - он выдаёт результат, а иначе - ругается
-===DiMas===-
Дата: 16.05.2011 22:40:46
midletarket,

Тогда пиши условия:

примерно так:
    ASql := 'SELECT * FROM Table1 WHERE 1=1 ';
    AWhere := '';
    if (Length(s1) > 0) and (Length(s5) > 0) and (Length(s7) > 0) then
        AWhere := AWhere + '((['+str1+']='''+s1+''') AND (['+str5+']='+s5+') AND (['+str7+']='''+s7+'''))';
    if Length(s2) > 0 then
    begin
        if Length(AWhere) > 0 then AWhere := AWhere + ' OR ';
        AWhere := AWhere + '(['+str2+']='''+s2+''')';
    end;
    if Length(s3) > 0 then
    begin
        if Length(AWhere) > 0 then AWhere := AWhere + ' OR ';
        AWhere := AWhere + '(['+str3+']='''+s3+''')';
    end;
    if Length(s4) > 0 then
    begin
        if Length(AWhere) > 0 then AWhere := AWhere + ' OR ';
        AWhere := AWhere + '(['+str4+']='''+s4+''')';
    end;
    if Length(s5) > 0 then
    begin
        if Length(AWhere) > 0 then AWhere := AWhere + ' OR ';
        AWhere := AWhere + '(['+str6+']='''+s6+''')';
    end;
    if Length(AWhere) > 0 then ASql := ASql + ' AND (' + AWhere + ')';
-===DiMas===-
Дата: 16.05.2011 22:42:43
-===DiMas===-,

хотя лучше ввести значения по умолчанию для s1..s7 и перед формированием запроса проверять если пусто - то использовать значение по умолчанию, допустим для числовых значений - 0