Поиск по значению в Dbgrid

  • Автор темы dzhserv
  • Дата начала
D

dzhserv

Доброго времени суток!
Подскажите пожалуйста. Я выбрал данные из базы в DBGrid, как мне в поле найти нужное значение к
примеру по названию. (примерно как в 1С поиск по значению введенных букв в поле).
Заранее благодарю!
 
L

LAW

На сколько я помню этот самый Locate (Lookup) не использует индексы.
Если дорого время выполнения, то стоит использовать GotoKey()

Query1->IndexName="индекс по полю поиска";
Query1->SetKey();
Query1->FieldByName("поле поиска")->AsString="что ищем";
if (Query1->GotoKey())
// Нашли
else
// не нашли

Есть ещё GotoNearest() - поиск ближайшего.

!Синтаксис с билдера :)
 
S

SNike

GoToKey, GoToNearest, FindNearest, FindKey - производят поиск по полям входящим в состав текущего индекса
Locate, Lookup - если поле поиска входит в состав индекса, этот индекс используется для поиска
 
G

Guest

Попробуй так:
For i:=0 to Table1.RecordCount-1 do
begin
Table1.First;
Table1.Fields.Fields[гомер столбца].Text:='что ищем';
end;

если не получится поставь Table1.First перед циклом
 
S

SNike

<!--QuoteBegin-Дрон+29:06:2007, 16:08 -->
<span class="vbquote">(Дрон @ 29:06:2007, 16:08 )</span><!--QuoteEBegin-->For i:=0 to Table1.RecordCount-1 do
begin
Table1.First;
Table1.Fields.Fields[гомер столбца].Text:='что ищем';
end;
[snapback]70904" rel="nofollow" target="_blank[/snapback]​
[/quote]

Ага, хороший вариант.
Предположим, RecordCount = 10000
Значит 10000 раз будем возвращаться к первой записи :blink:

1. Нужно First поставить до цикла
2. После Table1.Fields.Fields[гомер столбца].Text:='что ищем' осуществлять переход на следующую запись, иначе будет 10000 раз сравнивать одну и ту же запись
3. Fields[гомер столбца].Text - не существует. Есть Fields[гомер столбца].AsString;
4. Вместо Fields[гомер столбца] лучше использовать FieldByName, иначе если изменим структуру БД и это поле станет не третьим а четвертым, то придется сами знаете что делать ;)
5. Если запись найдена - прервать цикл, например командой Break, иначе будет шерстить дальше
6. У Table нет ни First, ни RecordCount, нужно использовать Table.DataSource.DataSet
7. Лучше использовать такое
Код:
With Table.DataSource.DataSet do 
begin
First; // перейдем к первой записи
While not EOF do begin // пока не достигнут конец базы
if FieldByName(ИмяПоля) = ИскомоеЗначение 
then begin
ShowMessage('Ура, нашли !');	// выведем сообщение о том что нашли нужное
Break;		 // прервем цикл чтоб не гоняться по базе зря
end else Next;	  // а не нашли - так перейдем к следующей
end;
end;

8. А еще лучше - использовать выше упомянутые Locate (Lookup), или запрос SQL
 
S

SNike

<!--QuoteBegin-dzhserv+26:06:2007, 16:47 -->
<span class="vbquote">(dzhserv @ 26:06:2007, 16:47 )</span><!--QuoteEBegin-->примерно как в 1С поиск по значению введенных букв в поле
[snapback]70651" rel="nofollow" target="_blank[/snapback]​
[/quote]

Тут нужно использовать Locate, т.к. есть опции полного или частичного совпадения, с учетом регистра или без него. Или опять же запрос SQL c использованием LIKE, а при использовании цикла будет большая задержка между каждой набранной буквы. Если нужно - могу дать пример
 
L

LAW

GoToKey, GoToNearest, FindNearest, FindKey - производят поиск по полям входящим в состав текущего индекса
Locate, Lookup - если поле поиска входит в состав индекса, этот индекс используется для поиска

Я использую в своей работе для доступа к БД сторонние компоненты Advantage Database System. В них Locate, Lookup работает по скорости как Filter в Dataset, то есть не используя индексы. Если в других компонентах индексы задействованы, то я только рад.

А SELECT LIKE вообще идеальный вариант. :)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!