Форум » [x]Harbour » глюк в LUpdate()? » Ответить

глюк в LUpdate()?

gustow: Пользую HMG 1.6.63 (Harbour 1.1.0dev) (2009-02-25) Хотел банально узнать дату последней модификации базы - LUpdate() возвращает (вне зависимости от SET EPOCH) дату на 100 лет раньше (не 2009, а 1909) Для примера - кусок кода из DBFView (Григория) и скриншот результата (база, естественно, последний раз правилась в 2009-м): [pre2] DEFINE LABEL Label_33 ROW 66 COL 100 WIDTH 120 HEIGHT 21 VALUE DtoC( (aArea[nFocus])->( LupDate() ) ) VISIBLE .T. AUTOSIZE .F. END LABEL[/pre2] ...и имеем такое (в окне "Table Properties"): [pre2] Created: 15.04.1909 Modified: 15.04.2009 13:01:10[/pre2]

Ответов - 4

Pasha: Возможно, этот файл создан не харбором, в харборе я глюка не увидел Согласно спецификации xBase, 2-й байл заголовка - это год модификации - 1900, т.е. в диапазоне 1900 - 2155 Харбор формирует этот байт правильно: см. hb_dbfWriteDBHeader: pArea->dbfHeader.bYear = ( BYTE ) ( iYear - 1900 ); и считывает тоже правильно: case DBI_LASTUPDATE: hb_itemPutD( pItem, 1900 + pArea->dbfHeader.bYear, pArea->dbfHeader.bMonth, pArea->dbfHeader.bDay );

Pasha: Я посмотрел несколько программ, созданных с помощью vfp, delphi и clipper Там байт года после 2000 формируется по правилам: iYear - 2000 А в Харборе: iYear - 1900

gustow: База создана то ли в DBU, то ли в старом Foxpro... но это неважно - просто получается, что, не зная, в чем создана (или чем последний раз "трогалась") база, не имеем возможности получить верный результат из LUpdate(). Видимо, придется делать банально - что-то типа: [pre2] set date british set century on set epoch to 1905 ... d1:=BAZA->(LUpdate()) if year(d1)<1990 d1:=ctod( stuff( dtoc(d1), 7, 1, "2" ) ) endif[/pre2] или вообще ориентироваться (как там же - в DBFView, в строчке с "Modified:" - сделано) на дату файла, а не на дату в заголовке базы... небольшой лишний геморройчик - но что делать :)


Pasha: Проблема 2000 года :) однако



полная версия страницы