![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
СРОЧНО !! Компонент / Класс чтение DBF напрямую по номеру записи [D6, dBase, FoxPro]
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) не кажется ли Вам, что туговато...