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

Тема в разделе "Delphi - Базы данных", создана пользователем dzhserv, 26 июн 2007.

  1. dzhserv

    dzhserv Гость

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

    acorn PHP Developer
    Web Team

    Регистрация:
    29 авг 2004
    Сообщения:
    599
    Симпатии:
    3
    Locate (Lookup) юзай и кури мануал.
     
  3. LAW

    LAW Гость

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

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

    !Синтаксис с билдера :)
     
  4. SNike

    SNike Гость

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

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

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

    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. Лучше использовать такое
    Код (Text):
    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
     
  7. SNike

    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, а при использовании цикла будет большая задержка между каждой набранной буквы. Если нужно - могу дать пример
     
  8. LAW

    LAW Гость

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

    А SELECT LIKE вообще идеальный вариант. :)
     
Загрузка...

Поделиться этой страницей