Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.02.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.011 c
6-38429
Андрей Д.
2002-12-20 15:25
2003.02.13
Получение писем


1-38347
Gennadiy
2003-02-03 18:43
2003.02.13
Проблема с циклом...


14-38457
pasha676
2003-01-30 13:37
2003.02.13
Два компа соединить по интернету


6-38430
evgeniy2
2002-12-19 12:56
2003.02.13
post


14-38530
sniknik
2003-01-28 23:46
2003.02.13
Не смог разбить диск! Это нормально? 8о(





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский