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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.07.2009, 15:57   #1  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
! form SysDateLookup - баг?
Axapta 3.0 SP5, Dynamics Ax 4.0 SP2 (application version: 4.0.2501.347)

Доброго времени суток.
При выборе дат вблизи 'пограничных' значений лет (1901, 2153-2154) обнаружились некоторые 'накладки' в реализации функционала формы SysDateLookup.

Сценарий тестирования: вводим в поле с типом EDT TransDate дату 31.12.2153, жмем кнопу вызовы lookup формы - кнопка перехода на следующий месяц недоступна (по сути календарь должен быть доступен до 31.12.2154), жмем PageDown (ArrowRight, ArrowDown) и преодолеваем это ограничение, наблюдаем корректные данные 2154 года, потом идут только названия месяцев 2155 года, далее пустые ячейки, и после этого по второму кругу календарь с начала времен (1901 года)

При просмотре кода некоторые фрагменты вызвали вопросы - в штатной lookup форме выбора дат SysDateLookup объявлены 2 текстовые константы допустимого диапазона дат:
Forms\SysDateLookup\ClassDeclaration:
X++:
	...
    #define.maxDate('31-12-2153')
    #define.minDate('01-01-1901')
    ...
и далее по тексту методов идет конвертация в даты через str2date() :
Forms\SysDateLookup\enableNextButton():
X++:
void enableNextButton()
{
    if (year(monthShown)    == year(str2date(#maxDate,123)) &&
        mthofyr(monthShown) == mthofyr(str2date(#maxDate,123)))
	...
}
Forms\SysDateLookup\enableNextButton():
X++:
void enablePrevButton()
{
    if (year(monthShown)    == year(str2date(#minDate,123)) &&
        mthofyr(monthShown) == mthofyr(str2date(#minDate,123)))
	...
}
Forms\SysDateLookup\drawMonth():
X++:
void drawMonth()
{
    ...
    for (w = 1; w <= 6; w++)
    {
        ...
        if (drawingDate >= str2date(#maxDate, 123))
        {
            daysTable.setRowLabel(w,num2str(1,2,0,0,0));
        }
        ...
    }
    ...
}

первое что напрашивается - явное объявление макро-констант с типом date и отказ от избыточных вызовов преобразований str2date().
второй момент - верхняя граница диапазона дат #maxDate задана не верно (31.12.2153): значение функции maxdate() = 31.12.2154
Forms\SysDateLookup\ClassDeclaration:
X++:
	...
    #define.maxDate(31\12\2154)
    #define.minDate(01\01\1901)
    ...
для предотвращения выхода за границы допустимого интервала дат при навигации по календарю можно добавить дополнительную проверку в метод nextMonth().
Forms\SysDateLookup\nextMonth():
X++:
void nextMonth(int keyPressed)
{
    boolean doUnlock    ;
    //  -->  fix SysDateLookup code
    boolean allowChange = ( keyPressed == #taskPageDown && buttonNextMonth.enabled() )  ||
                          ( keyPressed == #taskPageUp && buttonPrevMonth.enabled() ) ;
    ;

    if( !allowChange )
        return ;
    //  <--  fix SysDateLookup code
    doUnlock = element.lockWindowUpdate(true);
    ...
}
P.S. Сценарий тестировался на Axapta 3.0 SP5, Dynamics AX 4.0 SP2, но похоже что актуален и для Dynamics AX 2009 (объявление #define.maxDate('31-12-2153') присутствует).
Изображения
 
Старый 06.07.2009, 18:14   #2  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Ммм... Ax 3.0, SP3
Цитата:
значение функции maxdate() = 31.12.2154
а у меня фнкция dateMax() = 31.12.2153
X++:
info(strFmt('%1', dateMax()));
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 06.07.2009, 18:17   #3  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Спасибо, конечно.
Но не уверен, что даже есть смысл такой баг создавать, так как его не пофиксят.
Первый вопрос, который мне зададут: "А на кой ты до 2154 года пытаешься прийти?"

Так что сразу задам его Вам
Старый 06.07.2009, 19:52   #4  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Первый вопрос, который мне зададут: "А на кой ты до 2154 года пытаешься прийти?"
Так что сразу задам его Вам
Согласен, что наверное еще не скоро потребутеся вводить даты близкие к 2154 году
Недавно коллега знакомился с имеющейся литературой по Axapta 3.0 - "Axapta 3.0 Разработка бизнес-приложений" Еременко А., Шашков Р. На странице 70 в обзоре типа дата:
Цитата:
...
Область допустимых значений: [1\1\1901; 31\12\2154]
...
В рамках реализации тестового учебного примера и возник вопрос: почему при задекларированном интервале до 2154 года в форме SysDateLookup при переходе с декабря 2153 на январь 2154 года недоступна кнопка следующего месяца? При этом в поле с типом date можно ввести к примеру 01.02.2154 и форма открывается уже с данными февраля 2154 года.

Описанные в первом посте модификации проводились на Dynamics Ax 4.0 SP2 (application version: 4.0.2501.347), потом результаты частично портировали в Axapta 3.0.

P.S. На счет перехода от строковых макро-констант к датам в 3.0 возможно несколько поторопился с выводами, код из 4.0 переносили не в полном объеме - только метод nextMonth()
Тестовый job на 3.0 показал такие результаты по датам:

X++:
static void jbCheckTransDate(Args _args)
{
    ;

    info( strfmt( "year 2154 by str2date(): %1", str2date( '31-12-2154', 123 ) ) ) ;
    info( strfmt( "year 2154 by const: %1", 31\12\2154 ) ) ;

    info( strfmt( "datemax(): %1", datemax() ) ) ;
    info( strfmt( "year 2153 by const: %1", 31\12\2153 ) ) ;
    info( strfmt( "year 2153 + 1 day: %1", 31\12\2153 + 1 ) ) ;
    info( strfmt( "year 2153 + 1 month: %1", nextmth( 31\12\2153  ) ) ) ;
}
Результат:
Изображения
 
Старый 09.07.2009, 16:58   #5  
in.dc is offline
in.dc
Участник
 
29 / 53 (2) ++++
Регистрация: 09.04.2009
-> Навигация по годам в SysDateLookup
Dynamics AX 4.0 SP2

Доброго времени суток.
Выкладываю проект с небольшим тюнингом формы SysDateLookup: добавлена пара кнопок ([<<], [>>]) c возможностью перехода на предыдущий и следующий годы в календаре дат, с клавиатуры обрабатывается сочетание кнопок:
  • Ctrl + PageDown - следующий год
  • Ctrl + PageUp - предыдущий год
P.S. разместил в этой ветке, т.к. часть кода модифицирована по описанию из первого поста темы.
Модифицированная форма выглядит так:
Изображения
 
Вложения
Тип файла: zip SysDateLookup_YearNavigation.zip (5.7 Кб, 40 просмотров)
__________________
Dynamics AX 4.0 SP2
Старый 09.07.2009, 23:27   #6  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
"А на кой ты до 2154 года пытаешься прийти?"
смотреть в будущее не грех .
Изв. за офтоп, не удержался.
Теги
ax3.0, ax4.0, sysdatelookup, баг

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Khue Trinh: AX 2009 Quality Management - Quality Control Blog bot DAX Blogs 1 04.07.2008 16:01
dax-lessons: Problem when creating a dynamic form with ActiveX control & Solution :) Blog bot DAX Blogs 0 30.04.2008 16:05
casperkamal: Preventing a form getting added to "LastActivated Form" in Dynamics Ax Blog bot DAX Blogs 1 27.08.2007 23:17
Axapta Lessons: Trapping keystrokes in a Form Blog bot DAX Blogs 13 01.11.2006 18:16
Говорят вышел SP2 для Axapta 3. Кто нибуть что знает на эту тему? soin DAX: Прочие вопросы 10 13.10.2003 10:43

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

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

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