![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск подстроки [D6, Paradox]
Dim!S © (2003-01-28 12:46:00)Уважаемые мастера!
Мне необходимо, что программа выполняла поиск заданной подстроки в строковом поле, причем подстрока может не начинаться с начала строки, а быть в ее середине (поиск должен осуществляться во всей таблице или выбранных записях). Также желательно осуществить поиск как в FindNearest..., т.е. постепенно приближаясь к нужной записи.
Заранее сапасибо.
MsGuns (2003-01-28 13:46:00) [1]Ребята здесь верно говорили, что структура БД не совсем оптимальна. Не стоило все содержимое документов (заявлений или чего-то там еще) вваливать в одно строковое поле. Но раз уж так получилось, то способов поиска несколько:
1. Фильтрация
Посмотри св-ва и события твоего любимого TTable, в частности, Filter, Filtered и особенно событие OnFilterRecord. В этом случае будут в гриде отображаться только записи, которые удовлетворяют заданным "секретаршей" условиям.
2 Поиск в цикле
Procedure Form1.ButtonSearchClick(Sender: TObject);
var
bm: TBookMark;
begin
bm := Table1.GetBookMark; // Запомнить текущую строку НД
Form1.Grid1.DataSource := nil; // Чтоб не мелькало
if not SearchFlag then // Искать с начала НД
Table1.First;
while not Table1.Eof do
if pos(SrcText,Table1.FieldByName("Text").AsString)>1 then
begin
Table1.FreeBookMark(bm); // Слить воду
Form1.Grid1.DataSource := DataSource; // Актив гриду
SearchFlag := true; // Успешный поиск. Для "Искать далее"
exit;
end
else
Next;
ShowMessage("Запись не найдена");
Table1.GoToBookMark(bm); // Вернуться в исх.запись НД
Table1.FreeBookMark(bm); // Слить воду
Form1.Grid1.DataSource := DataSource; // Актив гриду
end;
Оба способа - для TTable, хотя предпочтительнее все же заменить TTable на TQuery. Даже для парадокса.
Второй способ значительно медленнее, зато позволяет искать в любом месте строки и по любому алгоритму.
А вообще я бы все же пересмотрел топологию БД (структуры таблиц)
MsGuns (2003-01-28 13:46:00) [2]Ребята здесь верно говорили, что структура БД не совсем оптимальна. Не стоило все содержимое документов (заявлений или чего-то там еще) вваливать в одно строковое поле. Но раз уж так получилось, то способов поиска несколько:
1. Фильтрация
Посмотри св-ва и события твоего любимого TTable, в частности, Filter, Filtered и особенно событие OnFilterRecord. В этом случае будут в гриде отображаться только записи, которые удовлетворяют заданным "секретаршей" условиям.
2 Поиск в цикле
Procedure Form1.ButtonSearchClick(Sender: TObject);
var
bm: TBookMark;
begin
bm := Table1.GetBookMark; // Запомнить текущую строку НД
Form1.Grid1.DataSource := nil; // Чтоб не мелькало
if not SearchFlag then // Искать с начала НД
Table1.First;
while not Table1.Eof do
if pos(SrcText,Table1.FieldByName("Text").AsString)>1 then
begin
Table1.FreeBookMark(bm); // Слить воду
Form1.Grid1.DataSource := DataSource; // Актив гриду
SearchFlag := true; // Успешный поиск. Для "Искать далее"
exit;
end;
ShowMessage("Запись не найдена");
Table1.GoToBookMark(bm); // Вернуться в исх.запись НД
Table1.FreeBookMark(bm); // Слить воду
Form1.Grid1.DataSource := DataSource; // Актив гриду
end;
Оба способа - для TTable, хотя предпочтительнее все же заменить TTable на TQuery. Даже для парадокса.
Второй способ значительно медленнее, зато позволяет искать в любом месте строки и по любому алгоритму.
А вообще я бы все же пересмотрел топологию БД (структуры таблиц)
Dim!S (2003-01-28 13:22:00) [3]Что значит запрашивать все данные в таблицу?
Я работатую через TTable, а не через TQuery или я чего-то не понимаю
И что значит поставь фильтр на таблицу? Какой? На что?
Соловьев (2003-01-28 13:17:00) [4]Сорри... Это я со своей БД разбираюсь... :)
Locate не катит?
Dim!S (2003-01-28 13:15:00) [5]Что значит и дата и текст?
У меня в поле содержание хранится краткое содержание заявления.
А дата заявления в другом поле.
NickBat (2003-01-28 13:15:00) [6]Так и я о том же!
Зачем запрашивать все данные в таблицу если нужны только удовлетворяющие определенному условию? Вот и сделай select.
Если предубеждение против TQuery (что странно) - поставь фильтр на таблицу.
Секретарь вводит адрес, ей выводятся данные удовлетворяющие ее запросу, пусть 10 записей - она выбирает нужную.
И для пользователя так проще чем отвечать на вопрос: Ищем дальше?
Соловьев (2003-01-28 13:13:00) [7]Разберись со структорой БД, у тебя явно в одном поле хранится, то что не должно там вместе быть: и дата и текст.
Dim!S (2003-01-28 13:11:00) [8]Дополнение: в заявках (содержании) могут не указываться адреса и вообще они все на разные темы (работа такая :))
Dim!S (2003-01-28 13:09:00) [9]может я задачу неправильно поставил?
Суть в следующем:
Заносятся данные среди которых:
Название корреспондента и содержание заявки (что-то типа: договор аренды по адресу ул. Советская, 14) (поля содержание и корреспондент разные)
И в дальнейшем необходимо осуществлять поиск записей следующим образом: секретарь естественно не помнит среди сотен заявок содержание каждой - ей удобнее ввести адрес и чтобы программа нашла запись! И ВСЕ!
NickBat (2003-01-28 13:03:00) [10]Поставь
Table.Filter:="stroka like "%substr%"";
Не знаю только с Paradox это пройдет или нет.
Dim!S (2003-01-28 13:01:00) [11]> Anatoly Podgorodetsky
Что значит использовать Next в цмкле
Dim!S (2003-01-28 12:58:00) [12]А он ищет только с начала строки и заглавные буквы типа ОАО (ООО, ТОО и прочее) не берет :(
Anatoly Podgoretsky (2003-01-28 12:57:00) [13]Соловьев © (28.01.03 12:56)
Тем, что он не будет работать как запрошено, нужно использовать Next в цикле
Соловьев (2003-01-28 12:56:00) [14]А чем FindNearest неустраивает?
Dim!S (2003-01-28 12:52:00) [15]Спасибо, но дело в том, что у меня все через TTable
NickBat (2003-01-28 12:51:00) [16]Задав в запросе
where stroka like "%substr%"
можно ограничить таблицу только нужными Вам записями, их будет, думаю, не много и FindNext будет не нужен.
Или поставить на таблицу фильтр.