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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.01.2009, 17:11   #1  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Gustav Посмотреть сообщение
Никто и не предлагает этим заниматься.
Ок. Я неправильно выразился.
Получать число месяцев из функции, которая тратит время и на расчет числа дней...
Это тоже изврат. Хотя и не такой, как расчет через цикл.

Что касается расчета месяцев...
Там предлагается:
X++:
ms = ( year(dtEnd) * 12 + mthOfYr(dtEnd) )
   - ( year(dtBeg) * 12 + mthOfYr(dtBeg) ); // предварительная разница в месяцах
Мне кажется, что мой код будет выполняться чуть быстрее, поскольку умножение выполняется только один раз.

Другое дело, что там учитываются полные месяцы.
Т.е. тот алгоритм выдаст 0 полных месяцев для дат 21.01.09, 18.08.09 (день месяца даты начала больше дня месяца даты окончания), а мой алгоритм выдаст 1 месяц.

Но если надо учитывать полные месяцы, то опять же лучше избегать вычисления разницы между датами. сделать так:
X++:
{
   Date dateFrom = 01\06\1995;
   Date dateTo = 01\04\2008;
   int years = year(dateTo) - year(dateFrom);
   int month = mthofyr(DateTo) - mthofYr(dateFrom);
   int month_correction = dayofmth(DateFrom) > dayofmth(DateTo) ? sign(DateFrom - DateTo) : 0;

   return ((years * 12) + month + month_correction;
}
__________________
полезное на axForum, github, vk, coub.
Старый 06.01.2009, 17:24   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от mazzy Посмотреть сообщение

Но если надо учитывать полные месяцы, то опять же лучше избегать вычисления разницы между датами. сделать так:
X++:
{
   Date dateFrom = 01\06\1995;
   Date dateTo = 01\04\2008;
   int years = year(dateTo) - year(dateFrom);
   int month = mthofyr(DateTo) - mthofYr(dateFrom);
   int month_correction = dayofmth(DateFrom) > dayofmth(DateTo) ? sign(DateFrom - DateTo) : 0;

   return ((years * 12) + month + month_correction;
}
А блин... В Аксапте sign какой-то странный. Он выдает только два значения +1 или -1. Правильный код с учетом этой багофичи:

X++:
{
   Date dateFrom = 01\06\1995;
   Date dateTo = 01\04\2008;
   int years = year(dateTo) - year(dateFrom);
   int month = mthofyr(DateTo) - mthofYr(dateFrom);
   int month_correction = (DateFrom == DateTo) ? 0 : (dayofmth(DateFrom) > dayofmth(DateTo) ? sign(DateFrom - DateTo) : 0);

   return ((years * 12) + month + month_correction;
}
__________________
полезное на axForum, github, vk, coub.
Старый 06.01.2009, 17:27   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от mazzy Посмотреть сообщение
А блин... В Аксапте sign какой-то странный. Он выдает только два значения +1 или -1. Правильный код с учетом этой багофичи:

X++:
{
   Date dateFrom = 01\06\1995;
   Date dateTo = 01\04\2008;
   int years = year(dateTo) - year(dateFrom);
   int month = mthofyr(DateTo) - mthofYr(dateFrom);
   int month_correction = (DateFrom == DateTo) ? 0 : (dayofmth(DateFrom) > dayofmth(DateTo) ? sign(DateFrom - DateTo) : 0);

   return ((years * 12) + month + month_correction;
}
а вот с оптимизацией производительности

X++:
{
   Date dateFrom = 01\06\1995;
   Date dateTo = 01\04\2008;
   int years;
   int month;
   int month_correction;

   if(DateFrom == DateTo)
      return 0;

   years = year(dateTo) - year(dateFrom);
   month = mthofyr(DateTo) - mthofYr(dateFrom);
   month_correction = dayofmth(DateFrom) > dayofmth(DateTo) ? sign(DateFrom - DateTo) : 0;

   return ((years * 12) + month + month_correction;
}
__________________
полезное на axForum, github, vk, coub.
Теги
дата

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Странное количество в строке журнала инвентаризации pitersky DAX: Функционал 7 16.01.2009 16:46
как отдельно учитывать фактическое и финансовое количество? romulis DAX: Функционал 4 08.02.2007 15:01
Количество знаков после запятой для количества в Закупке. dimit DAX: Функционал 18 20.11.2006 17:23
Функция возвращающая количество месяцев нужна, никто не видел?.. MironovI DAX: Программирование 3 29.09.2005 12:05
Закупка. Количество введенное в таблицу PurchLine не отображается в накладной ATimTim DAX: Программирование 15 21.06.2004 10:11
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

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