Форум: "Базы";
Текущий архив: 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