Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2010, 15:41   #1
alexeybest
Пользователь
 
Регистрация: 13.02.2010
Сообщений: 17
По умолчанию Немного о поиске в ADO

Здравствуйте. Возник такой вопрос. Есть DBGrid, в нем таблица данных. Хочу использовать Locate для поиска данных. Основа на таком примере:
Код:
ffield := 'ID';
fvalue := '325423';
opts := [loCaseInsensitive];
if  AdoTable1.Locate(ffield, fvalue, opts) then
  ShowMessage(fvalue + ' found in ' + ffield);
Вопрос в том, как в качестве параметра fvalue взять не конкретное число или строку, а массив чисел, находящегося в Listbox. (Listbox.Items[i]). Немного не выходит. Буду признателен за помощь.
alexeybest вне форума Ответить с цитированием
Старый 13.02.2010, 15:52   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

погодите, в массиве находится НЕСКОЛЬКО чисел..
а Locate - найдёт ОДНО значение. Вам какое из массива надо найти?
Если первое - то так:
Код:
if  AdoTable1.Locate(ffield, Listbox.Items[0], [loCaseInsensitive]) then
  ShowMessage(Listbox.Items[0] + ' found in ' + ffield);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.02.2010, 16:03   #3
alexeybest
Пользователь
 
Регистрация: 13.02.2010
Сообщений: 17
По умолчанию

Интересное мнение, но мне нужно не одно, а чтоб значения массива в Listbox были задействованы.

Последний раз редактировалось mihali4; 14.02.2010 в 13:27.
alexeybest вне форума Ответить с цитированием
Старый 13.02.2010, 22:59   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Интересная мысль. А, если не секрет, что вы подразумеваете под словами "были задействованы"?
Отфильтровать те строчки в гриде, ID которых заданы в ListItems ?
тогда у Вас есть несколько вариантов (правда, варианта с использованием locate я Вам не могу предложить ):

плохой вариант:
- вешаетесь на событие OnFilterRecord
и в этом событии проверяете, ID переданной записи есть в ListBox - тогда возвращаете Accept := true
иначе - Accept := false;

хороший вариант: загоняете все необходимые значения в БД (во временную таблицу) и выбираете нужные записи через SQL...

средний вариант: добавляете в датасет поле и в цикле проставляете в это поле признак, отбирать данную запись или нет (1/0 или True/False или 'Y'/'N' ) потом в момент, когда нужно отфильтовать:
dataset1.Filter := ' НужноеПоле = 1 ';
dataset1.Filtered := true;

ещё есть вопросы?

Последний раз редактировалось mihali4; 14.02.2010 в 13:29.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.02.2010, 11:58   #5
alexeybest
Пользователь
 
Регистрация: 13.02.2010
Сообщений: 17
По умолчанию

Я в обработке события нажатия мыши написал
ADOQuery2.SQL.Add('Select * from Table');
ADOQuery2.SQL.Add('where N like ''%'+Listbox1.Items[i]+'%''');

Но выводит только последнее совпадение из Listboxa, не подскажешь чтобы и несколько записей мог вывести?

Прекращайте ненужное цитирование предыдущих сообщений!
Рекомендую. Помимо общих правил форума есть и дополнения к ним в каждом разделе...
А кроме кнопки "Цитата" есть просто окно для ввода своего сообщения.
Модератор

Последний раз редактировалось mihali4; 14.02.2010 в 13:28.
alexeybest вне форума Ответить с цитированием
Старый 14.02.2010, 15:52   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Но выводит только последнее совпадение из Listboxa, не подскажешь чтобы и несколько записей мог вывести?
ну, можно и так, можно и SQL динамически генерить.
лишь бы длины запроса хватило! Да и не очень эффективен он будет, с точки зрения производительности (т.к. OR чрезвычайно плохо оптимизируются СУБД при выполнении). Да и Like не самый лучший вариант в плане производительности..
Кстати, а почему LIKE, вроде бы речь в вашем первом сообщении шла об ID? тогда я бы предложил конструкцию: "... where ID in (значение1, значения2, ... значениеK)"

впрочем, хозяин — барин. извольте:
Код:
var s : string;
   i : integer;
begin
ADOQuery2.Close;
s := 'Select * from Table where ';
for i:=0 to Listbox1.Items.Count-1 do begin
  s := s + ' (N like ''%'+Listbox1.Items[i]+'%'') ';
  if i<>(Listbox1.Items.Count-1) then
    s := s + ' or ';
end;
ADOQuery2.SQL.Text := s;
ADOQuery2.Open;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.02.2010, 16:12   #7
alexeybest
Пользователь
 
Регистрация: 13.02.2010
Сообщений: 17
По умолчанию

Спасибо. Я нашел способ сделал немного по-другому... Твой способ тоже норм

Последний раз редактировалось mihali4; 14.02.2010 в 18:54.
alexeybest вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибки в поиске и сортировке Lexeres Помощь студентам 3 20.12.2009 11:46
Требуется помощь в поиске заказов. Orbita Фриланс 1 08.08.2009 20:06
Теоретический Вопрос о поиске diliana Помощь студентам 16 13.06.2009 03:19
Нужна помощь в поиске ошибки m9ss Общие вопросы Delphi 6 05.03.2009 13:14