Ф-ция CalcDaysBetweenDates

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Irina_
Местный житель
Сообщения: 555
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Ф-ция CalcDaysBetweenDates

Сообщение 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?
Irina_
Местный житель
Сообщения: 555
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Re: Ф-ция CalcDaysBetweenDates

Сообщение Irina_ »

Отвечу сама себе. Похоже, что нерабочие дни для ф-ции имеются ввиду суббота и воскресенье. Если из диапазона дат выбрасывать именно их, то получаю 10.
m0p3e
Местный житель
Сообщения: 1386
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва

Re: Ф-ция CalcDaysBetweenDates

Сообщение 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
Irina_
Местный житель
Сообщения: 555
Зарегистрирован: 17 июл 2012, 11:56
Откуда: Республика Беларусь, г.Могилев

Re: Ф-ция CalcDaysBetweenDates

Сообщение Irina_ »

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

Re: Ф-ция CalcDaysBetweenDates

Сообщение edward_K »

Лучше использовать табельные функции по расчету плановых или базовых периодов, по умолчанию 11 режим
KVS
Посетитель
Сообщения: 36
Зарегистрирован: 03 фев 2020, 10:38

Re: Ф-ция CalcDaysBetweenDates

Сообщение KVS »

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