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

Расчет стажа

Добавлено: 09 апр 2013, 02:31
mwoland
Уважаемые соратники, нужна ваша помощь. Рассчитываю стаж у сотрудника на дату с помощью

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

irunstaj.NGetStajDays  (fPerson, _cstaj, _date);
irunstaj.NGetStajMonths(fPerson, _cstaj, _date);
irunstaj.NGetStajYears (fPerson, _cstaj, _date);
Все прекрасно работает. Но эти функции считают стаж за весь период до указанной даты, а нужно рассчитать количество лет месяцев дней на каждый из периодов стажа по отдельности.
Пробовал следующий алгоритм:

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

...
  allDay := longint(((Year(RunDate)  - Year(ServLen2.FromDate)) * 360 +
                     (Month(RunDate) - Month(ServLen2.FromDate)) * 30 +
                     (Day(RunDate)   - Day(ServLen2.FromDate))) * ServLen2.Rate;
  
if (ServLen2.FromDate <= RunDate)
     allDay := allDay + 1;

  set BYears   := DivI(allDay, 360);
  if (BYears < 0)
    set BYears   := 0;

  set BMonths  := DivI(allDay mod 360, 30);
  if (BMonths < 0)
    set BMonths := 0;

  set BDays    := allDay mod 30;
  if (BDays < 0)
    set BDays := 0;
...
Приближенно, считает правильно, но постоянно вылазит "погрешность" в +-1 день относительно того, что показывает Галактика на 3 вкладке карточки сотрудника.
Пробовал также следующий способ:

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

        year  := servlen.yearse  - servlen.yearsb;
        month := servlen.monthse - servlen.monthsb;
        day   := servlen.dayse   - servlen.daysb;
Совсем уж чушь получается (что не удивительно). Мб кто-нибудь подскажет, как Галактика считает стажи? Или листинг runstaj.vip кинет кто? В общем, "Бэн, ай нид хэлп".

Re: Расчет стажа

Добавлено: 09 апр 2013, 11:34
edward_K
Я бы не парился, а считал бы алгоритмом на начало-1 день и на конец, потом бы разницу приводил бы. С месацами понятно - меньше 0 - , от лет -1, к месяцам +12. С днями хуже.
Проще считать что в месяце 30 дней - так алгоритм кстати иногда и считает. Где то в доках была инстра о правилах расчета стажа. Для пенсионного вроде есть закон, где четко прописано в месяце 30 дней.

Re: Расчет стажа

Добавлено: 09 апр 2013, 12:58
mwoland
Вся сложность как раз в расчете количества дней месяцев лет между двумя датами так, как считает это галактика. Собственно в этом и заключается вопрос темы.

Re: Расчет стажа

Добавлено: 09 апр 2013, 13:06
edward_K
Надо искать доку. Насколько помню ее писал Screw. В ней были расписаны расчеты стажа для каждого типа(а он разный!). Она может быть либо в папке doc галактики, либо в документации - но где точно и как называется забыл.

Re: Расчет стажа

Добавлено: 09 апр 2013, 15:09
mwoland
Спасибо за пинок в нужном направлении. Описание алгоритма расчета находится в документации "приказы по кадрам и работа с картотекой", kdr02.pdf. Подсчет продолжительности общего трудового стажа осуществляется путем суммирования отдельно дат конца и дат начала указанных периодов. Разница этих сумм составляет продолжительность общего трудового стажа. Поскольку днем увольнения считается последний день работы, необходимо к продолжительности общего трудового стажа по каждому случаю увольнения добавить 1 день. Пример

12.07.1998+14.07.1996+31.12.1989+09.06.1969+23.05.1967=110.42.11906
15.07.1996+04.09.1991+15.09.1970+27.05.1967+15.03.1966=77.34.11879
110.42.11906-77.34.11879=33.08.27
Или
27 лет 9 месяцев 3 дня + 6 дней = 27 лет 9 месяцев 9 дней

Не совсем понятно как из 33.08.27 получить 27 лет 9 месяцев 3 дня, например, учитываются ли високосные годы. Попробую выяснить экспериментально

Re: Расчет стажа

Добавлено: 11 апр 2013, 09:26
LaaLaa
edward_K писал(а):Надо искать доку. Насколько помню ее писал Screw. В ней были расписаны расчеты стажа для каждого типа(а он разный!). Она может быть либо в папке doc галактики, либо в документации - но где точно и как называется забыл.
Качайте Viper 5.5. Там в папке AtlDoc есть эта документация wt2.chm - слегка обновленная.