Функция определения последнего рабочего дня
0 (0)
Функция определения последнего рабочего дня ( Andrew01 07.12.2017 11:30 )
5(1)Здравствуйте!
Интересует такая функция, в документации Интерфейсы языка RSL ничего подходящего не нашел.
Необходимо для отчета, не для расчета процентов. Система Rs-Bank.
подскажите, кто знает.
>> ОтветитьФункция определения последнего рабочего дня В МЕСЯЦЕ!!! ( Andrew01 07.12.2017 11:32 )
5(1)Not specified
>> ОтветитьПрям такой нет ( Евгений Гуцу 07.12.2017 11:48 )
5(1)Есть функция, которая определяет, рабочий день или нет - IsWorkday() (интер Календарь). Если запускать её в цикле, начиная с последнего дня месяца, то можно определить, какой день является последним рабочим. В принципе, могу сделать пример, если некогда самому писать.
>> ОтветитьIsWorkday() - считает субботы как рабочим днем,а у нас 5-ти дневка. ( Andrew01 07.12.2017 12:08 )
5(1)Если выпадет по циклу суббота, то это уже будет не верно.
>> ОтветитьБлагодарю за ответ. Пока сделаю, чтобы ставили вручную последний день месяца, но ... ( Andrew01 07.12.2017 12:12 )
5(1)вопрос актуален.
>> ОтветитьФункция берет данные из календаря ( Евгений Гуцу 07.12.2017 12:29 )
5(1)..если там специально делали субботу рабочим днем, то придётся это дополнительно обходить.
Какая у вас верси RS-Bank?
>> ОтветитьВерсия у нас 003.99 ( Andrew01 08.12.2017 10:00 )
5(1)думал, может есть функция определения даты последнего рабочего дня в месяце, как в системе Loans.
Вопрос конечно не критичный, но полезно это знать. Придется самим писать, как найду время.
Благодарю за ответы.
>> Ответить
Разве? ( tema 07.12.2017 12:32 )
5(1)Вроде все функции интера считают календарь так, как он размечен. Поставили среду красненькой он и её будет за выходной считать.
>> ОтветитьНет, функция тупо перебирает календарь (+) ( Александр 08.12.2017 09:57 )
5(1)как завели выходные и рабочие, так и покажет.
>> Ответить
Так пойдёт? ( 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 лет вперёд, и в Консультанте/Гаранте ещё нет и не может быть утверждённого правительством графика переноса околопраздничных дат. Так что мне кажется: данный пример к заданному топикстартером вопросу имеет очень мало отношения.
>> Ответитьда, есть такое. я делал календерь отдельный от системного - потому как у нас субботы открывались. и ( KaMPiLeR 19.12.2017 12:11 )
5(1)проценты ежемесячно нужно было считать, без гаданий когда чего.
единственное сейчас переписал на ооп - потому как каждый раз при вызове функции строился хеш ))
>> Ответить
Еще чисто для просто определения дня недели (+) ( Александр 20.12.2017 02:20 )
5(1)можно использовать конструкцию
dayofweek = mod(int(date(23,12,2017)),7);
возвращает порядковый номер дня недели (1 - Пнд и т.д.)
>> Ответить