|  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, баг | 
|  | 
| 
 |