Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
2-1141639115
werr
2006-03-06 12:58
2006.03.19
В Delphi 6 перестально работать DefaultDrawColumnCell. Почему???


15-1140767820
vidiv
2006-02-24 10:57
2006.03.19
gigabyte GA-8ipe1000


2-1141654657
SMAC
2006-03-06 17:17
2006.03.19
IntTo...


2-1141404032
vadim1
2006-03-03 19:40
2006.03.19
TabOrders and TabStops


6-1134121432
Wiz@rd
2005-12-09 12:43
2006.03.19
WinInet & 404, 403, 301





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский