AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.09.2008, 17:18   #1  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
dateNull() и endMth()
Наступил на фичу и решил поделиться. Все мы знаем, что dateNull() = 01\01\1900. Но для меня было неочевидно, что с dateNull() великолепно работают функции endMth() и пр., возвращая 31\01\1900 и т.п. соответственно Долго же я ломал голову, когда в конструкции
X++:
TransDate myDate = MyTable::getPeriod();

;

if (!mydate)
myDate = systemDateGet()
у меня условие никогда не отрабатывало, хотя в отладчике я видел 0. А статический метод всего лишь возвращал endMth(MyTable.myField), и это MyField было пустое
Старый 04.09.2008, 19:36   #2  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,309 / 3546 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Хочется добавить, что ЛЮБЫЕ даты 1900-го года воспринимаются также как datenull().
Т.е.
X++:
    date d = 31\12\1900; 
    if (!d)
    {
        info("пусто!");
    }
И видимо поэтому функция endMth, которая принимает пустую дату - видит что это как бы не дата и возвращает попросту 0, хотя и типа date.
Но 0 видимо для типа date не является ложью (false) в выражении if (!date), поэтому система спокойно идет себе дальше....
__________________
Возможно сделать все. Вопрос времени
Старый 05.09.2008, 08:46   #3  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
И видимо поэтому функция endMth, которая принимает пустую дату - видит что это как бы не дата и возвращает попросту 0
В том-то и дело, что нет Функции работают с dateNull() как с обычными датами. Причем, что интересно, явное присвоение переменной любой даты из 1900-го года сбрасывает ее значение на 01\01\1900. А присвоение ей значения из того же диапазона с помощью встроенных функций работает как с любыми другими датами
X++:
    TransDate   testDate;

    ;

    testDate = 01\02\1900;          

    info(date2strXpp(testDate));    // 01\01\1900

    if (!testDate)
        info("Дата пустая");        //условие отрабатывает

    testDate = endMth(dateNull()) + 1;  

    info(date2strXpp(testDate));    // 01\02\1900

    if (!testDate)
        info("Дата пустая");        //условие не отрабатывает
Причем отладчик всегда бодро рапортует о нулевом значении переменной (на чем я, собственно, и подвис)

Последний раз редактировалось Yprit; 05.09.2008 в 08:47. Причина: добавил про отладчик
За это сообщение автора поблагодарили: alex55 (1), Vlad_ (1).
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:21.