Стараюсь писать про Аксапту, хотя частенько тянет в Офис
Цикл по сквозным годомесяцам
Запись от Gustav размещена 20.01.2010 в 13:00
Теги x++, функции даты, цикл
Эта "новая" единица измерения времени - "годомесяц" = год*12+месяц - всем наверняка знакома. Сама по себе в абсолютном значении величина эта смысла не имеет, интересны лишь ее изменения в некотором диапазоне. Любопытно, что я поискал в репозитарии по строке "mthofyr" и в явном виде подобный цикл ни разу не увидел, хотя разницы "годомесяцев" местами используются, например, в функции GM_Global::mthDiff в приложении GMCS.
Мне этот цикл пригодился в задаче нахождения расхождений между записями LedgerTrans в одной компании и соответствующими (по трансляции) записями в другой компании. Поскольку записей за без квартала три года имелось уже очень приличное количество (несколько миллионов), а для выявления расхождений использовался метод difference класса Set, то чтобы не делать сравниваемые множества слишком большими, было решено идти по месяцам - на каждом шаге определялись даты начала и конца месяца, которые затем подставлялись в условие where (в джобе ниже - currFirstDay и currLastDay соответственно).
Получившийся шаблончик цикла мне понравился и я решил его зафиксировать, дабы при случае еще раз воспользоваться и более не копаться в календарных функциях. Шаблон эффективен только в том случае, если цикл затрагивает более одного года (внутри одного и того же года, понятное дело - всё гораздо проще).
Вот как выглядит этот помесячный цикл:
Ну, и до кучи - сама собой напрашивающаяся версия цикла для "годокварталов":
Мне этот цикл пригодился в задаче нахождения расхождений между записями 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)); } }
Всего комментариев 0