Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

СРОЧНО !! Компонент / Класс чтение DBF напрямую по номеру записи [D6, dBase, FoxPro]


Страницы:   1 2 3

AlexRush ©   (2003-10-08 13:59:00) 

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

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


sniknik   (2003-10-08 15:25:00) [21]

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

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:00) [22]

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


zx   (2003-10-08 15:22:00) [23]

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


AlexRush   (2003-10-08 15:21:00) [24]

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


KSergey   (2003-10-08 15:16:00) [25]

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


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

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

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

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


sniknik   (2003-10-08 15:16:00) [26]

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

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

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


AlexRush   (2003-10-08 15:15:00) [27]

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


Anatoly Podgoretsky   (2003-10-08 15:08:00) [28]

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

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


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

Видимо плохо сформулировал, проясняю ситуацию:
Абстрагируясь от моей конкретной ПРИКЛАДНОЙ задачи, можно сказать, что мне нужен доступ на чтение к записям из таблицы в формате 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 здесь на подходит.


Val   (2003-10-08 15:03:00) [30]

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


y-soft   (2003-10-08 14:59:00) [31]

Вдогонку:

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


zx   (2003-10-08 14:53:00) [32]

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


y-soft   (2003-10-08 14:49:00) [33]

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

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


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

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


Val   (2003-10-08 14:43:00) [35]

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


y-soft   (2003-10-08 14:40:00) [36]

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

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


Vlad   (2003-10-08 14:34:00) [37]

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


Val   (2003-10-08 14:34:00) [38]

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


y-soft   (2003-10-08 14:21:00) [39]

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

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


AlexRush   (2003-10-08 14:19:00) [40]

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


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо