Вниз
Скачать: CL | DM;

Быстрый поиск при помощи 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 вся ветка

Скачать: CL | DM;



Память: 0.54 MB
Время: 0.019 c
1-24514
snake1977
2003-08-27 10:23
2003.09.08
свой компонент


1-24525
pirat
2003-08-27 04:42
2003.09.08
как работать с OleVariant


7-24714
OlegL
2003-06-24 14:55
2003.09.08
Название папки


6-24600
ASTARD
2003-06-30 19:21
2003.09.08
Indy HTTP server


3-24329
Relaxxx
2003-08-18 15:24
2003.09.08
Сортировка DBGrid по клику на колонке




   Наверх