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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.10.2014, 16:11   #1  
Blog bot is offline
Blog bot
Участник
 
25,475 / 846 (79) +++++++
Регистрация: 28.10.2006
i-neti: Как, зная неделю года, рассчитать дату понедельника этой недели?
Источник: http://i-neti.ru/blog/231
==============

Решение:

X++:
static TransDate getMondayDateByWeek(Week _week)
{
    TransDate   transDate;
    TransDate   firstJanuary    = mkDate(1, 1, year(systemDateGet()));
    int         firstDayofWeek  = dayOfWk(firstJanuary);
    int         dayOfYear;
    ;
    if (_week == 1)
        return firstJanuary;

     dayOfYear = 7 - firstDayofWeek + 1 + (7 * (_week - 1)) - 7;

     transDate = dateStartYr(systemDateGet()) + dayOfYear;
    return transDate;
}


Источник: http://i-neti.ru/blog/231
__________________
Расскажите о новых и интересных блогах по Microsoft Dynamics, напишите личное сообщение администратору.

Последний раз редактировалось mazzy; 22.10.2014 в 06:34.
Старый 22.10.2014, 07:04   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
чет сложно как-то.

в global есть функции dateStartWeek, dateEndWeek.
лучше уж что-нибудь вроде

TransDate firstJanuary = mkDate(1, 1, year(systemDateGet()));
return dateStartWeek(firstJanuary + (_week * 7));

наверняка, можно сделать код еще короче и понятнее.

и уж точно не стоит использовать магию в стиле "7 + ... - 7"

Последний раз редактировалось mazzy; 22.10.2014 в 07:07.
За это сообщение автора поблагодарили: clerk (1).
Старый 22.10.2014, 07:56   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от mazzy Посмотреть сообщение
и уж точно не стоит использовать магию в стиле "7 + ... - 7"
Ага. Я пытался понять логику автора, но до конца у меня это не получилось. Видимо предполагалось вычислять то длинное выражение в несколько этапов:
(7 - firstDayofWeek + 1) это явно длина первой недели. Но дальше уже не все так прозрачно

Цитата:
Сообщение от mazzy Посмотреть сообщение
return dateStartWeek(firstJanuary + (_week * 7));
Нужно использовать week-1, если хотим нумеровать недели с единицы, а не с нуля.

И ещё я бы вынес год в параметры функции (можно по умолчанию сделать равным текущему).
За это сообщение автора поблагодарили: clerk (1).
Старый 22.10.2014, 11:23   #4  
skuull is offline
skuull
Участник
Most Valuable Professional
Лучший по профессии 2014
 
699 / 752 (27) +++++++
Регистрация: 08.03.2013
Адрес: ХЗ
Интересно у них 7 таких функций для каждого дня недели в этом году + 7 для прошлого или только "понедельник день тяжелый" ?
Старый 22.10.2014, 12:06   #5  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
А по какому стандарту вы ищите?)

Я так понимаю, что за первую берете неделю, содержащую 1 января
А у нас, в России), действует правило ISO 8601, где первая неделя - это неделя содержащая первый четверг нового года (или 4 января, как проще считать)

В общем, код коротким и понятным не получится)
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: gl00mie (2).
Старый 22.10.2014, 12:23   #6  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от AndyD Посмотреть сообщение
первая неделя - это неделя содержащая первый четверг нового года (или 4 января, как проще считать)
Интересно, а какова логика такого правила?
Если неделя большей своей частью принадлежит предыдущему году, то это на самом деле последняя прошлогодняя неделя? Тогда если последняя неделя может заканчиваться в новом году, то первая соответственно может начинаться в прошлом году. Так?
Старый 22.10.2014, 13:02   #7  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Если неделя большей своей частью принадлежит предыдущему году, то это на самом деле последняя прошлогодняя неделя?
Ага
Как пример, 2012-й год.
1 января приходится на воскресенье, соответственно, оно принадлежит 52 неделе 2011 года
А первая неделя начинается со 2 января
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Тогда если последняя неделя может заканчиваться в новом году, то первая соответственно может начинаться в прошлом году. Так?
Текущий год)
Первая неделя начинается с 30 декабря 2013 года
__________________
Axapta v.3.0 sp5 kr2
Старый 27.10.2014, 11:50   #8  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2476 (88) +++++++++
Регистрация: 20.08.2005
Кстати, аксаптовая функция wkOfYr() возвращает номер недели по ISO 8601
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: S.Kuskov (2).
Старый 27.10.2014, 18:58   #9  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Случайно наткнулся - есть похожая Статья

X++:
static date Week2Date(int yr, int week)
{
    int     weekJan1st;
    int     dayJan1st;
    date    tempDate;
    #TimeConstants
    ;
    weekJan1st = wkofyr(dateStartYr(str2Date(strFmt(%1-01-, yr), 321)));
    dayJan1st  = dayofwk(dateStartYr(str2Date(strFmt(%1-01-, yr), 321)));
    tempDate   = dateStartYr(str2Date(strFmt(%1-01-, yr), 321));
    switch(firstWeekOfYear())
    {
        case 0: // Starts on Jan 1
            tempDate -= (dayOfWk(tempDate)  1);
            tempDate += (week  1 ) * 7;
            break;
        case 1: // First full week
            //
            // If 1st Jan is a monday wkofyr gives correct result
            // If 1st Jan is a tuesday-thursday wkofyr gives one too much,
            // as this 4/5/6 day week is given it’s own week number.
            //
            if (dayJan1st != 1)
                tempDate += (8  dayJan1st);
            tempDate += (week  1) * 7;
            break;
        case 2: // First 4-day week
            if (mthofyr(tempDate) == 1 && weekOfYear(tempDate) > 50)
                tempDate += week * 7;
            else
                tempDate += (week  1) * 7;
            tempDate -= (dayofwk(tempDate)  1);
            break;
    }
    return tempDate;
}
__________________
AXIOMA

Последний раз редактировалось kornix; 27.10.2014 в 20:27.
Старый 28.10.2014, 01:20   #10  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Очень актуально! Кто-нибудь подскажет, как модифицировать код, чтобы получить по номеру недели не дату понедельника, а дату среды? Ничего не получается...
За это сообщение автора поблагодарили: kornix (1).
Старый 28.10.2014, 07:30   #11  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Про firstWeekOfYear()
AX 2012 R2: как сменить первый день в календаре?
Старый 28.10.2014, 09:27   #12  
miklenew is offline
miklenew
Участник
Аватар для miklenew
MCBMSS
1C
Лучший по профессии 2009
 
1,688 / 433 (18) +++++++
Регистрация: 10.07.2006
Адрес: г. Ликино-Дулёво
Цитата:
Сообщение от EVGL Посмотреть сообщение
Очень актуально! Кто-нибудь подскажет, как модифицировать код, чтобы получить по номеру недели не дату понедельника, а дату среды? Ничего не получается...
НачалоНедели(НачалоГода(ТекущаяДата()) +7*60*60*24*количествоНедель) + 60*60*24*3
__________________
Энергия молодых и неравнодушных способна изменить мир к лучшему.
Старый 28.10.2014, 09:44   #13  
kornix is offline
kornix
MCP
MCBMSS
Злыдни
Ex AND Project
 
414 / 146 (5) +++++
Регистрация: 24.02.2009
Адрес: Санкт-Петербург
Цитата:
Сообщение от EVGL Посмотреть сообщение
Очень актуально! Кто-нибудь подскажет, как модифицировать код, чтобы получить по номеру недели не дату понедельника, а дату среды? Ничего не получается...
К понедельнику (который научились определять) нужно добавить 2 дня по календарю - будет среда )
__________________
AXIOMA
Старый 28.10.2014, 15:40   #14  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
i-neti: 5 примеров аутсорсинга от компании Neti. Или что аутсорсят те, кто работают на аутсорсе Blog bot Полезное по Microsoft Dynamics 0 10.09.2014 12:11
i-neti: Dynamics AX 2012 R3 - ожидаемая дата выпуска 1 мая 2014 Blog bot DAX Blogs 0 23.03.2014 19:12
Как высести дату- только день и месяц (без года)? Alexey-IT Dynamics CRM: Функционал 8 13.11.2007 15:37
Вычисление номера недели года от даты BVN DAX: Программирование 2 08.04.2005 15:07

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 16:20.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.