Ф-ция CalcDaysBetweenDates

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

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

Ф-ция CalcDaysBetweenDates

Сообщение Irina_ » Ср июн 30, 2021 15:24

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

Re: Ф-ция CalcDaysBetweenDates

Сообщение Irina_ » Ср июн 30, 2021 15:43

Отвечу сама себе. Похоже, что нерабочие дни для ф-ции имеются ввиду суббота и воскресенье. Если из диапазона дат выбрасывать именно их, то получаю 10.
Irina_
Местный житель
 
Сообщения: 504
Зарегистрирован: Вт июл 17, 2012 11:56
Откуда: Республика Беларусь, г.Могилев
Reputation point: 47

Re: Ф-ция CalcDaysBetweenDates

Сообщение m0p3e » Ср июн 30, 2021 17:25

Все верно. Для нее нерабочие это конкретно суббота и воскресенье.
Когда-то писал для себя такую функцию.
Код: Выделить всё
//Возвращает количество рабочих дней между двумя датами
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
m0p3e
Местный житель
 
Сообщения: 1384
Зарегистрирован: Вт мар 29, 2005 17:49
Откуда: Москва
Reputation point: 97

Re: Ф-ция CalcDaysBetweenDates

Сообщение Irina_ » Ср июн 30, 2021 18:45

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

Re: Ф-ция CalcDaysBetweenDates

Сообщение edward_K » Вс июл 04, 2021 22:09

Лучше использовать табельные функции по расчету плановых или базовых периодов, по умолчанию 11 режим
edward_K
Заслуженный деятель интернет-сообщества
 
Сообщения: 5164
Зарегистрирован: Вт мар 29, 2005 17:49
Откуда: SPB galaxy spb
Reputation point: 115

Re: Ф-ция CalcDaysBetweenDates

Сообщение KVS » Пт янв 21, 2022 18:00

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


В дополнение к сказанному: полезные функции для этой задачи расположены в "..\CompSrc\Z\Z_Calendar\vip\ClndrFnc.vih".
KVS
 
Сообщения: 11
Зарегистрирован: Пн фев 03, 2020 11:38
Reputation point: 0


Вернуться в Программирование

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


cron