|
06.07.2009, 15:57 | #1 |
Участник
|
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') ... Forms\SysDateLookup\enableNextButton(): X++: void enableNextButton() { if (year(monthShown) == year(str2date(#maxDate,123)) && mthofyr(monthShown) == mthofyr(str2date(#maxDate,123))) ... } X++: void enablePrevButton() { if (year(monthShown) == year(str2date(#minDate,123)) && mthofyr(monthShown) == mthofyr(str2date(#minDate,123))) ... } 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) ... 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); ... } |
|
06.07.2009, 18:14 | #2 |
Ищущий знания...
|
Ммм... Ax 3.0, SP3
Цитата:
значение функции maxdate() = 31.12.2154
X++: info(strFmt('%1', dateMax()));
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
06.07.2009, 18:17 | #3 |
Участник
|
Спасибо, конечно.
Но не уверен, что даже есть смысл такой баг создавать, так как его не пофиксят. Первый вопрос, который мне зададут: "А на кой ты до 2154 года пытаешься прийти?" Так что сразу задам его Вам |
|
06.07.2009, 19:52 | #4 |
Участник
|
Цитата:
Недавно коллега знакомился с имеющейся литературой по Axapta 3.0 - "Axapta 3.0 Разработка бизнес-приложений" Еременко А., Шашков Р. На странице 70 в обзоре типа дата: Цитата:
...
Область допустимых значений: [1\1\1901; 31\12\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 |
Участник
|
Навигация по годам в SysDateLookup
Dynamics AX 4.0 SP2
Доброго времени суток. Выкладываю проект с небольшим тюнингом формы SysDateLookup: добавлена пара кнопок ([<<], [>>]) c возможностью перехода на предыдущий и следующий годы в календаре дат, с клавиатуры обрабатывается сочетание кнопок:
Модифицированная форма выглядит так:
__________________
Dynamics AX 4.0 SP2 |
|
09.07.2009, 23:27 | #6 |
MCTS
|
Цитата:
"А на кой ты до 2154 года пытаешься прийти?"
Изв. за офтоп, не удержался. |
|
Теги |
ax3.0, ax4.0, sysdatelookup, баг |
|
|