Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.13;
Скачать: CL | DM;

Вниз

Поиск подстроки   Найти похожие ветки 

 
Dim!S   (2003-01-28 12:46) [0]

Уважаемые мастера!
Мне необходимо, что программа выполняла поиск заданной подстроки в строковом поле, причем подстрока может не начинаться с начала строки, а быть в ее середине (поиск должен осуществляться во всей таблице или выбранных записях). Также желательно осуществить поиск как в FindNearest..., т.е. постепенно приближаясь к нужной записи.
Заранее сапасибо.


 
NickBat ©   (2003-01-28 12:51) [1]

Задав в запросе
where stroka like "%substr%"
можно ограничить таблицу только нужными Вам записями, их будет, думаю, не много и FindNext будет не нужен.

Или поставить на таблицу фильтр.


 
Dim!S   (2003-01-28 12:52) [2]

Спасибо, но дело в том, что у меня все через TTable


 
Соловьев ©   (2003-01-28 12:56) [3]

А чем FindNearest неустраивает?


 
Anatoly Podgoretsky ©   (2003-01-28 12:57) [4]

Соловьев © (28.01.03 12:56)
Тем, что он не будет работать как запрошено, нужно использовать Next в цикле


 
Dim!S   (2003-01-28 12:58) [5]

А он ищет только с начала строки и заглавные буквы типа ОАО (ООО, ТОО и прочее) не берет :(


 
Dim!S   (2003-01-28 13:01) [6]

> Anatoly Podgorodetsky
Что значит использовать Next в цмкле


 
NickBat ©   (2003-01-28 13:03) [7]

Поставь
Table.Filter:="stroka like "%substr%"";
Не знаю только с Paradox это пройдет или нет.


 
Dim!S   (2003-01-28 13:09) [8]

может я задачу неправильно поставил?
Суть в следующем:
Заносятся данные среди которых:
Название корреспондента и содержание заявки (что-то типа: договор аренды по адресу ул. Советская, 14) (поля содержание и корреспондент разные)
И в дальнейшем необходимо осуществлять поиск записей следующим образом: секретарь естественно не помнит среди сотен заявок содержание каждой - ей удобнее ввести адрес и чтобы программа нашла запись! И ВСЕ!


 
Dim!S   (2003-01-28 13:11) [9]

Дополнение: в заявках (содержании) могут не указываться адреса и вообще они все на разные темы (работа такая :))


 
Соловьев ©   (2003-01-28 13:13) [10]

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


 
Dim!S   (2003-01-28 13:15) [11]

Что значит и дата и текст?
У меня в поле содержание хранится краткое содержание заявления.
А дата заявления в другом поле.


 
NickBat ©   (2003-01-28 13:15) [12]

Так и я о том же!
Зачем запрашивать все данные в таблицу если нужны только удовлетворяющие определенному условию? Вот и сделай select.
Если предубеждение против TQuery (что странно) - поставь фильтр на таблицу.
Секретарь вводит адрес, ей выводятся данные удовлетворяющие ее запросу, пусть 10 записей - она выбирает нужную.
И для пользователя так проще чем отвечать на вопрос: Ищем дальше?


 
Соловьев ©   (2003-01-28 13:17) [13]

Сорри... Это я со своей БД разбираюсь... :)
Locate не катит?


 
Dim!S   (2003-01-28 13:22) [14]

Что значит запрашивать все данные в таблицу?
Я работатую через TTable, а не через TQuery или я чего-то не понимаю
И что значит поставь фильтр на таблицу? Какой? На что?


 
MsGuns ©   (2003-01-28 13:46) [15]

Ребята здесь верно говорили, что структура БД не совсем оптимальна. Не стоило все содержимое документов (заявлений или чего-то там еще) вваливать в одно строковое поле. Но раз уж так получилось, то способов поиска несколько:

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) [16]

Ребята здесь верно говорили, что структура БД не совсем оптимальна. Не стоило все содержимое документов (заявлений или чего-то там еще) вваливать в одно строковое поле. Но раз уж так получилось, то способов поиска несколько:

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. Даже для парадокса.

Второй способ значительно медленнее, зато позволяет искать в любом месте строки и по любому алгоритму.
А вообще я бы все же пересмотрел топологию БД (структуры таблиц)



Страницы: 1 вся ветка

Текущий архив: 2003.02.13;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
1-38335
___ALex___
2003-02-02 16:44
2003.02.13
Vertival Scroll Bar


14-38445
Труп Васи Доброго
2003-01-30 15:07
2003.02.13
Помогите найти книгу


1-38261
Brain
2003-02-03 12:06
2003.02.13
Tab Stop


1-38189
Andrey-k
2003-02-02 22:45
2003.02.13
Help. Exel. Как сделать WorkBook в Read-Only или запаролить?


9-37996
Lamer86
2002-09-07 14:45
2003.02.13
Документация к GLScene на русском