Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Поиск в dbmemo


Автор: Timurrr 22.5.2006, 20:58
У мя есть база в dbgride  указаны названия товара, а в dbmemo его свойства по-строчно, как мне найти енто свойство в dbmemo введенного в edit по всей базе и вывести в dbgrid найден товар. Подскажите плз 

Автор: vv3 22.5.2006, 23:10
Надо так понимать, что в DBMemo выводится BLOB, в котором написано что-то вроде: "мокрый, синий, старый", а в Edit ввели "синий" и нужно найти строки в базе данных, в блоюах которых есть это слово?
Если это так, то база совершенно неверно построена (см."нормализация"). Но и так можно, хотя в случае использования клиент-серверной архитектуры просто неверный подход.  Сервер помрет, пока отфетчит все записи да со всеми блобами. В случае локальных баз - фиг с ними. 
Решение приблизительно такое:
1. Открываем запрос, в котором выбираются все интересующие нас поля и BLOB
2. Перебираем все BLOB'ы построчно на предмет вхождения слова, введенного в Edit и собираем их первичные ключи в строку через запятую
3. Запускаем запрос, в параметре которого пропишем внаглую нашу строку в скобках в секции WHERE... IN()
И радуемся жизни...
Конкретнее:
Код

procedure TForm1.FindButtonClick(Sender: TObject);
var TempString: string; Counter: Integer;
begin
Query1.Open;
Query1.FetchAll;
Query1.First;
while not Query1.EOF do
  begin
    for Counter:= 0 to Query1.RecordCount - 1 do
     if Pos(Edit1.Text, DBMemo1.Lines[Counter]) <> 0 then
      if TempString <>'' then TempString:= TempString + ', ' +Query1.FieldByName('ID_KEY').AsString 
            else TempString:= Query1.FieldByName('ID_KEY').AsString;
   Query1.Next;
  end;
Query1.Close;
Query2.SQL.Clear;
Query2.SQL.Append('SELECT * FROM MY_TABLE WHERE MY_TABLE.ID_KEY IN (' + TempString + ')');
Query2.Open; // аж самому страшно стало...
end;
Понятно, что Query2 связан через TDataSource с TDBGrid.
 Разумеется, в DBMemo выводить в Query1 и не нужно, но StringList и LoadFromStream напишешь уже сам...

В общем, простора для фантазии хватает. Кстати, а что будет, если в Edit написано "метро"? Тогда в выборку попадут и "метро", и "метрополитен", и "метровый" и "диаметром семь миллиметров".... smile 
   

Автор: Vas 23.5.2006, 06:54
Цитата(Timurrr @  22.5.2006,  20:58 Найти цитируемый пост)
У мя есть база в dbgride  указаны названия товара, а в dbmemo его свойства по-строчно, как мне найти енто свойство в dbmemo введенного в edit по всей базе и вывести в dbgrid найден товар. Подскажите плз  

Код

Query2.SQL.Clear;
Query2.SQL.Add('SELECT * FROM Table WHERE Field LIKE :Param');
Query2.ParamByName('Param').AsString:='%'+Edit1.Text+'%';
try
Query2.Open; 
except
...
end;

LIKE позволяет искать кусок строки в текстовом поле, % - заменяет символы, как * при поиске файлов в Винде или TC. 

Автор: vv3 23.5.2006, 09:09
Точно, LIKE красивее и короче... Что-то я накрутил. Прошу мой пост (в части кода) считать отсутствующим... Невыспался. Но с поиском по блобу... ой-ей-ей 

Автор: Timurrr 23.5.2006, 15:48
а можно сделать енто без sql?  

Автор: Vas 24.5.2006, 07:31
Цитата(Timurrr @  23.5.2006,  15:48 Найти цитируемый пост)
а можно сделать енто без sql?   

А смысл?
 

Автор: Maiwend 25.5.2006, 07:37
Цитата(Vas @  24.5.2006,  07:31 Найти цитируемый пост)
А смысл? 


Потому как человек, не умеет с квери работать.
Надо учиться ;)

Может мне кто подскажет с моей проблемой
http://forum.vingrad.ru/index.php?showtopic=97532
А то учу квери и никто подсказать нехочет.
 

Автор: lexsedrex 25.5.2006, 08:43
вот как я ето делал, поиск с частичным совпадением, тянем параметр поиска с едита
adoQuery1.SQL.close;
adoQuery1.SQL.Clear;
adoQuery1.SQL.Text:='select параметр from таблица where параметр like '+QuotedStr('%'+edit13.Text+'%') ;
adoQuery1.open;  

Автор: Timurrr 26.5.2006, 18:04
я делаю, но не получается, у кого есть пример скиньте исходник плз... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)