Тема: по датам
Показать сообщение отдельно
Старый 21.02.2007, 11:45   #3  
moid is offline
moid
Участник
 
84 / 10 (1) +
Регистрация: 05.02.2007
Она большая, проще пример написать.

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();
}