Здравствуйте.
Вопрос связан с ф-цией CalcDaysBetweenDates – кол-во дней между двумя датами.
Из документации:
Описание
function CalcDaysBetweenDates(aDateFrom, aDateTo: date; aMinusNonWorkDays: boolean): longInt;
Параметры
aDateFrom — нижняя граница диапазона дат.
aDateTo — верхняя граница диапазона дат.
aMinusNonWorkDays — признак, исключающий из диапазона дат нерабочие дни (true — исключать, false — не исключать).
Ранее использовала с 3-им параметром в False. Сейчас нужно в True, т. е. исключать нерабочие дни. Насколько я понимаю, нерабочие дни по справочнику праздничных дней.
Получила следующее:
CalcDaysBetweenDates( Date( 01, 01, 2021 ), Date( 14, 01, 2021 ), True ) = 10
В справочнике праздничных дней праздники в частности 01.01.2021, 02.01.2021, 07.01.2021.
Я полагала, что ф-ция должна была вернуть 14 (календарных дней)-3 (праздничных дней)=11. Почему же получила 10?
Ф-ция CalcDaysBetweenDates
Модераторы: m0p3e, edward_K, Модераторы
-
- Местный житель
- Сообщения: 554
- Зарегистрирован: 17 июл 2012, 11:56
- Откуда: Республика Беларусь, г.Могилев
Re: Ф-ция CalcDaysBetweenDates
Отвечу сама себе. Похоже, что нерабочие дни для ф-ции имеются ввиду суббота и воскресенье. Если из диапазона дат выбрасывать именно их, то получаю 10.
Re: Ф-ция CalcDaysBetweenDates
Все верно. Для нее нерабочие это конкретно суббота и воскресенье.
Когда-то писал для себя такую функцию.
Когда-то писал для себя такую функцию.
Код: Выделить всё
//Возвращает количество рабочих дней между двумя датами
Public Function CalcWorkDaysBetweenDates ( dBeg, dEnd : date ) : Integer;
{
Result := CalcDaysBetweenDates ( dBeg, dEnd, true );
_loop Prazd Where (( dBeg <<= Prazd.dDate
and dEnd >>= Prazd.dDate
))
{
Case SubStr ( Prazd.Name, 1, 1 ) Of
'+' : Result++; //выходной стал рабочим
'-' : Result--; //рабочий стал выходным
else If Day_Of_Week ( Prazd.dDate ) < 6 //праздник выпал на рабочий день
Result--;
End;
}; //loop Praznd
}; //Function CalcDaysBetweenDatesNoPrazd
-
- Местный житель
- Сообщения: 554
- Зарегистрирован: 17 июл 2012, 11:56
- Откуда: Республика Беларусь, г.Могилев
Re: Ф-ция CalcDaysBetweenDates
Сергей, большое спасибо за ответ!
Вы учли переносы в ф-ции и непосредственно праздничные дни. У меня немного другая ситуация. Связана с трудовыми отпусками. У отпуска в Klotpusk стоит признак для оплаты «1 - по календарным с оплатой дней, продленных за счет праздников» ( Klotpusk.Israbdn=1 ). Отпуск может быть переходящим с одного м-ца на другой. В Otpusk хранится весь период этого отпуска и его продолжительность. Мне надо разделить отпуск и его продолжительность на части, попадающие на каждый м-ц. С учетом указанного выше признака, нужны календарные дни за период отпуска, а также кол-во праздничных дней, попадающих на этот период. Поэтому сделала:
dn_:= CalcDaysBetweenDates ( dBeg, dEnd, False ) - dnPr_;
где dnPr_ - кол-во праздничных дней, попадающих в период [ Otpusk.Datan, Otpusk.Datok ].
И думаю, что из праздничных дней надо исключить переносы, т. е. рассматривать только чистые праздники. В РБ переносы для отпусков и б/л не учитываются.
Собственно такое деление происходит при расчете отпусков и последующей разноске в з/п. Насколько я поняла, деление в частности есть в табл.Arotpusk, но только для рассчитанных отпусков. Сначала показалось, что будет проще выбрать инфо по отпускам из Sumvidop, Nachisl, Arotpusk (для будущего периода), но потом решила выбирать из Otpusk (с делением по месяцам). И анализировать наличие отзывов.
Вы учли переносы в ф-ции и непосредственно праздничные дни. У меня немного другая ситуация. Связана с трудовыми отпусками. У отпуска в Klotpusk стоит признак для оплаты «1 - по календарным с оплатой дней, продленных за счет праздников» ( Klotpusk.Israbdn=1 ). Отпуск может быть переходящим с одного м-ца на другой. В Otpusk хранится весь период этого отпуска и его продолжительность. Мне надо разделить отпуск и его продолжительность на части, попадающие на каждый м-ц. С учетом указанного выше признака, нужны календарные дни за период отпуска, а также кол-во праздничных дней, попадающих на этот период. Поэтому сделала:
dn_:= CalcDaysBetweenDates ( dBeg, dEnd, False ) - dnPr_;
где dnPr_ - кол-во праздничных дней, попадающих в период [ Otpusk.Datan, Otpusk.Datok ].
И думаю, что из праздничных дней надо исключить переносы, т. е. рассматривать только чистые праздники. В РБ переносы для отпусков и б/л не учитываются.
Собственно такое деление происходит при расчете отпусков и последующей разноске в з/п. Насколько я поняла, деление в частности есть в табл.Arotpusk, но только для рассчитанных отпусков. Сначала показалось, что будет проще выбрать инфо по отпускам из Sumvidop, Nachisl, Arotpusk (для будущего периода), но потом решила выбирать из Otpusk (с делением по месяцам). И анализировать наличие отзывов.
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
Re: Ф-ция CalcDaysBetweenDates
Лучше использовать табельные функции по расчету плановых или базовых периодов, по умолчанию 11 режим
Re: Ф-ция CalcDaysBetweenDates
В дополнение к сказанному: полезные функции для этой задачи расположены в "..\CompSrc\Z\Z_Calendar\vip\ClndrFnc.vih".edward_K писал(а):Лучше использовать табельные функции по расчету плановых или базовых периодов, по умолчанию 11 режим