![]() |
#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(); } |
|