Она большая, проще пример написать.
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();
}