Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск по вхождению 
:(
    Опции темы
NiJazz
  Дата 24.1.2005, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: нет
Всего: 23



Как можно с помощью методов TTable найти нужную запись по вхождению подстроки?
Например, %инвест% -> Инвестиция, инвестиционный, проминвестхолдинг и т.д.
Мождно такое сделать, не прибегая к запросам типа select * from Table where field like "%инвест%"?
PS Locate и Lookup ищут по первым символам smile

PM MAIL   Вверх
NiJazz
Дата 24.1.2005, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: нет
Всего: 23



Забыл сказать, что поиск должен вестись без учёта регистра.
Кстати, такое возможно в моём SQL запросе?
PM MAIL   Вверх
z-END
Дата 24.1.2005, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 1
Всего: 102



насчет SQL сказать ниче не могу, а вот про Table:
Table1.onFilterRecord:
Код

//seek - строка которая по которой выполняется фильтрация
procedure Table1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
Accept:= Pos ( AnsiUpperCase (seek), AnsiUpperCase (Table1.Field[xxx].AsString )) > 0;
end;

Добавлено @ 18:40
ЗЫ если тебе нужен поиск по маске то тогда надобно вместо Pos использовать MatchesMask из модуля Masks


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
Alex
Дата 25.1.2005, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 17
Всего: 162



NiJazz Какая база данных?


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Bes
Дата 25.1.2005, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 2
Всего: 7



2NiJazz:
Такое можно сделать с помощью свойства Filter
На счет скул-запроса, я всегда считал, что можно. По умолчанию если база не чувствительна к регистру, то он будет работать как ты написал, если база чувствительна на регистр то нужно воспользоваться строковыми функциями Ucase, Upper,... зависит от базы.
Как раз мы тут спорим на этот счет с dSergey-ем - не знаю, к чему придем...
PM MAIL   Вверх
Alex
Дата 25.1.2005, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 17
Всего: 162



Цитата(Bes @ 25.1.2005, 07:17)
Как раз мы тут спорим на этот счет с dSergey-ем - не знаю, к чему придем...

Для начала нужно узнать о какой базе данных идет речь, а потом спорить.


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Bes
Дата 25.1.2005, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 2
Всего: 7



2Alex: А мы уже узнали :-) речь не об этой теме, а о предыдущей, где ты оставил два поста подряд.
PM MAIL   Вверх
NiJazz
Дата 25.1.2005, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: нет
Всего: 23



БД типа Paradox. Filter не подходит, мне не нужна фильтрация. Интересно одно, можно ли сделать активной ту запись, которая соответствует параметрам поиска.
PM MAIL   Вверх
Bes
Дата 25.1.2005, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 2
Всего: 7



2NiJazz:
Ааа... тогда стмори тему "Поиск по таблице, но не фильтр" я там то же самое спрашивал.
PM MAIL   Вверх
NiJazz
Дата 25.1.2005, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: нет
Всего: 23



Bes
Locate всё равно позволяет искать только по первым символам.
PM MAIL   Вверх
Bes
Дата 25.1.2005, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 2
Всего: 7



2NiJazz: Там был вариант и не только по первым, читай внимательно, там в середине Innok предложил. его 2-й пост.
PM MAIL   Вверх
Akella
Дата 26.1.2005, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Нужно использовать пробежку по всем записям с использованием POS

Код

Процедура поиска по всем полям

Procedure FindRec(What,Mes:String;DS:TDataSet;sFields:array of String;
                            foFromBegin,foCaseSansitive,ShowMes:Boolean);
{
What            - строка для поиска (editFind.Text)
DS              - таблица (TTable,TQuery и т.д.)
Fields          - список полей, по которым нужно вести поиск (['Field1','Field3','Field7'])
foFromBegin     - поиск от начала таблицы (true - от начала или False от текущей записи)
foCaseSansitive - поиск с зависимостью от регистра символов (true - зависит от регистра или False не зависит от регистра)
}
  Function FieldInFields(_Field:String;_Fields:array of String):Boolean;//
  Var
   x:byte;
  begin//содержиться ли текущее поле в масива полей, предназначенных для поиска
    Result:=False;
    For x:=Low(_Fields) to High(_Fields) do
      if _Field = _Fields[x] then begin
        result:=true;
        exit;
      end;//if
  end;//func

Var
i,q,f,w:integer;
begin
ds.DisableControls;//для ускорения отключаем таблицу
w:=ds.RecNo;
try
  //если поиск сначала таблицы
    if foFromBegin then q:=0 else q:=ds.RecNo;
  //идем по всем записям
    For i:=q to ds.RecordCount-1 do begin
  //пробег по всем полям
      For f:=0 to ds.FieldCount-1 do begin
  //если текущее поле содержится в массиве полей, предназначенных для поиска
        if FieldInFields(ds.Fields[f].FieldName,sFields) then begin
  //проверка на регистр
          if (foCaseSansitive = True) AND (POS(What,ds.Fields[f].AsString)<>0) then exit;
          if (foCaseSansitive = False) AND (POS(AnsiUpperCase(What),AnsiUpperCase(ds.Fields[f].AsString))<>0) then exit;
        end;//if FieldInFields(ds.Fields[f].FieldName,sField) then begin
      end;//For f:=0 to ds.FieldCount-1 do begin
      ds.Next;
    end;//For i:=q to ds.RecordCount-1 do begin
    ds.RecNo:=w;
    if ShowMes then ShowMessage(mes);
finally
  ds.EnableControls;//даже если произойдет исключение, то таблицу надо включить
end;//try-finally
end;//proc


Пример использования

FindRec(edFindText.Text,'',dm.tSpis,['Dirname','Type','PathName','Prim'],False,cbRegister.Checked,False);

PM MAIL   Вверх
Bes
Дата 27.1.2005, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 2
Всего: 7



2dsergey:
А если записей 800000 записей
PM MAIL   Вверх
Akella
Дата 5.2.2005, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(Bes @ 27.1.2005, 07:53)
2dsergey:
А если записей 800000 записей

Ничего с этим не поделаешь.

Реальный пример. БД Paradox (телефонный справочник г.Харькова) около 650 тысяч записей.
Так вот. TTable работает быстрее TQuery. TQuery только таблицу открывает 16 минут.
Комп: Cel 1700,256Мб, винт WD 40Гб UDMA5, WinXP SP1.

Так что тебе решать, что использовать TTable или TQuery.
Добавлено @ 11:02
И фильтрацию c TTable можно проводить средствами языка высокого уровня, т.е. средствами Delphi, а не SQL.
Ничего против SQL я не имею.

А БД в 800 тысяч записей желательно перевести во IB
PM MAIL   Вверх
Bes
Дата 7.2.2005, 07:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 2
Всего: 7



2dsergey: Странно, всегда думал что Квери в отличии от тэйбла как раз не открывает таблицу полностью, а возвращает только небольшое к-во записей в зависимости от запроса. Надо бы какую-нить тему по теории создать..
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1322 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.