![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Декодирование сжатого формата даты ?!?!? [D6, dBase, FoxPro]
firefox © (2003-06-25 12:41:00)У меня следующая проблема... Некая фирма поставила ПО под ДОС на Clipper-е... использует dbf... но не совсем обычно.... все данные представляющие дату преобразуються к типу Character длинною 2 символа.... мне же из программы на ObjPascal (D6) необходимо читать эти даты... запросил у конторы алгоритм декодирования:
Для "распаковки" дат "упакованного" формата из наших файлов необходимо воспользоваться следующим алгоритмом:
1. строка представляющая упакованную дату приводится к переменной типа WORD.
(через указатель на память и приведение типов)
2. в полученном числе байты переставляются местами.
3. данное число есть число дней от 01/01/1900 года. Т.е. к 01/01/1900
прибавляется полученное число и на выходе получаете распакованную дату.
Не совсем понимаю что имелось ввиду в п.1... может кто сталкивался или кого нить озарит... Спасибо.
sniknik (2003-06-25 14:54:00) [1]HSolo © (25.06.03 14:34)
наверное подойдет, надо посмотреть только как он возвращает, и наверное удобнее использовать DbiGetField.
сам я Halcyon использую, с BDE почти не сталкиваюсь, поэтому всех возможностей не знаю. но если он действительно так работает как предполагаем (as is), то все, проблем нет.
HSolo (2003-06-25 14:34:00) [2]А зачем искать-то? Есть же BDE с его API
DbiGetRecord и иже с ним
sniknik (2003-06-25 13:04:00) [3]судя по всему подложили тебе больщую свинью... ;о)
не их с алгоритмом все понятно, но в вариантах где дата одним байтом совпадет по значению #32, #0 не получиш истинную дату строка обрежется или ее совсем не будет (первый байт). также проблема будет если используеш Langdriver, фактически нельзя его использовать :(. т.е. даты будут или пропадать или совсем другие. решения в зависимости от движка базы может и не быть вовсе.
что до алгоритма то он довольно прост
var st: string[2];
wd: word absolute st[1];
GodData: TDateTime;
begin
st:= FieldByname("BadData").AsString;
GodData:= StrToDate(01/01/1900)+wd;
примерно так, не учитывая ограничений и всей остальной пое%№ни. сочуствую.
p.s. найди компонент (или сам пиши), который может давать значения полей as is, без этого все бессмысленно.
firefox (2003-06-25 13:03:00) [4]Хорошо.... для тупых (меня) каким образом выполняеться п.1.. (в примере можно? а то у меня фигня получаеться.... :()
и нафига разменивать байты?
Johnmen (2003-06-25 12:58:00) [5]А что тут не понять ? Не строка это, а последовательность из 2-ух байтов, то есть word.
Про упаковку дат таким образом было описано еще в доках по TurboPascal