Форум по Delphi программированию

 



Вернуться   Форум по Delphi программированию > Разное > Исходники и статьи
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.05.2016, 14:52
AndrijG AndrijG вне форума
Прохожий
 
Регистрация: 25.05.2016
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию подсчет трудового стажа

Всем привет! Нужен исходник для подсчета трудового стажа работника (вводится: ФИО, и много периодов работи, например: 01.01.1991 - 30.02.1992 равно 1 год 1 месяц 30 дней, потом все это нужно просумировать) и сохранить данные в Excel (или Word) и его название должно быть фамилия работника. В Excelе у меня получилось, но хотелось бы на Delphi.
Ответить с цитированием
  #2  
Старый 25.05.2016, 16:16
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Про стаж работы задачки всегда вызывали неоднозначие. К примеру:
01.01.2015 - 31.12.2015 = стаж 1 год
01.01.2016 - 31.12.2016 = стаж 1 год
Вроде бы стаж одинаковый, а по факту стаж в 2016 году на 1 день больше
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 26.05.2016, 06:24
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,601
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, можно попробовать попользоваться функциями DaysBetween и MonthsBetween (в зависимости от того, какая точность нужна). Я бы смотрел на последнюю, с небольшой ручной корректировкой.
Тут еще есть нюансы:
1. Могут ли диапазоны пересекаться?
2. Есть еще правило, что если перерыв в работе меньше, допустим, месяца (в зависимости от конторы, например, на загран, если не ошибаюсь, это 3 месяца), то стаж считается непрерывным.
В зависимости от ответов на эти вопросы, код будет разный.
Если по простому, с точностью до целого месяца, то примерно так:
Код:
uses DateUtils;

type
  TPeriod = record
    dStart, dEnd : TDateTime;
  end;

var
  A : Array Of TPeriod; 
  I : Integer;
  S : Integer;

  Y, M : Integer;

// Тут заполняем A с формы периодами работы

S := 0;
for I := Low(A) To High(A) Do
  S := MonthsBetween(A[i].dStart,A[i].dEnd);

Y := S div 12; // лет
M := S mod 12; // месяцев
Ответить с цитированием
  #4  
Старый 26.05.2016, 08:55
AndrijG AndrijG вне форума
Прохожий
 
Регистрация: 25.05.2016
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию подсчет трудового стажа

Спасибо за подержку. Нюансы: 1) диапазоны не пересекаться; 2) перерывы в работе допускаются. Большое спасибо за функции DaysBetween и MonthsBetween. Буду пробовать и точность нужна з точностю дня!
Ответить с цитированием
  #5  
Старый 26.05.2016, 18:37
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,601
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

ну, пример я тебе дал.
Как счтать с точностью "до дня" - это надо тебе определиться самому. Точнее - как переводить получившиеся дни в месяцы. Могу предложить такой вариант: считаем все периоды в днях. Потом берем какую-нить базовую дату, прибавляем к ней полученное кол-во дней и уже между этими 2мя датами считать через YearsBetween, MonthsBetween, DaysBetween, IncYear, IncMonth (для последних 2х можно передавать отрицательное значение для вычитания).
С перерывами не понял твой ответ. Если, допустим, перерыв, например, меньше месяца не считается как прерывание стажа, то цикл подсчета надо изменить таким образом, что бы он вычислял "непрерывный" интервал, а потом уже считал кол-во дней в этом интервале.

ЗЫ. Аккуратнее с DaysBetween функцией. Она считает кол-во ПОЛНЫХ дней. Т.е. если у тебя где-то попадется dStart или sEnd со временем, то можно получить немного неправильный результат.
Ответить с цитированием
  #6  
Старый 12.09.2016, 16:14
Аватар для skameykin22
skameykin22 skameykin22 вне форума
Прохожий
 
Регистрация: 12.09.2016
Адрес: Санкт-Петербург
Сообщения: 1
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Так вроде не сложно подсчитать.
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:01.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2020

ВКонтакте   Facebook   Twitter