AXForum  
Вернуться   AXForum > Блоги > Gustav'ово бложище, или Записки DAX-дилетанта-III
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

Стараюсь писать про Аксапту, хотя частенько тянет в Офис
Оценить эту запись

Цикл по сквозным годомесяцам

Запись от Gustav размещена 20.01.2010 в 13:00

Эта "новая" единица измерения времени - "годомесяц" = год*12+месяц - всем наверняка знакома. Сама по себе в абсолютном значении величина эта смысла не имеет, интересны лишь ее изменения в некотором диапазоне. Любопытно, что я поискал в репозитарии по строке "mthofyr" и в явном виде подобный цикл ни разу не увидел, хотя разницы "годомесяцев" местами используются, например, в функции GM_Global::mthDiff в приложении GMCS.

Мне этот цикл пригодился в задаче нахождения расхождений между записями LedgerTrans в одной компании и соответствующими (по трансляции) записями в другой компании. Поскольку записей за без квартала три года имелось уже очень приличное количество (несколько миллионов), а для выявления расхождений использовался метод difference класса Set, то чтобы не делать сравниваемые множества слишком большими, было решено идти по месяцам - на каждом шаге определялись даты начала и конца месяца, которые затем подставлялись в условие where (в джобе ниже - currFirstDay и currLastDay соответственно).

Получившийся шаблончик цикла мне понравился и я решил его зафиксировать, дабы при случае еще раз воспользоваться и более не копаться в календарных функциях. Шаблон эффективен только в том случае, если цикл затрагивает более одного года (внутри одного и того же года, понятное дело - всё гораздо проще).

Вот как выглядит этот помесячный цикл:
X++:
static void jobYearMonthLoop(Args _args)
{
    TransDate   dateBeg = 01\10\2006;
    TransDate   dateEnd = 30\06\2009;
    TransDate   currFirstDay, currLastDay;
    int         m, currYear, currMonth;
    ;
    for (m = year(dateBeg)*12+mthofyr(dateBeg);
         m<= year(dateEnd)*12+mthofyr(dateEnd);
         m++)
    {
        currMonth = m mod 12 ? m mod 12 : 12;
        currYear  = (m-currMonth) / 12;

        currFirstDay = mkDate(1,currMonth,currYear);
        currLastDay  = dateEndMth(currFirstDay);
        info(strFmt('%1 -- %2', currFirstDay, currLastDay));
    }
}
Ну, и до кучи - сама собой напрашивающаяся версия цикла для "годокварталов":
X++:
static void jobYearQuarterLoop(Args _args)
{
    TransDate   dateBeg = 01\10\2006;
    TransDate   dateEnd = 30\06\2009;
    TransDate   currFirstDay, currLastDay;
    int         q, currYear, currQtr;
    ;
    for (q = year(dateBeg)*4+date2qtr(dateBeg);
         q<= year(dateEnd)*4+date2qtr(dateEnd); 
         q++)
    {
        currQtr = q mod 4 ? q mod 4 : 4;
        currYear  = (q-currQtr) / 4;

        currFirstDay = mkDate(1,currQtr*3-2,currYear);
        currLastDay  = dateEndQtr(currFirstDay);
        info(strFmt('%1 -- %2', currFirstDay, currLastDay));
    }
}
Размещено в Без категории
Просмотров 50946 Комментарии 0
Всего комментариев 0

Комментарии

 


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