Функция определения последнего рабочего дня

0 (0)
  • Развернуть Функция определения последнего рабочего дня ( Andrew01  07.12.2017 11:30 )
    5(1)
    Здравствуйте!
    Интересует такая функция, в документации Интерфейсы языка RSL ничего подходящего не нашел.
    Необходимо для отчета, не для расчета процентов. Система Rs-Bank.
    подскажите, кто знает.
    >> Ответить
    • Развернуть Функция определения последнего рабочего дня В МЕСЯЦЕ!!! ( Andrew01  07.12.2017 11:32 )
      5(1)
      Not specified
      >> Ответить
    • Развернуть Так пойдёт? ( Avantage  11.12.2017 14:37 )
      5(1)
      macro LastDayInMon(_mon, _year)
      var _RetDate:date, _iDat:integer, _wday;
        if (_mon == 12)
          _RetDate = date(31,12,_year);
        else
          _RetDate = date(1,_mon+1,_year)-1;
        end;
        _iDat = _retDate;
        _wday = Mod(_iDat-1,7);
        while (_wDay > 4)
          _retDate = _retdate-1;
          _iDat = _retDate;
          _wday = Mod(_iDat-1,7);
        end;
        return _retDate;
      end;
      
      //Для проверки
      var __yy, __mm;
      
        for (__yy, 2016,2020,1)
          for(__mm,1,12,1)
            PrintLN(__yy:4, "-",__mm:2:r:o, " : ",LastdayInMon(__mm, __yy));
          end;
        end;
      

      >> Ответить
      • Развернуть Считает на любую дату вперед-назад, независимо от заполнения календаря. НО... ( Avantage  11.12.2017 14:42 )
        5(1)
        Хорошо бы ещё дополнить логикой, когда последний день апреля или декабря попадает на понедельник - он со 100% гарантией будет перенесен на предыдущую субботу (28 апреля или 29 декабря), как собственно и будет с 30 апреля 2018 года.
        >> Ответить
        • Развернуть Для учета переносов дат надо ( Avantage  11.12.2017 15:02 )
          5(1)
          Для учета таких переносов вполне достаточно перед

            return _retDate;
          

          вставить

            if  (((_mon == 4) or (_mon==12)) and (_wday == 0))
              _retDate = _retDate - 2;
            end;
          

          >> Ответить
          • Развернуть Большое вам человеческое спасибо, работает как надо ( Andrew01  12.12.2017 09:06 )
            5(1)
            мне даты никуда переносить не нужно, мне для отчета, чтобы показывал последний рабочий день, т.к. по договору с поставщиком услуг, для сверки наших платежей, формируется в последний рабочий день месяца и должно быть отражение этой даты в отчете.
            >> Ответить
            • Развернуть Ну так Вам как раз и нужно, чтобы переносило ( Avantage  12.12.2017 11:45 )
              5(1)
              Для проверки - посмотрите, какую последнюю рабочую дату макрос будет выдавать в апреле и в декабре 2018 года (со вставкой и без неё), и сравните с производственным календарем на 2018 год. Уверен - бухгалтерия скажет, что вставка нужна обязательно.
              >> Ответить
              • Развернуть Возможно, есть компромиссный вариант ( Евгений Гуцу  12.12.2017 13:36 )
                5(1)
                Очевидно, что придётся делать ветвление, т.к. как раз на эти последние календарные дни месяцев планируется перенос выходных.
                Но не лучше ли было бы всё-таки использовать календарные функции, просто дополнительно делать проверку на то, чтобы последний день не попадал на субботу, раз уж у них в календаре она отмечена как рабочий день. Это позволило бы обойтись без хард-кода.
                >> Ответить
    • Развернуть гляньте пример мой - https://isupport.softlab.ru/portal/Samples/sample.asp?ID=336 ( KaMPiLeR  17.12.2017 21:43 )
      5(1)
      https://isupport.softlab.ru/portal/Samples/sample.asp?ID=336

      считает сб и вс выходными, + ведется список - сб и вс рабочие и будни выходные.

      >> Ответить
      • Развернуть Мне кажется, для данной задачи этот пример избыточен. ( Avantage  18.12.2017 08:32 )
        5(1)
        Если разработка идёт для российского банка, и требуется именно искать последний рабочий день месяца, чтобы впихнуть его в договор, или тот же график будущих выплат процентов по ипотеке, то вообще нет необходимости смотреть на официальные праздники, поскольку попадающих на конец месяца праздников у нас в настояший момент времени нет. Так что достаточно просто определять последний день месяца, не попадающий на выходные. А вот если в следующем месяце 1-е число - праздник (а таких два: первомай и Новый Год), а последний день расчетного месяца - понедельник, то к гадалке не ходи: он будет присоединен к празднику, а предыдущую субботу сделают выходной. Даже, если этот месяц отстоит от текущей даты на 5-10-15-20 лет вперёд, и в Консультанте/Гаранте ещё нет и не может быть утверждённого правительством графика переноса околопраздничных дат. Так что мне кажется: данный пример к заданному топикстартером вопросу имеет очень мало отношения.
        >> Ответить
    • Развернуть Еще чисто для просто определения дня недели (+) ( Александр  20.12.2017 02:20 )
      5(1)
      можно использовать конструкцию
        dayofweek = mod(int(date(23,12,2017)),7);
      

      возвращает порядковый номер дня недели (1 - Пнд и т.д.)

      >> Ответить