|
21.02.2007, 11:27 | #1 |
Участник
|
по датам
Как определить является ли текущий день: первым, вторым, третьим, четвертым или последним днем в месяце?
К примеру: сегодня 3-ая среда февраля |
|
21.02.2007, 11:35 | #2 |
Участник
|
напишите свою функцию
|
|
21.02.2007, 11:45 | #3 |
Участник
|
Она большая, проще пример написать.
X++: void clicked() { OutlookRepeat outlookRepeat; outlookTable outlookTableTab; int DayValue;//Прошло дней с первого запуска повторения int WeekOfMonth;//текущая неделя месяца int fullWeeks; transDate curDate; Void CreateNewRepeatWork() { OutlookTableTab.M_PercentComplete = 100; OutlookTableTab.M_CheckB = 1; OutlookTableTab.M_Status = 2; OutlookTableTab.M_DueDate = ToDay() - OutlookTable.M_Data; OutlookTableTab.M_DataComplete = ToDay(); //Убираем статус повторения у текущего outlookTableTab.M_Repeat = 0;//Повторение выключено outlookTableTab.write(); //Создаем новое outlookTableTab.M_Data = ToDay(); outlookTableTab.M_CheckB = 0; outlookTableTab.M_DueDate = 0; outlookTableTab.M_Status = 0; outlookTableTab.M_PercentComplete = 0; outlookTableTab.M_DataComplete = Str2Date('0',0); outlookTableTab.M_Filter = 1; outlookTableTab.M_Repeat = 1;//Повторение включено outlookTableTab.insert(); Select MaxOf(RecId) from outlookTableTab; OutlookRepeat.R_Workid = outlookTableTab.RecId;//изменяем ссылку на новое задание для повторения OutlookRepeat.R_DateEndRepeat = ToDay();//Записываем дату последнего повторения OutlookRepeat.write(); OutlookRepeat.update(); } ; curDate = SystemDateGet(); //curDate = mkDate(02, 04, 2007); fullWeeks = (dayOfMth(curDate) - dayOfWk(curDate) - dayOfWk(dateStartMth(curDate))) / 7; //full weeks can be negative ;) WeekOfMonth = fullWeeks + 2; // info(strFmt("Номер недели месяца - %1", WeekOfMonth)); //===================================================================================== outlookTableTab = outlookTable; if(outlookTableTab.M_Repeat == 0) { //break; return; } ttsBegin; while select forUpdate OutlookRepeat where OutlookRepeat.R_Workid == outlookTableTab.RecId { DayValue = ToDay() - OutlookRepeat.R_DateBegin; if(DayValue < 0) { ttsCommit; Return; } //------------------------------------------------------ //Если повторение просроченно, удаляем его настройки if(OutlookRepeat.R_LimRepeat == 2 && OutlookRepeat.R_DateEnd <= ToDay() ) { outlookRepeat.delete(); outlookTableTab.M_Repeat = 0;//Повторение выключено outlookTableTab.write(); ttsCommit; return; } if(OutlookRepeat.R_LimRepeat == 1 && OutlookRepeat.R_RepeatCountLim == OutlookRepeat.R_RepeatCount ) { outlookRepeat.delete(); outlookTableTab.M_Repeat = 0;//Повторение выключено outlookTableTab.write(); ttsCommit; return; } if(OutlookRepeat.R_DateEndRepeat == ToDay()) { //Если дата последнего повтора = текущей ttsCommit; return; } //------------------------------------------------------ switch(OutlookRepeat.R_Every) {//Повторения case OutlookRepeatEvery::EveryDay: {//Повторение по дням //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* switch(OutlookRepeat.R_RepeatEveryDWMY) {//тип повторения case 0: {//Каждый выбранный день if((DayValue mod OutlookRepeat.R_EveryIn == 0) ) {//Начинаем новое задание CreateNewRepeatWork(); } break; } case 1: {//Каждый рабочий день if(DayOfWk(ToDay())< 6) {//Начинаем новое задание CreateNewRepeatWork(); } break; } case 2: {//Через несколько дней после завершения if( (OutlookTableTab.M_CheckB == 1)&& (ToDay() - OutlookTableTab.M_DataComplete == OutlookRepeat.R_EveryIn) ) {//Начинаем новое задание CreateNewRepeatWork(); } break; } } break; } //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* case OutlookRepeatEvery::EveryWeek: {//Повторение неделя if(OutlookRepeat.R_RepeatEveryDWMY == 0) {//каждую указанную неделю в выбранные дни if( WeekOfMonth == OutlookRepeat.R_EveryIn ) { if( ((OutlookRepeat.R_DayW1 == NoYes::Yes)&&(DayOfWk(ToDay()) == 1))|| ((OutlookRepeat.R_DayW2 == NoYes::Yes)&&(DayOfWk(ToDay()) == 2))|| ((OutlookRepeat.R_DayW3 == NoYes::Yes)&&(DayOfWk(ToDay()) == 3))|| ((OutlookRepeat.R_DayW4 == NoYes::Yes)&&(DayOfWk(ToDay()) == 4))|| ((OutlookRepeat.R_DayW5 == NoYes::Yes)&&(DayOfWk(ToDay()) == 5))|| ((OutlookRepeat.R_DayW6 == NoYes::Yes)&&(DayOfWk(ToDay()) == 6))|| ((OutlookRepeat.R_DayW7 == NoYes::Yes)&&(DayOfWk(ToDay()) == 7)) ) { CreateNewRepeatWork(); } } } else {//через несколько недель после каждого завершения if( (OutlookTableTab.M_CheckB == 1)&& (dayofwk(OutlookTableTab.M_DataComplete) == dayofwk(ToDay()))&& (wkofyr(ToDay()) - wkofyr(OutlookTableTab.M_DataComplete) == OutlookRepeat.R_MonthInt) ) { CreateNewRepeatWork(); } } break; } //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* case OutlookRepeatEvery::EveryMonth: {//Повторение месяц switch(OutlookRepeat.R_RepeatEveryDWMY) {//тип повторения case 0: { //Указанного числа каждого заданного месяца if( OutlookRepeat.R_EveryIn == dayofmth(ToDay()) && (mthofyr(ToDay()) mod OutlookRepeat.R_MonthInt) == 0) { CreateNewRepeatWork(); } break; } case 1: //Пока не работает {//В указанный день каждого выбранного месяца if(mthofyr(ToDay()) mod OutlookRepeat.R_MonthInt == 0) { if(OutlookRepeat.R_Days + 1 == dayofwk(ToDay()) && OutlookRepeat.R_Days + 1 <= 7) { switch(OutlookRepeat.R_WeekOfMonth) {//Дни (первый -..- последний) case 0: { // if(WeekOfMonth == 1 && OutlookRepeat.R_Days + 1 == 1) } } } } //в указанный день недели /* if(OutlookRepeat.R_Days + 1 == dayofwk(ToDay())) { if(WeekOfMonth == 1 && OutlookRepeat.R_WeekOfMonth + 1 == 1) {//первая неделя CreateNewRepeatWork(); } if(WeekOfMonth == 2 && OutlookRepeat.R_WeekOfMonth + 1 >= 2) {//неделя(Вторая -..- четвертая) CreateNewRepeatWork(); } } && mthofyr(ToDay()) == OutlookRepeat.R_MonthInt) { //Отбор по недели (понедельник - воскресенье) if (OutlookRepeat.R_WeekOfMonth + 1 == 5 && WeekOfMonth >= 5) { CreateNewRepeatWork(); } if (OutlookRepeat.R_WeekOfMonth + 1 == WeekOfMonth && OutlookRepeat.R_WeekOfMonth != 4) { CreateNewRepeatWork(); } } if(OutlookRepeat.R_Days + 1 == 9 && dayofwk(ToDay()) < 6 && mthofyr(ToDay()) == OutlookRepeat.R_MonthInt) {//В рабочие дни (понедельник -..- пятница) CreateNewRepeatWork(); } if(OutlookRepeat.R_Days + 1 == 10 && dayofwk(ToDay()) > 5 && mthofyr(ToDay()) == OutlookRepeat.R_MonthInt) {//В выходные дни (суббота, воскресенье) CreateNewRepeatWork(); } if(OutlookRepeat.R_Days + 1 == 8 && mthofyr(ToDay()) == OutlookRepeat.R_MonthInt) {//Дни (первый -..- последний) switch(OutlookRepeat.R_WeekOfMonth) { case 0: { } case 1: { } case 2: { } case 3: { } case 4: { } } } */ break; } case 2: {//Через несколько месяцев после каждого завершения if( (OutlookTableTab.M_CheckB == 1)&& (dayofmth(OutlookTableTab.M_DataComplete) == dayofmth(ToDay()))&& (mthofyr(ToDay()) - mthofyr(OutlookTableTab.M_DataComplete) == OutlookRepeat.R_MonthInt) ) { CreateNewRepeatWork(); } } } break; } //-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* case OutlookRepeatEvery::EveryYear: {//Повторение год switch(OutlookRepeat.R_RepeatEveryDWMY) { case 0: { if(OutlookRepeat.R_EveryIn == dayofmth(ToDay()) && OutlookRepeat.R_MonthsOfYear == mthofyr(ToDay())) { CreateNewRepeatWork(); } } case 1: { } case 2: { } } break; } } OutlookTable = outlookTableTab; outlookTable_ds.executeQuery(); } ttsCommit; // OutlookRepeat.R_DateEndRepeat = ToDay();//Записываем дату последнего повторения // OutlookRepeat.write(); super(); } |
|
21.02.2007, 12:03 | #4 |
Участник
|
зачем же так много то кода в одной функции контрола формы, неправильно это
Последний раз редактировалось Косых Артём; 21.02.2007 в 12:35. |
|
21.02.2007, 12:04 | #5 |
Moderator
|
Цитата:
1. определить номер недели внутри месяца в этой "редакции" отсюда: Код: weekNo = trunc( (dayOfMth( today() )-1)/7 ) + 1; 3. совместить эти два результата, т.е. день недели, определенный в (2), будет в месяце по счету таким, какой номер недели получился в (1) |
|
21.02.2007, 12:06 | #6 |
Moderator
|
Цитата:
X++: static void testCalcDate(Args _args) { TransDate transDate = 20\01\2007; ; print weekofYear(transDate) mod 5; pause; } |
|
21.02.2007, 12:12 | #7 |
Участник
|
Я решил сделата так:
Смотрим текущий день и текущую неделю. Проверяем первую неделю месяца. Смотрим на какой день попадает первое число. Если текущий день не попал в первую неделю месяца, то: Текущий день это НОМЕР НЕДЕЛИ + 1 иначе НОМЕР НЕДЕЛИ |
|
21.02.2007, 12:24 | #8 |
Moderator
|
Цитата:
Код: static void Job54(Args _args) { container NthWeekdayInMonth (date _date = today () ) { return [trunc( (dayOfMth( _date )-1)/7 ) + 1, dayOfWk( _date )]; } ; info ( con2str ( NthWeekdayInMonth( 23\02\2007 ) )); } Т.е. 23 февраля 2007 года является 4-й пятницей месяца |
|
|
За это сообщение автора поблагодарили: mazzy (5), Косых Артём (1). |
21.02.2007, 12:34 | #9 |
Участник
|
Цитата:
Сообщение от Gustav
Зачем же так мучаться?
Код: static void Job54(Args _args) { container NthWeekdayInMonth (date _date = today () ) { return [trunc( (dayOfMth( _date )-1)/7 ) + 1, dayOfWk( _date )]; } ; info ( con2str ( NthWeekdayInMonth( 23\02\2007 ) )); } Т.е. 23 февраля 2007 года является 4-й пятницей месяца |
|
21.02.2007, 12:47 | #10 |
Участник
|
Не понял какую именно задачу вы решаете.
Но номер дня в неделе возвращает функция DayOfWk |
|
21.02.2007, 12:52 | #11 |
Moderator
|
|
|
21.02.2007, 13:00 | #12 |
Участник
|
Ага. Да, спасибо и мегареспектище.
К сожалению... |
|
21.02.2007, 12:45 | #13 |
Участник
|
Цитата:
Последний: today == dateEndMth(today) Номер дня в месяце: dateStartMth(today) // можно также today - dateStartMth(today) + 1 См. также DayOfYr, DayOfWk, WkOfYr, MthOfYr, Year |
|
21.02.2007, 12:52 | #14 |
Участник
|
Эту задачу уже решил Gustav
|
|
21.02.2007, 13:56 | #15 |
Участник
|
Еще вопрос к этой же теме..
Как узнать на какое число приходится последний день. Пример: 27,02,07 - последний вторник февраля |
|
21.02.2007, 14:07 | #16 |
Moderator
|
Цитата:
X++: static void testCalcDate(Args _args) { TransDate transDate = 20\01\2007; TransDate searchDate; Days day = 2; ; searchDate = dateEndMth(transDate); while(dayOfWk(searchDate) != day) { searchDate--; } print searchDate; pause; } |
|
21.02.2007, 14:30 | #17 |
Участник
|
DreamCreator
Не правильно спросил. Нужно узнать является ли сегодняшний день последним в неделе. В параметре указываем день(1-7), а результатом является Boolean(true - последний день или false) У тебя результат выдает по текущему дню последнюю дату такого дня |
|
21.02.2007, 14:43 | #18 |
Moderator
|
Цитата:
X++: static void testCalcDate(Args _args) { // Это параметр - дата относительно которой надо искать последний день // из этой даты используется только месяц TransDate transDate = 27\02\2007; // Это искомый последний день недели (понедельник - 1, вторник - 2, и т.д.) Days day = 2; // Это последний день (в зависимости от day, если day=1 то searchDate - понедельник) TransDate searchDate; ; // Последний день месяца searchDate = dateEndMth(transDate); while(dayOfWk(searchDate) != day) { searchDate--; } if(searchDate == transDate) print 'Today is last day'; else print 'Not last day'; pause; } |
|
21.02.2007, 14:49 | #19 |
Участник
|
А разве 7 день не является последним в неделе???
__________________
Рабочий день сокращает жизнь на 8 часов |
|
21.02.2007, 15:08 | #20 |
Moderator
|
Цитата:
Я, честно говоря, понял точно так же, как DreamCreator, и у меня такой же метод лечения геморроя, только безИтерационный: X++: static void Job55(Args _args) { date DateOfLastWeekdayInMonth (int _lastWeekday, date _date = today () ) { date eomDate = endMth( _date ); int eomWeekday = dayOfWk( eomDate ); return eomDate - (eomWeekday - _lastWeekday) - (eomWeekday < _lastWeekday ? 7 : 0); } ; info( strFmt('%1', DateOfLastWeekdayInMonth( 1 )) ); info( strFmt('%1', DateOfLastWeekdayInMonth( 2 )) ); info( strFmt('%1', DateOfLastWeekdayInMonth( 3 )) ); info( strFmt('%1', DateOfLastWeekdayInMonth( 4 )) ); info( strFmt('%1', DateOfLastWeekdayInMonth( 5 )) ); info( strFmt('%1', DateOfLastWeekdayInMonth( 6 )) ); info( strFmt('%1', DateOfLastWeekdayInMonth( 7 )) ); } 26.02.2007 27.02.2007 28.02.2007 22.02.2007 23.02.2007 24.02.2007 25.02.2007 |
|
|
За это сообщение автора поблагодарили: moid (1). |