Страница 1 из 1

Ф-ция CalcDaysBetweenDates

Добавлено: 30 июн 2021, 14:24
Irina_
Здравствуйте.
Вопрос связан с ф-цией 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?

Re: Ф-ция CalcDaysBetweenDates

Добавлено: 30 июн 2021, 14:43
Irina_
Отвечу сама себе. Похоже, что нерабочие дни для ф-ции имеются ввиду суббота и воскресенье. Если из диапазона дат выбрасывать именно их, то получаю 10.

Re: Ф-ция CalcDaysBetweenDates

Добавлено: 30 июн 2021, 16:25
m0p3e
Все верно. Для нее нерабочие это конкретно суббота и воскресенье.
Когда-то писал для себя такую функцию.

Код: Выделить всё

//Возвращает количество рабочих дней между двумя датами
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

Re: Ф-ция CalcDaysBetweenDates

Добавлено: 30 июн 2021, 17:45
Irina_
Сергей, большое спасибо за ответ!
Вы учли переносы в ф-ции и непосредственно праздничные дни. У меня немного другая ситуация. Связана с трудовыми отпусками. У отпуска в Klotpusk стоит признак для оплаты «1 - по календарным с оплатой дней, продленных за счет праздников» ( Klotpusk.Israbdn=1 ). Отпуск может быть переходящим с одного м-ца на другой. В Otpusk хранится весь период этого отпуска и его продолжительность. Мне надо разделить отпуск и его продолжительность на части, попадающие на каждый м-ц. С учетом указанного выше признака, нужны календарные дни за период отпуска, а также кол-во праздничных дней, попадающих на этот период. Поэтому сделала:
dn_:= CalcDaysBetweenDates ( dBeg, dEnd, False ) - dnPr_;
где dnPr_ - кол-во праздничных дней, попадающих в период [ Otpusk.Datan, Otpusk.Datok ].
И думаю, что из праздничных дней надо исключить переносы, т. е. рассматривать только чистые праздники. В РБ переносы для отпусков и б/л не учитываются.
Собственно такое деление происходит при расчете отпусков и последующей разноске в з/п. Насколько я поняла, деление в частности есть в табл.Arotpusk, но только для рассчитанных отпусков. Сначала показалось, что будет проще выбрать инфо по отпускам из Sumvidop, Nachisl, Arotpusk (для будущего периода), но потом решила выбирать из Otpusk (с делением по месяцам). И анализировать наличие отзывов.

Re: Ф-ция CalcDaysBetweenDates

Добавлено: 04 июл 2021, 21:09
edward_K
Лучше использовать табельные функции по расчету плановых или базовых периодов, по умолчанию 11 режим

Re: Ф-ция CalcDaysBetweenDates

Добавлено: 21 янв 2022, 17:00
KVS
edward_K писал(а):Лучше использовать табельные функции по расчету плановых или базовых периодов, по умолчанию 11 режим
В дополнение к сказанному: полезные функции для этой задачи расположены в "..\CompSrc\Z\Z_Calendar\vip\ClndrFnc.vih".