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

Вниз

Быстрый поиск при помощи TTable   Найти похожие ветки 

 
Nikkkkk   (2003-08-18 15:46) [0]

Уважаемые мастера,
как осуществить быстрый поиск записи по заданному условию. Какая команда работает быстрее всего. Если не трудно, небольшой пример.
Заранее спасибо.


 
Bob   (2003-08-18 15:52) [1]

Если по ключевому полю - TTable.FindNearest() прокатывае на ура


 
Семен Сорокин   (2003-08-18 15:54) [2]

быстрее ИМХО запрос (TQuery) работает


 
MsGuns   (2003-08-18 15:54) [3]

Locate


 
Nikkkkk   (2003-08-18 16:05) [4]

Пробую
Table1.FindNearest(["1",strtodate("01.07.03")]);
выдает ошибку:
cannot use array or field values with Expression inexes
что бы это могло занчить ???


 
Nikkkkk   (2003-08-18 16:06) [5]

индекс выглядит так:
STR(GURN,3)+DTOS(DATOTG)+STR(NOMDOK,7) (FoxPro)


 
Nikkkkk   (2003-08-18 16:26) [6]

Ну, чо же все замолчали, я знаю что Query ищет все и быстро, но с его помощью выбрать 20 записей из 500000 тоже не слишком быстро, как быть, подскажите мастера. Как осуществить поиск, отталкиваясь от индекса STR(GURN,3)+DTOS(DATOTG)+STR(NOMDOK,7)???


 
Nikkkkk   (2003-08-18 16:36) [7]

!!! ПОМОГИТЕ ПЛИИИИЗЗЗЗЗ !!!


 
koks   (2003-08-18 17:09) [8]

Я бы сделал так:

создал бы для всех записей поле (строковое в твоем случае), в которое бы автоматом при изменении-добавлении записи заносилось значение, но которому ты будешь их отбирать (твое индексное выражение).
ну а дальше - фильтр...
И вообще - 500 000 записей - это мало...

Я вообще очень настороженно отношусь к фильтрам по выражению в BDE, да еще к FoxPro-шным таблицам.


 
Nikkkkk   (2003-08-18 17:24) [9]


> создал бы для всех записей поле (строковое в твоем случае),
> в которое бы автоматом при изменении-добавлении записи заносилось
> значение, но которому ты будешь их отбирать (твое индексное
> выражение).
> ну а дальше - фильтр...
> И вообще - 500 000 записей - это мало...
>
> Я вообще очень настороженно отношусь к фильтрам по выражению
> в BDE, да еще к FoxPro-шным таблицам.

я не могу добавлять никакие поля в таблицу, по условию моей задачи, потому что в них постоянно работают другие пользователи. Мне необходимо сделать выборку из одной базы, потом по результату сделанной выборки, произвести выборку из другой таблицы, поэтому 500000 записей это я сказал примерно. На самом деле их намного больше. Индекс в этой таблице уже существует (он описан мною выше), этот индекс сортирует записи по дате ввода. Мне же необходимо перейти (как можно быстрее) на запись с датой ввода 01.месяц.год, и далее при помощи TTabe.next добраться до 31.месяц.год. Так вот, этот то самый быстрый переход у меня и занимает минуту-полторы. А мне бы хотелось узнать, нет ли какой-нибудь стандартной процедуры поиска (дипа Фоксовской seek), для быстрого перехода к первой по счету подходящей записи ???
Заранее спасибо.


 
Соловьев   (2003-08-18 17:26) [10]

select t1.*
from table t1
where t1."date" between :p1 and :p2


 
Nikkkkk   (2003-08-18 17:31) [11]


> Соловьев © (18.08.03 17:26) [10]
> select t1.*
> from table t1
> where t1."date" between :p1 and :p2

SQL запросами пользоваться не могу, таблицы открыты только для чтения, как справочники...
SORRY
за то что не сказал раньше
необходима какая то процедура, которую поддерживает TTable, связанная и индексом...


 
Соловьев   (2003-08-18 17:32) [12]


> SQL запросами пользоваться не могу, таблицы открыты только
> для чтения

бред. может быть только наоборот.


 
Nikkkkk   (2003-08-18 17:33) [13]


> бред. может быть только наоборот.

это о чем ???


 
Соловьев   (2003-08-18 17:35) [14]

SQL запросами можешь пользоваться.


 
koks   (2003-08-18 17:37) [15]

повторюсь - ты сам придумываешь себе сложности... Все проще. Использую TQuery.


 
Nikkkkk   (2003-08-18 17:40) [16]


> Соловьев © (18.08.03 17:35) [14]
> SQL запросами можешь пользоваться.

Могу, умею, и постоянно пользуюсь. Но в моей задаче возникла необходимость работать с базами данных FoxPRO 2.5 (Dos). Так что полный доступ пришлось отключить, т.к. при редактировании записей, TQuery создает свой индекс, и изменения из под FoxPRO не видны. TTable работает пока без глюков. А при попытке сделать запрос к таблице(открытой только для чтения) на сервере, выдает ошибку: Can not acces dyrectory. и т.д.


 
ОХ   (2003-08-18 17:42) [17]

> SQL запросами пользоваться не могу
Давно не использую TTable,но насколько припоминаю
при открытии TTable, автоматически формируется запрос
Select * from Table_Name order by field1


 
Nikkkkk   (2003-08-18 17:44) [18]


> ОХ (18.08.03 17:42) [17]
> > SQL запросами пользоваться не могу
> Давно не использую TTable,но насколько припоминаю
> при открытии TTable, автоматически формируется запрос
> Select * from Table_Name order by field1

В TTable есть свойство Readonly, в TQuery нет.


 
Bob   (2003-08-18 17:46) [19]

TQuery по умолчанию тоже ReadOnly


 
Соловьев   (2003-08-18 17:47) [20]


> Can not acces dyrectory. и т.д.

Private dir у алиаса?
и что за сервер? файл-сервер?


 
Nikkkkk   (2003-08-18 17:49) [21]


> Соловьев © (18.08.03 17:47) [20]
>
> > Can not acces dyrectory. и т.д.
>
> Private dir у алиаса?
> и что за сервер? файл-сервер?

алиас я не создавал, прописываю пути к таблицам из ini-файла, а читается все с файл-сервера.


 
ОХ   (2003-08-18 17:53) [22]

>В TTable есть свойство Readonly, в TQuery нет
А чем плох RequestLive у TQuery?


 
Соловьев   (2003-08-18 17:54) [23]


> алиас я не создавал,

ну так создай.
If no value is specified for PrivateDir, the BDE automatically stores temporary files in the directory current at the time the BDE was initialized.


 
MsGuns   (2003-08-18 17:57) [24]

А вообще надо бы, ИМХО, исследовать св-ва и методы TSession, TDataBase, TTable, TQuery


 
Соловьев   (2003-08-18 17:58) [25]

Note: For applications that run directly from a networked file server, the application should set PrivateDir to a user’s local drive to improve performance and to prevent temporary files from being created on the server where they might conflict with temporary files created by other instances of the application.


 
Anatoly Podgoretsky   (2003-08-18 18:12) [26]

Для быстрого передхода по такому индексу надо использовать GotoKey


 
Nikkkkk   (2003-08-19 09:30) [27]

Уважаемые мастера, продолжим тему.
Создал я алиас для своего приложения, прописал в netfiledir путь к таблицам на сервере. В privatedit - "D:\TEMP\" подключил к алиасу Query1 и Query2. При session1.active:=True выдает ошибку network initialization failed. File or directoty does not exist.


 
Nikkkkk   (2003-08-19 09:36) [28]

вяло все таки с утра форум работает, не все еще проснулись(а может кто и не ложился).


 
Anatoly Podgoretsky   (2003-08-19 09:40) [29]

Что такое netfiledir?
Зачем отдельная сессия, она нужна?
По сообщению ты куда обращаешься, что отсутствует или недоступно


 
Nikkkkk   (2003-08-19 09:46) [30]


> Anatoly Podgoretsky © (19.08.03 09:40) [29]
> Что такое netfiledir?
> По сообщению ты куда обращаешься, что отсутствует или недоступно

Netfiledir - адрес таблиц на сетевом диске.

> Зачем отдельная сессия, она нужна?

делаю по совету:
Соловьев © (18.08.03 17:54) [23]

> По сообщению ты куда обращаешься, что отсутствует или недоступно

я обращаюсь на сервер, к таблицам открытым только для чтения. Я так думаю алиас мне посоветовали создать для того, чтобы в нем указать privatedit - "D:\TEMP\", но все равно ведь не пашет.


 
Соловьев   (2003-08-19 09:57) [31]


> Nikkkkk (19.08.03 09:46) [30]

алиас не обязателен. при работе с БД через BDE автоматически создается Session. У него есть св-во PrivateDir


 
Anatoly Podgoretsky   (2003-08-19 10:05) [32]

По твоим словам "Создал я алиас для своего приложения, прописал в netfiledir путь к таблицам на сервере." выходит, что ты гдето в алиасе прописал netfiledir, если не так, то зачем тебе алиас?

алиас с privatedir никак не связан, это прерогатива сессии

Вообще то у тебя глубокие провалы в базах данных и чего ты в них полез.


 
DenK_vrtz   (2003-08-19 10:07) [33]

> Nikkkkk,
>я обращаюсь на сервер, к таблицам открытым только для чтения

в чем они открыты для чтения? или сетевой ресурс открыт для чтения? права доступа к сетевому русурсу корректно прописаны?

смотри сообщение от Anatoly Podgoretsky © (19.08.03 09:40) "По сообщению ты куда обращаешься, что отсутствует или недоступно".


 
sniknik   (2003-08-19 10:50) [34]

Индекс сложный с выражениями, фоксовый, вряд ли добьешся от BDE нормальной работы с ним (ну нет полной поддержки фокса, чего поделаеш).

возьми сторонний компонент типа (не настаиваю, но сам пользуюсь, хотя есть побыстрее) Halcyon. как раз нет поддержки Query только таблицы(это и надо?), зато поддержка фокса/и.др. и вычисляемых/сложных индексов.
поддержка Halcyon-а не больше чем фокс 2.5(или 2.6(?)), но тебе пойдет (2.5 упоминалось).

к примеру поиск по индексу (это для клипера, тот же компонент)


TDest.IndexFileInclude(PDest+"\DiscCrd.Ntx");
TDest.IndexName:= "DISCCRD";
TDest.First;
UpEdit:= 0;
UpAdd:= 0;
while not TSour.Eof do begin
st:= TSour.Fields[MasT2[1]].AsString;
if st[1] = "!" then while length(st) < 25 do st:= st+"Z"
else st:= Copy(St, 1, CutDiscontLength)+StringOfChar(" ", 25-CutDiscontLength);

if TDest. Find(" 4"+st+" 0 0 0 0 0" , True, False) then begin
TDest.Edit;
UpEdit:= UpEdit+ 1;
end else begin
TDest.Append;
UpAdd:= UpAdd+ 1;
end;
.....


индекс здесь

TDest.Active:= True;
TDest.IndexOn(BaseDir+"\DiscCrd.Ntx", "", "PADR(STR(Type,3,0),3) + PADR(CODE,25) + STR(GR1,6,0) + STR(GR2,6,0) + STR(GR3,6,0) + STR(GR4,6,0) + STR(GR5,6,0)", "", Duplicates, Ascending);


правда одно выражение (функцию индексную) мне пришлось переписать, работала не так как наша версия клипера, а нужна была полная совместимость.

Halcyon можно взять сдесь
http://www.vodonosov.newmail.ru/develop/develop.htm


 
Anatoly Podgoretsky   (2003-08-19 11:22) [35]

sniknik © (19.08.03 10:50) [34]
Для чтения пойдет, если конечно не будет проблемы с языком таблицы. Вот если бы дело шло про Клиппер, то тогда да, более серьезные проблемы, а так на чтение как правило работает почти без проблем, если не делать фильтрацию по диапазону.


 
sniknik   (2003-08-19 11:47) [36]

Anatoly Podgoretsky © (19.08.03 11:22) [35]
я так понял, что только чтение (что у BDE без проблем) это у него искуственное ограничение (гдето он писал, может не в этом топике, и именно потому чно нормально записать не может индексы рушатся), а так может попытатся сделать полную совместимость (и редактировать из своей проги, и так чтобы фокс не порушился). ну хотя бы попытается.



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

Форум: "Базы";
Текущий архив: 2003.09.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.008 c
1-24505
Rel_
2003-08-28 11:47
2003.09.08
Работа с классами


1-24482
Alecs
2003-08-27 12:29
2003.09.08
Как скрыть родительские property в Object Inspectore?


3-24327
Xmen
2003-08-18 14:58
2003.09.08
Paradox -> MySQL


6-24594
Jao
2003-07-02 14:58
2003.09.08
Indy. TidTCPClient - где ошибка?


1-24520
Коля
2003-08-27 02:25
2003.09.08
ReplaceStr





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский