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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.01.2009, 16:54   #1  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от mazzy Посмотреть сообщение
Поэтому вычислять число месяцев через число дней... Это тоже изврат...
Никто и не предлагает этим заниматься. Для получения полного количества месяцев надо умножить полное кол-во лет (элемент 1 контейнера) на 12 и добавить месяцы неполного года (элемент 2).

Я просто выдаю все те величины, которые, как правило, не могут быть получены тривиальным путем, оставляя выбор пользователю функции выполнять заключительные тривиальные действия. Например, для получения общего количества недель срока надо всего лишь общее кол-во дней (элемент 6) разделить на 7. И т.п.
Цитата:
Сообщение от mazzy Посмотреть сообщение
Кроме того, и этот класс не работает, если дата начала больше даты конца.
Вот! А функцайка работает, возвращая отрицательные значения
Старый 06.01.2009, 17:11   #2  
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   #3  
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   #4  
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, время: 18:55.