Показать сообщение отдельно
Старый 09.07.2009, 09:46   #3  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от AndyD Посмотреть сообщение
В Excel дата 00.01.1900 соответствует значению 0 в типе дата, а в Ax - это 01.01.1900.
На деле обнаруживается, что функция date2num возвращает 0 для любой даты 1900 года - в том числе и для "ошибочной" 29\02\1900 и даже для даты-призрака 00\01\1900. И лишь 01\01\1901 сразу становится видно это расхождение в 2 дня: 365 - в Аксапте и 367 - в Excel.

Припоминаю похожее обсуждение на эту тему: dateNull() и endMth()

P.S. Хм... интересно, что Аксапта, похоже, проверяет литерал даты на корректность не как единую дату, а по отдельности - день, месяц, год. При этом дни считаются корректными в диапазоне от 1 до 31 для ЛЮБОГО (!) месяца. Поэтому становится возможным ввести дату 31 февраля 2009 года. При этом функция date2num возвращает целое значение для ближайшего предыдущего реально существующего дня, т.е. для 28.02.2009. И лишь 32-е февраля наконец-таки вызывает ошибку компиляции:

X++:
static void Job192(Args _args)
{
    ;
    info(strFmt('27 - %1', date2num(27\02\2009))); // 39869

    info(strFmt('28 - %1', date2num(28\02\2009))); // 39870
    info(strFmt('29 - %1', date2num(29\02\2009))); // 39870 -- несуществ.
    info(strFmt('30 - %1', date2num(30\02\2009))); // 39870 -- несуществ.
    info(strFmt('31 - %1', date2num(31\02\2009))); // 39870 -- несуществ.

    //info(strFmt('32 - %1', date2num(32\02\2009))); -- ошибка компиляции

    info(strFmt('01 - %1', date2num(01\03\2009))); // 39871
}
Ax 3.0 SP4

Последний раз редактировалось Gustav; 09.07.2009 в 10:09.