![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение Number из файла Paradox (*.db) [D7, Paradox]
Barsky © (2006-01-30 12:40:00)Есть таблица *.db
В ней есть поле Number
Это поле храниться в файле в 8 байтах
Эти 8 байт я знаю.
Как их преобразовать в double?
Тыркаюсь уже час и никак не могу разобраться...
Виталий Панасенко (2006-01-30 17:01:00) [1]
> msguns © (30.01.06 16:43) [30]
Полностью согласен.. Не нравиться БДЕ, используй АДО.. БДЕ тягать не нужно(все равно используется)... Правда, может быть, используемый язык кастрирован до "нимагу"... Мой пост
> Виталий Панасенко (30.01.06 15:19) [25]
- можно еще обьявить массив из байт по абсолютному адресу Dbl и в массиве байты переставить так как нужно(может быть, драйвер Парадокса выкручивает (как NetWare крутит LongInt) байты при хранении) байты..
var
Dbl : Double;
Mas : array [1..8] of Byte absolute Dbl;
msguns (2006-01-30 16:43:00) [2]>mr.il © (30.01.06 16:21) [29]
Человек по незнанию решил почесать левое ухо (Win-парадокс) правой пяткой (DOS).
Ему попытались объяснить, что дело не в ухе, и не в пятке. Что для доступа в стандартный формат БДправильно использовать соответствующие механизмы либо от разработчика того самого формата БД, либо от других фирм, грамотнонаписавших собственные механизмы доступа.
В ДОСЕ имеется куча средств для чтения таблиц парадокса (например, 4) или дибэйза, в винде конвертировать таблицу из 5(7,8,9) парадокса в 4-й или dBase проблему не составляет. Разработанная по этой схеме технология будет гарантированноработать на любыхтаблицах парадокса 5 и выше, причем в обе стороны.
Человек же хочет работать хакерским образом, решив сиюминутную задачу сиюминутнным же способом. При этом, когда люди куда грамотнее его советуют подойти к проблеме аналитическии системно, становится в позу и заявляет, что тут никто ничего не знает.
mr.il (2006-01-30 16:21:00) [3]Народ, человек хочет знать следующее:
Пусть есть таблица парадокс (2 поля): n-(+); nn-(N)
пишем в нее следующее:
r.no.| nn| | hex (это видим в хекс-вьюире)
1 | 1| | BF F0 00 00 00 00 00 00
2 | 2| | C0 00 00 00 00 00 00 00
3 | -1| | 40 0F FF FF FF FF FF FF
4 | 1.1| | BF F1 99 99 99 99 99 9A
5 | -2| | 3F FF FF FF FF FF FF FF
6 |23.345| | C0 37 58 51 EB 85 1E B8
На первый взгляд, ну ни каой закономерности (ну кроме минусовых значений и то они целые). Вопрос знающим людям: как преобразовать hex значение (хранящееся в парадокс "файле" (зная адрес начала и длину поля)) в "дробное" число.
2 Barsky. Я прав?
Digitman (2006-01-30 16:11:00) [4]
> Она не под дос, но это не важно
Это ВАЖНО !
И еще как важно !
> Просто ты вместо того что бы ответить "как", пытался доказать
> что нужно подругому
Я тебе ничего не пытался доказать.
Каково было твое изложение сути проблемы - такова была и моя реакция.
Ты вот не удосужился привести аргументы в пользу "до него не дотянуться в конкретной задаче", а я вот не удосужился телепатировать.
Но прямое обращение к файлу при вполне возможномналичии готового платформенного решения - это решение, ведущее в тупик.
Barsky (2006-01-30 16:02:00) [5]Где тут кнопочка "Закрыть обсуждение"?
Barsky (2006-01-30 15:52:00) [6]
> Виталий Панасенко (30.01.06 15:19) [25]
Не помогло...
> Digitman © (30.01.06 15:12) [24]
Она не под дос, но это не важно. Просто ты вместо того что бы ответить "как", пытался доказать что нужно подругому. По другому я умею.
Виталий Панасенко (2006-01-30 15:19:00) [7]Если совсем туго, то это все в несколько строк кода
Turbo Pascal 7.0
var
Dbl : Double;
F : File;
begin
Assign(F, 'paradox.db');
Reset(F, 1);
Seek(F, ТУТ ПОЗИЦИЯ ПЕРВОГО БАЙТА ИЗ 8);
BlockRead(F, Dbl, SizeOf(Dbl));
WriteLn;
WriteLn('Double=', Dbl);
end.
Digitman (2006-01-30 15:12:00) [8]
> Barsky © (30.01.06 15:04) [22]
> Эх... Не понимают меня люди
Как же тебя понять, если до самого последнего момента ты держишь в суперсекретности инф-цию о том, что, оказывается, твое приложение - это ДОС-программа ?
Виталий Панасенко (2006-01-30 15:12:00) [9]См
> Виталий Панасенко (30.01.06 15:03) [21]
> По сути, человеку нужно открыть таблицу как нетипированный
> файл, сделать Seek на начало(первый байт) числа, и BlockRead(F,
> Dbl, SizeOf(Double));
Barsky (2006-01-30 15:04:00) [10]
> msguns © (30.01.06 14:35) [20]
Эх... Не понимают меня люди.
Давай так.
Ты в DOS'e. Больше ничего нет. Нету dll, про ado ты тоже не слышал.
Есть язык, который умеет работать со строками и знает математические функции.
Богом тебе дается текстовый файл, содержащий 8 байт данных.
Причем данные эти выдрались (или не богом данны, может сам выдрал) из файла с расширением db.
Тоесть ты их можешь записать в переменную.
Так же ты знаешь что это когда-то было числом.
КАК УЗНАТЬ КАКИМ?
Виталий Панасенко (2006-01-30 15:03:00) [11]
> msguns © (30.01.06 14:26) [19]
> >Виталий Панасенко (30.01.06 14:11) [17]
> >Money/Numeric ХРАНЯТСЯ В ФОРМАТЕ DOUBLE
>
> Точно ?
> Для проверки достаточно запустить Database Desktop и, создавая
> новую таблицу типа Paradox выбрать тип поля. Никакого "double"
> там нетути..
> "Тип поля" есть всего лишь способ "обзывания" в разных субэдэшных
> средах формата физического хранения данных. В частночсти,
> BDE не "знает" дабла ;)
>
> Лишь бы оспорить ?
Это все равно, что утвержать по FireBirdу - NUMERIC(18,0) это не INT64.
Или в Паскале
type money=double;
От того, что я DOUBLE "обозвал" ДЭНЪГАМИ все приколы дабла остались... По сути, человеку нужно открыть таблицу как нетипированный файл, сделать Seek на начало(первый байт) числа, и BlockRead(F, Dbl, SizeOf(Double));
msguns (2006-01-30 14:35:00) [12]>Barsky © (30.01.06 14:23) [18]
>Поправьте где ошибся.
Практически везде.
>На сколько я понимаю, как paradox записывает в файл число, это не его изобретение, а какой-то стандарт.
Это "стандарт" не парадокса, а "движка" (BDE), т.е. программных средств доступа к базам типа Парадокс. Парадокс "пишет" в "файл" не число и даже не поле, а запись. Непонимание этого обрекает любые попытки работы с БД на крах. Тем более, "доморощенными" методами.
Кроме того, "стандарты" физического хранения данных одни и те же и ограничены собственно обработкой чисел в ПК (т.е. fixed, float либо т.н. Decimal, который раньше мог физически быть fixed и даже Alphanumeric, а ныне почти повсеместно - float). Размер числа в байтах зависит от его точности, заданной при создании таблицы.
>Значит зная этот стандарт записи числа можно это же число записать в другом стандарте.
Куда записать ? Зная чего ? Для того, чтобы прочитать данные из поля таблицы любой СУБД, недостаточно знать только его длину и формат, надо еще знать его адресв записи, адрес самой записи в таблице и много еще чего. Именно поэтому был придуман сиквель (SQL) , чтобы из разныхпрограмм единым образомможно было извлечь из таблицы любойСУБД любыеданные.
msguns (2006-01-30 14:26:00) [13]>Виталий Панасенко (30.01.06 14:11) [17]
>Money/Numeric ХРАНЯТСЯ В ФОРМАТЕ DOUBLE
Точно ?
Для проверки достаточно запустить Database Desktop и, создавая новую таблицу типа Paradox выбрать тип поля. Никакого "double" там нетути..
"Тип поля" есть всего лишь способ "обзывания" в разных субэдэшных средахформата физического хранения данных. В частночсти, BDE не "знает" дабла ;)
Лишь бы оспорить ?
Barsky (2006-01-30 14:23:00) [14]
> Вопрос тривиальный и нетривиальный одновременно.
На сколько я понимаю, как paradox записывает в файл число, это не его изобретение, а какой-то стандарт.
Значит зная этот стандарт записи числа можно это же число записать в другом стандарте.
Поправьте где ошибся.
Виталий Панасенко (2006-01-30 14:11:00) [15]
> msguns © (30.01.06 12:59) [3]
> >Виталий Панасенко (30.01.06 12:50) [1]
>
> Даже если выматериться три раза, твоя поправка неверна в
> корне !
> Парадокс не знает, что такое double ! Он хранит все дробные
> числа в плавающем "машинном" формате, а вот как они будут
> обрабатываться "клиентом",
> это его абсолютно не волнует !
Вот как раз ты и не прав... Money/Numeric ХРАНЯТСЯ В ФОРМАТЕ DOUBLE. Никакой другой формат не используется(Extended, Single, Comp). Для MONEY просто визуализация отлична.
msguns (2006-01-30 14:04:00) [16]>Barsky © (30.01.06 13:58) [15]
>Думалось что вопрос тривеальный, только я его не знаю =)
Вопрос тривиальный и нетривиальный одновременно.
По аналогии пример: как ты думаешь, сложно выпить стакан воды ? Е если без помощи рта ? Так вот, ты хочешь имеено "без помощи". И при этом возмущаешься конструкцией стакана.
Без BDE можно прочитать парадоксовские таблицы. Например, через ADO.
Barsky (2006-01-30 13:58:00) [17]
> Зачем гадать на коф.гуще ?
> Нужно внимательно изучить док-цию на среду программирования/исполнения
> ..
Думалось что вопрос тривеальный, только я его не знаю =)
Но если никто ответ не знает, придется идти обходными путями.
Всем спасибо
Digitman (2006-01-30 13:51:00) [18]
> БДЕ мне нравится, но до него не дотянуться в конкретной
> задаче
Аргументируй свое утверждение ..
> Не думаю
Зачем гадать на коф.гуще ?
Нужно внимательно изучить док-цию на среду программирования/исполнения ..
msguns (2006-01-30 13:51:00) [19]Насколько я понял, имеется желание "читать" парадоксовские таблицы напрямую, минуя всякие там "движки", "драйвера" и т.д. ?
Если так, то дело это гиблое,- счастливо в$#@%?ся !
Digitman (2006-01-30 13:49:00) [20]
> Barsky © (30.01.06 13:44) [9]
да не лезь ты в файл таблицы напрямую !
Ни к чему это совершенно.
Во-первых, любая среда программирования/исполнения, умеющая "общаться" с DLL, с успехом сумеет обратиться и к BDE в том числе.
Во-вторых, даже если эта среда не общается напрямую с ДЛЛ, наверняка она поддерживает иные известные устойчивые технологии, позволяющие обмениваться инф-цией с прогр.модулями, разработанными в иных средах.