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

Вниз

Чтение 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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.055 c
1-1140033478
Kot_
2006-02-15 22:57
2006.03.19
QReport в ран тайме


1-1140028531
Volf_555
2006-02-15 21:35
2006.03.19
Как вызвать стандартное контекстное меню для определ. типа файла?


15-1140931551
Frozzen
2006-02-26 08:25
2006.03.19
Вопрос про VBA и Word


2-1141159083
TStas
2006-02-28 23:38
2006.03.19
Как конвертировать файл из ОЕМ и обратно


3-1138614007
Barsky
2006-01-30 12:40
2006.03.19
Чтение Number из файла Paradox (*.db)