Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.30;
Скачать: CL | DM;

Вниз

СРОЧНО !! Компонент / Класс чтение DBF напрямую по номеру записи   Найти похожие ветки 

 
AlexRush ©   (2003-10-08 13:59) [0]

Мужики, помогите! Нужен компонент/класс, который сможет напрямую читаль записи из DBF, осуществляя навигацию по номеру записи

P.S. Очень важна скорость, т.к. нужно перебрать таблицу более чем из 130 000 записей в произвольном порядке. SQL с WHERE здесь на катит...


 
KSergey ©   (2003-10-08 14:01) [1]

Да возможно, что тут ничего не катит - мотыляться по базе туды-сюды... ;)
Рекомендую Halcion


 
AlexRush ©   (2003-10-08 14:04) [2]

2 KSergey © (08.10.03 14:01) [1] Спасибо, но что это и где взять ? (я в базах дубовый вообще)


 
zx ©   (2003-10-08 14:14) [3]

> SQL с WHERE здесь на катит...
куда на катит???


 
AlexRush ©   (2003-10-08 14:19) [4]

2zx © (08.10.03 14:14) [3] Как бы это вам сказать... измерbв среднюю скорость поиска одной записи (select * from DB WHERE ID = X) и проведя несложные математические расчеты получил приблизительное время обработки таблицы 80 часов (на P III 500/256/1024) не кажется ли Вам, что туговато...


 
y-soft ©   (2003-10-08 14:21) [5]

>AlexRush © (08.10.03 14:04) [2]

Структура DBF весьма проста( http://www.wotsit.org/download.asp?f=ti838d) - после заголовка расположен массив записей фиксированной длины. Это как раз тот случай, когда проще всего работать напрямую (если, конечно, не требуется блокировка записей)...


 
Val ©   (2003-10-08 14:34) [6]

>AlexRush © (08.10.03 14:19) [4]
угу, теоретики СУБД не додумались так скорости выборок измерять, а индексы от большого ума возникли в природе и ни у кого БД больше 10 строчек в одной таблице не бывает...


 
Vlad ©   (2003-10-08 14:34) [7]

>AlexRush © (08.10.03 14:19) [4]
80 часов ????
Батенька, вы индекс по ID не пробывали создавать ?


 
y-soft ©   (2003-10-08 14:40) [8]

Мужики, какой еще индекс по RecNo? :)))

Записи в таблице DBF и так физически раположены в порядке номеров записей. Ну, не является DBF нормальной SQL базой (для приличной таблицы SQL номер записи, как правило, не имеет смысла)... Зачем мудрить в таком простом случае?


 
Val ©   (2003-10-08 14:43) [9]

>y-soft © (08.10.03 14:40) [8]
автор говорит о номере записи, как о своем решении, по-моему...
задача-то неизвестна.


 
zx ©   (2003-10-08 14:45) [10]

select * from DB WHERE ID = X <- не так!
у ДатаСета есть метод Некст.


 
y-soft ©   (2003-10-08 14:49) [11]

>Val © (08.10.03 14:43) [9]

Судя по вопросу, автор имеет в виду именно доступ по физическому номеру записи в таблице DBF. Если осуществляется доступ только на чтение, то, учитывая структуру таблиц DBF, можно получить практически мгновенный доступ, работая с массивом записей...


 
zx ©   (2003-10-08 14:53) [12]

я думаю ему просто по записям нужно пробещаться.


 
y-soft ©   (2003-10-08 14:59) [13]

Вдогонку:

Сказанное, естественно, справедливо только для упакованных таблиц (без записей, помеченных на удаление)


 
Val ©   (2003-10-08 15:03) [14]

>y-soft © (08.10.03 14:49) [11]
Я понимаю. Но, т.к. автор говорит также, что не очень силен в БД, то можно предположить, что задачу, которую он собирается решать именно таким образом, можно решить иначе. Поэтому интересно услышать/прочитать о самой задаче, для предложения возможных других вариантов решения(если они существуют), кроме вашего, несомненно хорошего.


 
AlexRush ©   (2003-10-08 15:03) [15]

Видимо плохо сформулировал, проясняю ситуацию:
Абстрагируясь от моей конкретной ПРИКЛАДНОЙ задачи, можно сказать, что мне нужен доступ на чтение к записям из таблицы в формате DBF по их физическому номеру (порядку расположения в файле).

Если бы TDataSet.RecNo := X переводило бы курсор на запись с номером X, то проблема бы не возникала.

2zx © (08.10.03 14:45) [10]
Представьте себе:

for i:=1 to Count // Count<>MyTable.RecordCount
do begin
УстановитьКурсорНаЗаписьСномером(ФункцияПолученияНужногоНомера(i));
ДелатьПРИКЛАДНУЮработу;
end;


ФункцияПолученияНужногоНомера(i) <> i , и TDataSet.Next здесь на подходит.


 
Anatoly Podgoretsky ©   (2003-10-08 15:08) [16]

First, Last, MoveBy, Next, and Prior (индекс должен быть оключен)

y-soft © (08.10.03 14:59) [13]
Никто не мешает упаковать или включить показ удаленных записей.


 
AlexRush ©   (2003-10-08 15:15) [17]

2 All Учитывая AlexRush © (08.10.03 15:03) [15] снова поднимаю изначальный вопрос... Если есть компонент/класс, позволяющий осуществлять навигацию по физическому номеру в DBF файле (и чтение записей), то где его взять ?


 
sniknik ©   (2003-10-08 15:16) [18]

может просто заменить TDataSet.RecNo := X
на
TDataSet.First;
TDataSet.MoveBy(X);
?

поменять логику
?

или перейти на датасеты в памяти, ClientDataSet, ADODataSet
возможно самый быстрый вариант, на операции с диском только чтение, дальше от размера памяти.
?


 
KSergey ©   (2003-10-08 15:16) [19]

AlexRush © (08.10.03 13:59)
SQL с WHERE здесь на катит...


А к стати, каким образом можно при момощи WHERE переместиться на запись с указанным номером??!

> 13] y-soft © (08.10.03 14:59)
> Сказанное, естественно, справедливо только для упакованных
> таблиц (без записей, помеченных на удаление)

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

А вообще-то, Anatoly Podgoretsky прав: любым компонентом и описанными командами доступ должен получиться весьма с приличной скоростью.


 
AlexRush ©   (2003-10-08 15:21) [20]

2KSergey © (08.10.03 15:16) [19] А к стати, каким образом можно при момощи WHERE переместиться на запись с указанным номером??! я там поле ID добавил с номером записи....


 
zx ©   (2003-10-08 15:22) [21]

> AlexRush ©
можно узнать задачу для которой нужен доступ именно по физическому номеру в DBF файле?


 
sniknik ©   (2003-10-08 15:25) [22]

Представьте себе:

for i:=1 to Count // Count<>MyTable.RecordCount
do begin
УстановитьКурсорНаЗаписьСномером(ФункцияПолученияНужногоНомера(i));
ДелатьПРИКЛАДНУЮработу;
end;

если номера не зависят друг от друга (следуюший от предыдущего)
то представь так (изменение логики)
ВыборкаПоПолученнымНомерам(ПолучитьСписокНомеров(Count));
while not base.eof do
ДелатьПРИКЛАДНУЮработу;
base.next;
end;

(даже если нет своего ID, то в FoxPro и (ODBC VFP) можно в селекте обращатся к RecNo())


 
Val ©   (2003-10-08 15:25) [23]

>AlexRush © (08.10.03 15:21) [20]
ну и что? выборка и позиционирование вещи абсолютно разные.


 
y-soft ©   (2003-10-08 15:26) [24]

>Anatoly Podgoretsky © (08.10.03 15:08) [16]

Согласен - фактически реализация TDataSet для DBF и делает то, что я раньше предлагал...

KSergey © (08.10.03 15:16) [19]

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

Спасибо, давненько с DBF не работал... :)


 
AlexRush ©   (2003-10-08 15:26) [25]

Есть другая структура данных, организованная тоже записями, и соответствие ведется именно по номерам записей, но не однозначное, а по некоторым критериям...


 
AlexRush ©   (2003-10-08 15:29) [26]

2 sniknik © (08.10.03 15:25) [22] нет, так не катит, это точно


 
zx ©   (2003-10-08 15:30) [27]

> AlexRush ©
Често говоря, хочется по советовать почитать какую-нибудь книжку по работе с базами данных. Любо ты вопрос не можешь сформулировать, либо не понимаешь о чем говоришь.


 
AlexRush ©   (2003-10-08 15:32) [28]

2zx © (08.10.03 15:30) [27] - при всём уважении, не исключайте и третий вариант...


 
Anatoly Podgoretsky ©   (2003-10-08 15:34) [29]

Для реализации вышеуказанных методов достаточно переписать виртуальный метод SetRecNo


 
KSergey ©   (2003-10-08 15:41) [30]

2 AlexRush

Я все же не пойму: совет [18] sniknik © (08.10.03 15:16) (он же [16] Anatoly Podgoretsky © (08.10.03 15:08)) - не канает?? Почему на них нет реакции?


 
Anatoly Podgoretsky ©   (2003-10-08 15:44) [31]

Ты хочешь сказать, что эти методы у тебя не работают, на самом деле нужны только First и MoveBy, да и первый не особо нужен, можно текущий находу получать и делать вычитание?


 
Vick ©   (2003-10-08 15:45) [32]

Люди, на сколько я помню в ДатаСетах есть такая "загадочная" операция как Locate, может вопрошающему почитать про ее возможности???


 
y-soft ©   (2003-10-08 15:52) [33]

Для реализации вышеуказанных методов достаточно переписать виртуальный метод SetRecNo

А вообще для полноценного потомка TDataSet достаточно всего-то переписать 23 виртуальных метода :)))

IMHO, был хороший совет (KSergey © [1]) - если требуется нормальная поддержка нативного XBase - использовать уже готовые Helcyon, Apollo, Topaz etc ( http://www.kylecordes.com/bag/listbytype.html)...


 
Anatoly Podgoretsky ©   (2003-10-08 15:59) [34]

y-soft © (08.10.03 15:52) [33]
Неужели сложно написать пару строчек


 
y-soft ©   (2003-10-08 16:04) [35]

>Anatoly Podgoretsky © (08.10.03 15:59) [34]

В subj стоит пометка "Срочно", значит приспичило и со временем у вопрошающего туговато :))


 
KSergey ©   (2003-10-08 16:05) [36]

> [34] Anatoly Podgoretsky © (08.10.03 15:59)

Это не прикольно.

[33] y-soft © (08.10.03 15:52)
А вообще для полноценного потомка TDataSet достаточно всего-то переписать 23 виртуальных метода :)))


А не может ли кто ткнуть носом в конкретное место, где бы об этом почитать: какие именно методы и что с ними делать (ну в смысле зачем они испольуются).


 
y-soft ©   (2003-10-08 16:08) [37]

>KSergey © (08.10.03 16:05) [36]

А не может ли кто ткнуть носом в конкретное место, где бы об этом почитать: какие именно методы и что с ними делать (ну в смысле зачем они испольуются).

Марко Канту, Тим Гуч, Джон Ф. Лэм "Delphi. Руководство разработчика" Москва "ДЕСС" 1999


 
y-soft ©   (2003-10-08 16:11) [38]

>KSergey © (08.10.03 16:05) [36]

Еще кое что есть в

Тодд Миллер, Дэвид Пауэлл "Специальное издание. Использование Delphi 3" "Диалектика" 1997


 
AlexRush ©   (2003-10-08 16:14) [39]

2All
Всем спасибо за участие. Проблема решена.

P.S. Ветку можно закрывать.


 
KSergey ©   (2003-10-08 16:16) [40]

2 y-soft

Спасибо, попробую найти.



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

Текущий архив: 2003.10.30;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.031 c
1-98545
AlexanderSK
2003-10-17 15:37
2003.10.30
DataSnap (midas) - отключение клиента от сервера


1-98707
Нурик
2003-10-21 07:33
2003.10.30
Drag&Drop текста


7-98915
uno crezo
2003-08-20 07:27
2003.10.30
регистр


6-98761
Lony
2003-09-05 12:18
2003.10.30
Проверка наличия соединения с интернетом.


1-98665
ИМГусак
2003-10-21 14:58
2003.10.30
По-прежнему срочно