![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Фильтр по индексным полям [D7, dBase, FoxPro]
molodoi © (2006-06-13 23:06:00)Есть проблема: из таблицы dBase, проиндексированной по нескольким полям (NAME, FNAME, SNAME) нужно выбирать записи по этим полям.
Пока остановился на простой фильтрации, и индекс вобщем-то не при деле. а т.к. кол-во записей переваливает за 500 000, фильтрация не решает проблемы (слишком долго). Помогите советом.
Использование запросов не желательно, хотя если выхода не найдется придется пользоваться ими.
molodoi (2006-06-21 16:21:00) [1]В смысле не поддерживает кириллицу? Регистр я тоже соблюдал.
Виталий Панасенко (2006-06-21 13:01:00) [2]Похоже, у тебя в таблице кодировка(язык) не поддерживает кириллицу. да, и при указании параметров для SetRange нужно регистр соблюдать
Если у тебя "Петров николай васильевич" , то фиг мы найдем "Петров Николай Васильевич" (правда, еще моежт быть загвозда в параметрах индксе(регистр игнорировать или нет).
molodoi (2006-06-21 12:23:00) [3]Ладно. Похоже дело безнадежное.
Пробовал сегодня создавать запросы. Все работает как надо(индексирование, фильтрация), правда медленно.
Была проблема с кодировкой. Запрос тут не обвинишь - он работает правильно, только вот не понимает имеющуюся кодировку таблицы (она, кстати, "dBase RUS 866"). Пришлось менять ее в Database Desktop на "dBase RUS 866" (нда!) и все нормально заработало: все находит. Один раз, ну два еще можно так менять кодировку, но по 2 раза в день я считаю перебором.
Подскажите как это провернуть программно (смена кодировки таблицы).
sniknik (2006-06-21 08:49:00) [4]> Суть одинаковая.
суть не сути, а в том, что понять тебя невозможно.
> Пробовал я и SetRange([Edit1.Text...],[Edit1.Text]); тоже самое.
ну, значит не судьба...
molodoi (2006-06-21 07:48:00) [5]Суть одинаковая. Просто при таком способе насильно указываются поля (да и для наглядности). Пробовал я и SetRange([Edit1.Text...],[Edit1.Text]); тоже самое.
sniknik (2006-06-20 19:41:00) [6]> ривожу отрывок из программы
> ...
> SetRangeStart;
> ...
вообщето имел в виду, да и говориили после вроде бы о методе setrange... а не самостоятельной "сборке". оно вроде бы тоже самое, но понять знаеш ли трудновато, ты про одно, тебе ответ про другое, хотя вид делают как будто бы про тоже самое.
> Может я индекс как-то не правильно строю?
> Table1.AddIndex('Nameidx',[NAME;FNAME;SNAME],[]);
вполне возможно, может оно так "не понимает", может надо три отдельных, и все их разом указывать (IndexFieldNames)... (?) это проверять надо... а кому охота в уже заброшеных технологиях копаться, без смысла. кому надо, тот и проверяет пускай.
molodoi (2006-06-20 16:18:00) [7]ривожу отрывок из программы
with Table1 do
begin
IndexName := "Nameidx";
SetRangeStart;
FieldByName('NAME').AsString := 'Петров';
FieldByName('FNAME').AsString := 'Николай';
FieldByName('SNAME').AsString := 'Васильевич';
SetRangeEnd;
FieldByName('NAME').AsString := 'Петров';
FieldByName('FNAME').AsString := 'Николай';
FieldByName('SNAME').AsString := 'Васильевич';
ApplyRange;
end;
Находит Петрова Анатолия Александровича (Алексеевича) и кучу других Петровых среди которых конечно есть Николай Васильевич, но ...
Может я индекс как-то не правильно строю?
Table1.AddIndex('Nameidx',[NAME;FNAME;SNAME],[]);
А?
sniknik (2006-06-20 13:11:00) [8]> Приведу пример:
это не пример, это художественный вымысел по мотивам какихто (вконец запутанных "прмером") действий...
во первых
> Нужен Петров Николай Васильевич.
если нужет только он - locate, использует индексы если они есть.
> Берет он первое поле в индексе (здесь это фамилия).
ну если берет онто у него и спрашивай почему он их неправильно берет... но мне почемуто кажется что это делаеш ты.
> 2.Берет второе поле (имя).
а вот это уже зачем? задавать, по идее, надо все сразу, потому и передается в функцию массив а не одиночное значение.
> Хорошо. В тексте программы указываем ...
в каком таком тексте???? мы же тут просто треплемся, без всяких текстов.
Sergey13 (2006-06-20 12:56:00) [9]> [9] molodoi © (20.06.06 12:52)
У тебя еще не пропало желание заниматься нестандартным сексом вместо того, что бы построить индекс и написать запрос?
molodoi (2006-06-20 12:52:00) [10]Приведу пример:
Нужен Петров Николай Васильевич. Строим индекс по трем полям.
Начинаем искать SetRange.
1.Фильтр по фамилии.Берет он первое поле в индексе (здесь это фамилия).
Ищет. Находит.
2.Берет второе поле (имя). Иперестраивает поиск. Т.е. в поле фамилии применяет фильтр по имени и получаем, что в поле фамилии ищется Николай. Хотя он должен искаться в поле имени.
Хорошо. В тексте программы указываем, что надо искать в поле имени, когда ищем это имя. И здесь начинается ерунда типа того, что описано выше. А ошибки нет.
Как организовать фильтр по отфильтрованному? Так будет точнее. но с использованием индексов.
sniknik (2006-06-19 18:39:00) [11]> Нет. массив значений в таком случае как раз и непередается. В этом и вся загвоздка.
уверяю тебя, "загвоздка" не в этом. не буду говорить в чем... оскомину уже набило от повторений, да и обижаются они, причины эти...
что значит "непередается"? передаеш ты, значит береш и передаеш.
или ошибку выдает? прочитай ее, наверняка ы ней будет причина написана... причет одна из двух скорее всего - ошибка синтаксиса или "склероз", забыл о том, что стороится "ренж" по индексу (написано выше)... и индекс ставится на одно поле, а ограничить попытка на 2 и более.
> Кстати, кто-нибудь знает аналог запроса CREATE VIEW в Делфях.
нет такого, и близко нет. VIEW это в sql сервере, базе/движке есть, но никак не в дельфи.
Sergey13 (2006-06-19 18:25:00) [12]2 [6] molodoi © (19.06.06 18:17)
> Кстати, кто-нибудь знает аналог запроса CREATE VIEW в Делфях.
Так и будет, но... не для указанных тобой БД.
molodoi (2006-06-19 18:17:00) [13]
> это вряд ли, т.к. в условии передается массив значений..
> . зачем спрашивается, если фильтрует по одному?
Нет. массив значений в таком случае как раз и непередается. В этом и вся загвоздка. Каждое последующее значение накладывается на первое, т.е. первое постоянно меняется, и фильтр неполучается.
=====================================
Кстати, кто-нибудь знает аналог запроса CREATE VIEW в Делфях.
Появилась мысль. Используя SetRange, отфильтровываем записи по одному полю. Получаемый набор записей однозначно меньше, и даже если он превышает пару тысяч, все равно остается меньше десятка тысяч. А уж по такому количеству фильтр работает шустрее. Так вот запихиваем этот набор в просмотр и применяем фильтр по оставшимся 2-м полям. Экономим много времени. Плохо то, что мне не известно о такой возможности с просмотром. ПОВТОРЯЮ ИСПОЛЬЗОВАНИЕ ЗАПРОСОВ НЕ ЖЕЛАТЕЛЬНО.
Как вариант можно использовать вторую таблицу, в которую и будем помещать искомый набор, а дальше как описано выше. Сам пока еще не пробовал, но мне думается: это опять скажется на времени, ведь есть разница между 10 и 10 000. Но и тут есть варианты, как переносить записи: можно тупым перебором, можно через массив. Какой из них быстрее - посмотрим.
sniknik (2006-06-18 14:41:00) [14]> Только вот фильтрует он по одному полю.
это вряд ли, т.к. в условии передается массив значений... зачем спрашивается, если фильтрует по одному?
molodoi (2006-06-18 11:46:00) [15]с SetRange все понятно. Только вот фильтрует он по одному полю.
А локальный запрос в самом деле медленнее.
sniknik (2006-06-14 08:49:00) [16]для локального варианта (файл сервер) открытие таблици напрямую будет действительно быстрее запроса. только как делается открытие тут (и через что), неясно совсем...
а фильтр, можно заменить на setrange (так вроде пишется, мог забыть за давним неиспользованием), он использует индекс, правда фильтр гибче, больше позволяет. но может устроит.
Ильш (2006-06-14 06:13:00) [17]
> Использование запросов не желательно
конечно нежелательно, зачем эту лажу ваще придумали...
Johnmen (2006-06-13 23:35:00) [18]
> Использование запросов не желательно, хотя если выхода не
> найдется придется пользоваться ими.
Это не выход, а СТАНДАРТНОЕ решение.
Впрочем, для любителей тормозов можно и миллион записей на клиента потянуть...:)