Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.08;
Скачать: CL | DM;

Вниз

Динамический запрос   Найти похожие ветки 

 
Bolek ©   (2005-11-03 14:07) [0]

Доброго вренмени суток.
формирую динамический запрос следующим образом
procedure TForm1.Edit1Change(Sender: TObject);
begin
if Edit1.Text = "" then
  begin
    IBQuery1.Close;
    IBQuery1.SQL.Clear;
    IBQuery1.SQL.Add("select * from DVD_DISK");
    IBQuery1.Open;
  end
else
   begin
     IBQuery1.Close;
     IBQuery1.SQL.Clear;
     IBQuery1.SQL.Add("select * from DVD_DISK ");
     IBQuery1.SQL.Add("where name LIKE "+Edit1.Text);
     IBQuery1.Open;
   end;
end;
а оно мне в ответ:
Project Project1.exe raised exception class EIBInterBaseError with message "Dynamic SQL Error
SQL error code = -206
Column unknown
d
At line 2, column 12". Process stopped. Use Step or Run to continue.
уже по всякому пробывал и даже книжку читал. везде облом
хелп плз


 
msguns ©   (2005-11-03 14:11) [1]

IBQuery1.SQL.Add("where name LIKE "+QuotedStr(Edit1.Text));


 
Val ©   (2005-11-03 14:24) [2]

>Bolek ©   (03.11.05 14:07)
заметьте, вы используете одинаковые строки кода в обеих, исключающих друг-друга, ветках - не наводит на мысли?


 
Sergey13 ©   (2005-11-03 14:25) [3]

Лучше переделать запрос на статический c 2 параметрами.
select * from DVD_DISK
where (:flag=0) or (:flag=1 and name LIKE :name)


 
Bolek ©   (2005-11-03 14:27) [4]


> заметьте, вы используете одинаковые строки кода в обеих,
>  исключающих друг-друга, ветках - не наводит на мысли?

т.е.?


 
Val ©   (2005-11-03 14:31) [5]

т.е. они выполняются всегда. зачем они в ветках?


 
Bolek ©   (2005-11-03 14:33) [6]

подразумевалось, что если в Edit будет пусто, то пусть все записи возьмёт; а если не пусто, то выбор по вхождению текста из Edit


 
Bolek ©   (2005-11-03 14:35) [7]


> msguns ©   (03.11.05 14:11) [1]
> IBQuery1.SQL.Add("where name LIKE "+QuotedStr(Edit1.Text));
>

хех.. не помогло - пишу в Edit буквицы, а в гриде вобще тогда ничего не становится. как только пусто - все записи


 
Val ©   (2005-11-03 14:40) [8]

>[6] Bolek ©   (03.11.05 14:33)
нам-то это понятно.что непонятно вам?
>[7] Bolek ©   (03.11.05 14:35)
запрос отрабатывает верно, видим не тот результат, который ожидаем, потому как проценты, подчеркивания не ставим.


 
Bolek ©   (2005-11-03 14:42) [9]


> Val ©   (03.11.05 14:40) [8]

пробывал. даже для чистоты эксперимента пробывал статический запрос делать. и нифига.


 
Val ©   (2005-11-03 14:49) [10]

тогда чувствительность к регистру символов.приводите к upper or lower обе части выражения.


 
Bolek ©   (2005-11-03 14:51) [11]

примечательно, что я в Едит писал именно ту буквицу, которая точно есть в поле


 
msguns ©   (2005-11-03 16:27) [12]

1. Поставить Breakpoint перед Open
2. Скопировать запрос из TIBQuery.SQL в IBConsole/IBExpert и выполнить.
3. Посмотреть на результат, потаскать себя за уши и сказать "Ах, какой же я..."


 
Desdechado ©   (2005-11-03 16:38) [13]

LIKE ... имеет свой формат обращения к данным
что из него присутствует в Edit.Text ?


 
Bolek ©   (2005-11-07 10:55) [14]

доброго времени суток всем
всем кто принимал участие спасибо
откопал я решение:
IBQuery1.SQL.Add("where name LIKE "+chr(39)+"%"+Edit1.Text+"%"+chr(39));


 
Плохиш ©   (2005-11-07 11:08) [15]


> Bolek ©   (07.11.05 10:55) [14]
> откопал я решение:
> IBQuery1.SQL.Add("where name LIKE "+chr(39)+"%"+Edit1.Text+"%"+chr(39));

А теперь введи в Edit1 строку с апострофами.


 
Deniz ©   (2005-11-07 11:42) [16]

...
    IBQuery1.Close;
    IBQuery1.SQL.Clear;
    IBQuery1.SQL.Add("select * from DVD_DISK ");
    IBQuery1.SQL.Add("where name LIKE :txt");
    IBQuery1.Prepare;
    IBQuery1.Params[0].AsString:="%" + Edit1.Text + "%";
    IBQuery1.Open;
И все.


 
Bolek ©   (2005-11-14 16:05) [17]

спасибо, Денис. твоё решение подошло больше.
куда из аськи пропал?

ЗЫ. закройте, плз, обсуждение


 
Sergey13 ©   (2005-11-14 16:14) [18]

2[17] Bolek ©   (14.11.05 16:05)
Только индекс работать не будет при этом и находить будет не только с начала строки.


 
Bolek ©   (2005-11-14 16:30) [19]


> Sergey13 ©   (14.11.05 16:14) [18]
> 2[17] Bolek ©   (14.11.05 16:05)
> Только индекс работать не будет при этом и находить будет

т.е.?
> не только с начала строки.
как раз и нужно чтобы искало по вхождению


 
Sergey13 ©   (2005-11-14 16:39) [20]

2 [19] Bolek ©   (14.11.05 16:30)
> т.е.?
Это и есть. Не будет индекс использоваться при LIKE "%Бла-Бла%". При "Бла-Бла%" будет, а так - нет.


 
Sergey13 ©   (2005-11-14 16:40) [21]

Плюс - поиск у тебя регистрозависимый получился.


 
Bolek ©   (2005-11-14 16:50) [22]


> Sergey13 ©   (14.11.05 16:40) [21]
> Плюс - поиск у тебя регистрозависимый получился.

к сожалению, да.


 
Deniz ©   (2005-11-15 06:54) [23]

> Sergey13 ©   (14.11.05 16:40) [21]
>
> Плюс - поиск у тебя регистрозависимый получился.


Так ведь и в условии задачи ничего сказано не было про регистр. А ведь поправить регистр не так сложно:

   ...
   IBQuery1.SQL.Add("where upper(name) LIKE :txt");
   IBQuery1.Prepare;
   IBQuery1.Params[0].AsString:="%" + AnsiUpperCase(Edit1.Text) + "%";
   ...


 
Id   (2005-11-15 08:28) [24]

>Bolek ©   (03.11.05 14:07)  
>     IBQuery1.SQL.Add("where name LIKE "+Edit1.Text);
Может быть
IBQuery1.SQL.Add("where name = """+Edit1.Text+"""");
легче?


 
Sergey13 ©   (2005-11-15 09:14) [25]

2[23] Deniz ©   (15.11.05 06:54)
> А ведь поправить регистр не так сложно:
А я и не утверждал обратного. 8-)


 
Bolek ©   (2005-11-15 11:20) [26]


> Может быть
> IBQuery1.SQL.Add("where name = """+Edit1.Text+"""");
> легче?

так уже пробывал - ругалось на несуществующую колонку



Страницы: 1 вся ветка

Текущий архив: 2006.01.08;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.019 c
4-1130775758
sd_simf
2005-10-31 19:22
2006.01.08
"Остановить" приложение


2-1134835627
dude
2005-12-17 19:07
2006.01.08
we56er это имя?


2-1135094351
reva
2005-12-20 18:59
2006.01.08
Как программно убить пераметр и его значение в реестре?


2-1134747503
Cruger
2005-12-16 18:38
2006.01.08
Программа тестирования


2-1135084675
Bart27
2005-12-20 16:17
2006.01.08
Как такое осуществить?