Форум: "Базы";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
ВнизЧтение Number из файла Paradox (*.db) Найти похожие ветки
← →
Barsky © (2006-01-30 12:40) [0]Есть таблица *.db
В ней есть поле Number
Это поле храниться в файле в 8 байтах
Эти 8 байт я знаю.
Как их преобразовать в double?
Тыркаюсь уже час и никак не могу разобраться...
← →
Виталий Панасенко (2006-01-30 12:50) [1]3.14здец !!!! Эти 8 байт И ЕСТЬ DOUBLE !!!!!
← →
ЮЮ © (2006-01-30 12:55) [2]
> Эти 8 байт я знаю.
Ну и чего тебе от тааблицы *.db если ты и так всё знаешь? (
> Эти 8 байт я знаю.
)
Эти 8 байт с завидной регулярностью повторяются в каждой записи таблицы, "спрятанной" в файле *.db. Открой его как положено, TQuery, TTable - и получи Набор данных, теперь найди в нём единственную нужную и получи значениее поля (Fields, FieldByName, ...)
← →
msguns © (2006-01-30 12:59) [3]>Виталий Панасенко (30.01.06 12:50) [1]
Даже если выматериться три раза, твоя поправка неверна в корне !
Парадокс не знает, что такое double ! Он хранит все дробные числа в плавающем "машинном" формате, а вот как они будут обрабатываться "клиентом",
это его абсолютно не волнует !
← →
Barsky © (2006-01-30 13:02) [4]Так как из "машинного" формата обыкновенное десятиричное число получить?
← →
Barsky © (2006-01-30 13:06) [5]
> Эти 8 байт с завидной регулярностью повторяются в каждой
> записи таблицы, "спрятанной" в файле *.db. Открой его как
> положено, TQuery, TTable - и получи Набор данных, теперь
> найди в нём единственную нужную и получи значениее поля
> (Fields, FieldByName, ...)
Будет использоваться не в Delphi. Нужно в другом языке, который paradox не знает, вытащить из таблицы 1 число.
Спрашиваю здесь, тк больше негде =)
← →
Digitman © (2006-01-30 13:09) [6]
> В ней есть поле Number
> Это поле храниться в файле в 8 байтах
MyDataset.MyNumericField.AsDouble
← →
Barsky © (2006-01-30 13:13) [7]
> MyDataset.MyNumericField.AsDouble
Нужно без использования BDE.
Просто имея файл и зная где эти 8 байт записаны.
Нужен алгоритм преобразования этой последовательности в обычное число
← →
msguns © (2006-01-30 13:39) [8]Если число из поля записи БД надо просто отображать (в фиксацией дроби, например), то вполне годится TNumericField(FieldByName("")).DisplayFormat := "0.00"
Если надо использовать в выражениях, то FieldByName("").AsFloat
← →
Barsky © (2006-01-30 13:44) [9]Наверно меня не понимают.
Есть что-та типа "C0 8F 40 00 00 00 00 00"
Это hex из файла .db.
Это число.
В таблице это "1000".
У меня есть файл.
Я получил "C0 8F 40 00 00 00 00 00".
(знаю какие байты из файла взять).
Теперь мне нужно понять что это именно "1000", а не , например, "2000".
Тоесть как paradox записывает поля типа number?
← →
Digitman © (2006-01-30 13:44) [10]
> Barsky © (30.01.06 13:13) [7]
Чем тебе БДЕ так претит ?
> Нужно в другом языке
Этот самый "язык" умеет ли импортировать и вызывать ф-ции из DLL ?
← →
Barsky © (2006-01-30 13:47) [11]
> Чем тебе БДЕ так претит ?
БДЕ мне нравится, но до него не дотянуться в конкретной задаче.
> Этот самый "язык" умеет ли импортировать и вызывать ф-ции
> из DLL ?
Не думаю.
← →
Digitman © (2006-01-30 13:49) [12]
> Barsky © (30.01.06 13:44) [9]
да не лезь ты в файл таблицы напрямую !
Ни к чему это совершенно.
Во-первых, любая среда программирования/исполнения, умеющая "общаться" с DLL, с успехом сумеет обратиться и к BDE в том числе.
Во-вторых, даже если эта среда не общается напрямую с ДЛЛ, наверняка она поддерживает иные известные устойчивые технологии, позволяющие обмениваться инф-цией с прогр.модулями, разработанными в иных средах.
← →
msguns © (2006-01-30 13:51) [13]Насколько я понял, имеется желание "читать" парадоксовские таблицы напрямую, минуя всякие там "движки", "драйвера" и т.д. ?
Если так, то дело это гиблое,- счастливо в$#@%?ся !
← →
Digitman © (2006-01-30 13:51) [14]
> БДЕ мне нравится, но до него не дотянуться в конкретной
> задаче
Аргументируй свое утверждение ..
> Не думаю
Зачем гадать на коф.гуще ?
Нужно внимательно изучить док-цию на среду программирования/исполнения ..
← →
Barsky © (2006-01-30 13:58) [15]
> Зачем гадать на коф.гуще ?
> Нужно внимательно изучить док-цию на среду программирования/исполнения
> ..
Думалось что вопрос тривеальный, только я его не знаю =)
Но если никто ответ не знает, придется идти обходными путями.
Всем спасибо
← →
msguns © (2006-01-30 14:04) [16]>Barsky © (30.01.06 13:58) [15]
>Думалось что вопрос тривеальный, только я его не знаю =)
Вопрос тривиальный и нетривиальный одновременно.
По аналогии пример: как ты думаешь, сложно выпить стакан воды ? Е если без помощи рта ? Так вот, ты хочешь имеено "без помощи". И при этом возмущаешься конструкцией стакана.
Без BDE можно прочитать парадоксовские таблицы. Например, через ADO.
← →
Виталий Панасенко (2006-01-30 14:11) [17]
> msguns © (30.01.06 12:59) [3]
> >Виталий Панасенко (30.01.06 12:50) [1]
>
> Даже если выматериться три раза, твоя поправка неверна в
> корне !
> Парадокс не знает, что такое double ! Он хранит все дробные
> числа в плавающем "машинном" формате, а вот как они будут
> обрабатываться "клиентом",
> это его абсолютно не волнует !
Вот как раз ты и не прав... Money/Numeric ХРАНЯТСЯ В ФОРМАТЕ DOUBLE. Никакой другой формат не используется(Extended, Single, Comp). Для MONEY просто визуализация отлична.
← →
Barsky © (2006-01-30 14:23) [18]
> Вопрос тривиальный и нетривиальный одновременно.
На сколько я понимаю, как paradox записывает в файл число, это не его изобретение, а какой-то стандарт.
Значит зная этот стандарт записи числа можно это же число записать в другом стандарте.
Поправьте где ошибся.
← →
msguns © (2006-01-30 14:26) [19]>Виталий Панасенко (30.01.06 14:11) [17]
>Money/Numeric ХРАНЯТСЯ В ФОРМАТЕ DOUBLE
Точно ?
Для проверки достаточно запустить Database Desktop и, создавая новую таблицу типа Paradox выбрать тип поля. Никакого "double" там нетути..
"Тип поля" есть всего лишь способ "обзывания" в разных субэдэшных средах формата физического хранения данных. В частночсти, BDE не "знает" дабла ;)
Лишь бы оспорить ?
← →
msguns © (2006-01-30 14:35) [20]>Barsky © (30.01.06 14:23) [18]
>Поправьте где ошибся.
Практически везде.
>На сколько я понимаю, как paradox записывает в файл число, это не его изобретение, а какой-то стандарт.
Это "стандарт" не парадокса, а "движка" (BDE), т.е. программных средств доступа к базам типа Парадокс. Парадокс "пишет" в "файл" не число и даже не поле, а запись. Непонимание этого обрекает любые попытки работы с БД на крах. Тем более, "доморощенными" методами.
Кроме того, "стандарты" физического хранения данных одни и те же и ограничены собственно обработкой чисел в ПК (т.е. fixed, float либо т.н. Decimal, который раньше мог физически быть fixed и даже Alphanumeric, а ныне почти повсеместно - float). Размер числа в байтах зависит от его точности, заданной при создании таблицы.
>Значит зная этот стандарт записи числа можно это же число записать в другом стандарте.
Куда записать ? Зная чего ? Для того, чтобы прочитать данные из поля таблицы любой СУБД, недостаточно знать только его длину и формат, надо еще знать его адрес в записи, адрес самой записи в таблице и много еще чего. Именно поэтому был придуман сиквель (SQL) , чтобы из разных программ единым образом можно было извлечь из таблицы любой СУБД любые данные.
← →
Виталий Панасенко (2006-01-30 15:03) [21]
> 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));
← →
Barsky © (2006-01-30 15:04) [22]
> msguns © (30.01.06 14:35) [20]
Эх... Не понимают меня люди.
Давай так.
Ты в DOS"e. Больше ничего нет. Нету dll, про ado ты тоже не слышал.
Есть язык, который умеет работать со строками и знает математические функции.
Богом тебе дается текстовый файл, содержащий 8 байт данных.
Причем данные эти выдрались (или не богом данны, может сам выдрал) из файла с расширением db.
Тоесть ты их можешь записать в переменную.
Так же ты знаешь что это когда-то было числом.
КАК УЗНАТЬ КАКИМ?
← →
Виталий Панасенко (2006-01-30 15:12) [23]См
> Виталий Панасенко (30.01.06 15:03) [21]
> По сути, человеку нужно открыть таблицу как нетипированный
> файл, сделать Seek на начало(первый байт) числа, и BlockRead(F,
> Dbl, SizeOf(Double));
← →
Digitman © (2006-01-30 15:12) [24]
> Barsky © (30.01.06 15:04) [22]
> Эх... Не понимают меня люди
Как же тебя понять, если до самого последнего момента ты держишь в суперсекретности инф-цию о том, что, оказывается, твое приложение - это ДОС-программа ?
← →
Виталий Панасенко (2006-01-30 15:19) [25]Если совсем туго, то это все в несколько строк кода
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.
← →
Barsky © (2006-01-30 15:52) [26]
> Виталий Панасенко (30.01.06 15:19) [25]
Не помогло...
> Digitman © (30.01.06 15:12) [24]
Она не под дос, но это не важно. Просто ты вместо того что бы ответить "как", пытался доказать что нужно подругому. По другому я умею.
← →
Barsky © (2006-01-30 16:02) [27]Где тут кнопочка "Закрыть обсуждение"?
← →
Digitman © (2006-01-30 16:11) [28]
> Она не под дос, но это не важно
Это ВАЖНО !
И еще как важно !
> Просто ты вместо того что бы ответить "как", пытался доказать
> что нужно подругому
Я тебе ничего не пытался доказать.
Каково было твое изложение сути проблемы - такова была и моя реакция.
Ты вот не удосужился привести аргументы в пользу "до него не дотянуться в конкретной задаче", а я вот не удосужился телепатировать.
Но прямое обращение к файлу при вполне возможном наличии готового платформенного решения - это решение, ведущее в тупик.
← →
mr.il © (2006-01-30 16:21) [29]Народ, человек хочет знать следующее:
Пусть есть таблица парадокс (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. Я прав?
← →
msguns © (2006-01-30 16:43) [30]>mr.il © (30.01.06 16:21) [29]
Человек по незнанию решил почесать левое ухо (Win-парадокс) правой пяткой (DOS).
Ему попытались объяснить, что дело не в ухе, и не в пятке. Что для доступа в стандартный формат БД правильно использовать соответствующие механизмы либо от разработчика того самого формата БД, либо от других фирм, грамотно написавших собственные механизмы доступа.
В ДОСЕ имеется куча средств для чтения таблиц парадокса (например, 4) или дибэйза, в винде конвертировать таблицу из 5(7,8,9) парадокса в 4-й или dBase проблему не составляет. Разработанная по этой схеме технология будет гарантированно работать на любых таблицах парадокса 5 и выше, причем в обе стороны.
Человек же хочет работать хакерским образом, решив сиюминутную задачу сиюминутнным же способом. При этом, когда люди куда грамотнее его советуют подойти к проблеме аналитически и системно, становится в позу и заявляет, что тут никто ничего не знает.
← →
Виталий Панасенко (2006-01-30 17:01) [31]
> 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;
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.012 c