AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.02.2007, 11:27   #1  
moid is offline
moid
Участник
 
84 / 10 (1) +
Регистрация: 05.02.2007
по датам
Как определить является ли текущий день: первым, вторым, третьим, четвертым или последним днем в месяце?

К примеру: сегодня 3-ая среда февраля
Старый 21.02.2007, 11:35   #2  
Косых Артём is offline
Косых Артём
Участник
Axapta Retail User
 
123 / 77 (3) ++++
Регистрация: 03.09.2004
Адрес: Москва
напишите свою функцию
Старый 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();
}
Старый 21.02.2007, 12:03   #4  
Косых Артём is offline
Косых Артём
Участник
Axapta Retail User
 
123 / 77 (3) ++++
Регистрация: 03.09.2004
Адрес: Москва
зачем же так много то кода в одной функции контрола формы, неправильно это

Последний раз редактировалось Косых Артём; 21.02.2007 в 12:35.
Старый 21.02.2007, 12:04   #5  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от moid Посмотреть сообщение
Как определить является ли текущий день: первым, вторым, третьим, четвертым или последним днем в месяце?

К примеру: сегодня 3-ая среда февраля
IMHO нужно:
1. определить номер недели внутри месяца в этой "редакции" отсюда:
Код:
weekNo = trunc( (dayOfMth( today() )-1)/7 ) + 1;
2. определить день недели функцией dayOfWk
3. совместить эти два результата, т.е. день недели, определенный в (2), будет в месяце по счету таким, какой номер недели получился в (1)
Старый 21.02.2007, 12:06   #6  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Цитата:
Сообщение от moid Посмотреть сообщение
Как определить является ли текущий день: первым, вторым, третьим, четвертым или последним днем в месяце?

К примеру: сегодня 3-ая среда февраля
Если я правильно понял вопрос, и исходя из того что в ближашие три года в каждом месяце 5 недель, то номер недели в месяце можно получить так:
X++:
static void testCalcDate(Args _args)
{
    TransDate   transDate = 20\01\2007;
    ;
    print weekofYear(transDate) mod 5;
    pause;
}
А за три года придумать абсолютно правильное решение )
Старый 21.02.2007, 12:12   #7  
moid is offline
moid
Участник
 
84 / 10 (1) +
Регистрация: 05.02.2007
Я решил сделата так:

Смотрим текущий день и текущую неделю.
Проверяем первую неделю месяца. Смотрим на какой день попадает первое число.
Если текущий день не попал в первую неделю месяца, то:
Текущий день это НОМЕР НЕДЕЛИ + 1 иначе НОМЕР НЕДЕЛИ
Старый 21.02.2007, 12:24   #8  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от moid Посмотреть сообщение
Я решил сделата так:

Смотрим текущий день и текущую неделю.
Проверяем первую неделю месяца. Смотрим на какой день попадает первое число.
Если текущий день не попал в первую неделю месяца, то:
Текущий день это НОМЕР НЕДЕЛИ + 1 иначе НОМЕР НЕДЕЛИ
Зачем же так мучаться?
Код:
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 ) ));
}
Результат: 4, 5.
Т.е. 23 февраля 2007 года является 4-й пятницей месяца
За это сообщение автора поблагодарили: mazzy (5), Косых Артём (1).
Старый 21.02.2007, 12:34   #9  
Косых Артём is offline
Косых Артём
Участник
Axapta Retail User
 
123 / 77 (3) ++++
Регистрация: 03.09.2004
Адрес: Москва
Цитата:
Сообщение от 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 ) ));
}
Результат: 4, 5.
Т.е. 23 февраля 2007 года является 4-й пятницей месяца
самое простое и красивое решение
Старый 21.02.2007, 12:45   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от moid Посмотреть сообщение
Как определить является ли текущий день: первым, вторым, третьим, четвертым или последним днем в месяце?

К примеру: сегодня 3-ая среда февраля
Первый: today == dateStartMth(today)
Последний: today == dateEndMth(today)
Номер дня в месяце: dateStartMth(today) // можно также today - dateStartMth(today) + 1

См. также DayOfYr, DayOfWk, WkOfYr, MthOfYr, Year
__________________
полезное на axForum, github, vk, coub.
Старый 21.02.2007, 12:47   #11  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Gustav Посмотреть сообщение
Зачем же так мучаться?
Не понял какую именно задачу вы решаете.
Но номер дня в неделе возвращает функция DayOfWk
__________________
полезное на axForum, github, vk, coub.
Старый 21.02.2007, 12:52   #12  
moid is offline
moid
Участник
 
84 / 10 (1) +
Регистрация: 05.02.2007
Эту задачу уже решил Gustav
Старый 21.02.2007, 12:52   #13  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от mazzy Посмотреть сообщение
Не понял какую именно задачу вы решаете.
Но номер дня в неделе возвращает функция DayOfWk
mazzy... 23-е еще только через два дня...
Старый 21.02.2007, 13:00   #14  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от moid Посмотреть сообщение
Эту задачу уже решил Gustav
Ага. Да, спасибо и мегареспектище.

Цитата:
Сообщение от Gustav Посмотреть сообщение
mazzy... 23-е еще только через два дня...
К сожалению...
__________________
полезное на axForum, github, vk, coub.
Старый 21.02.2007, 13:56   #15  
moid is offline
moid
Участник
 
84 / 10 (1) +
Регистрация: 05.02.2007
Еще вопрос к этой же теме..

Как узнать на какое число приходится последний день.

Пример: 27,02,07 - последний вторник февраля
Старый 21.02.2007, 14:07   #16  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Post
Цитата:
Сообщение от moid Посмотреть сообщение
Еще вопрос к этой же теме..

Как узнать на какое число приходится последний день.

Пример: 27,02,07 - последний вторник февраля
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  
moid is offline
moid
Участник
 
84 / 10 (1) +
Регистрация: 05.02.2007
DreamCreator
Не правильно спросил. Нужно узнать является ли сегодняшний день последним в неделе. В параметре указываем день(1-7), а результатом является Boolean(true - последний день или false)
У тебя результат выдает по текущему дню последнюю дату такого дня
Старый 21.02.2007, 14:43   #18  
DreamCreator is offline
DreamCreator
Moderator
Аватар для DreamCreator
Axapta Retail User
 
553 / 45 (3) +++
Регистрация: 04.11.2004
Адрес: Казань
Цитата:
Сообщение от moid Посмотреть сообщение
DreamCreator
Не правильно спросил. Нужно узнать является ли сегодняшний день последним в неделе. В параметре указываем день(1-7), а результатом является Boolean(true - последний день или false)
У тебя результат выдает по текущему дню последнюю дату такого дня
Наверно снова неправильно понял
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:48   #19  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
boolean f ()
{
return (dayOfwk(systemdateget()) == 7)
}
а параметр то зачем?
Старый 21.02.2007, 14:49   #20  
Himan is offline
Himan
Участник
Аватар для Himan
 
312 / 12 (1) ++
Регистрация: 07.11.2006
Адрес: Tumen
Цитата:
Сообщение от moid Посмотреть сообщение
DreamCreator
Нужно узнать является ли сегодняшний день последним в неделе. В параметре указываем день(1-7), а результатом является Boolean(true - последний день или false)
У тебя результат выдает по текущему дню последнюю дату такого дня
А разве 7 день не является последним в неделе???
__________________
Рабочий день сокращает жизнь на 8 часов
Теги
дата

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Подробный отчет по датам к оплате ax_f DAX: Функционал 3 15.11.2004 17:10

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 06:53.