|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
подсчет трудового стажа
Всем привет! Нужен исходник для подсчета трудового стажа работника (вводится: ФИО, и много периодов работи, например: 01.01.1991 - 30.02.1992 равно 1 год 1 месяц 30 дней, потом все это нужно просумировать) и сохранить данные в Excel (или Word) и его название должно быть фамилия работника. В Excelе у меня получилось, но хотелось бы на Delphi.
|
#2
|
||||
|
||||
Про стаж работы задачки всегда вызывали неоднозначие. К примеру:
01.01.2015 - 31.12.2015 = стаж 1 год 01.01.2016 - 31.12.2016 = стаж 1 год Вроде бы стаж одинаковый, а по факту стаж в 2016 году на 1 день больше Пишу программы за еду. __________________ |
#3
|
|||
|
|||
Ну, можно попробовать попользоваться функциями 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
|
|||
|
|||
подсчет трудового стажа
Спасибо за подержку. Нюансы: 1) диапазоны не пересекаться; 2) перерывы в работе допускаются. Большое спасибо за функции DaysBetween и MonthsBetween. Буду пробовать и точность нужна з точностю дня!
|
#5
|
|||
|
|||
ну, пример я тебе дал.
Как счтать с точностью "до дня" - это надо тебе определиться самому. Точнее - как переводить получившиеся дни в месяцы. Могу предложить такой вариант: считаем все периоды в днях. Потом берем какую-нить базовую дату, прибавляем к ней полученное кол-во дней и уже между этими 2мя датами считать через YearsBetween, MonthsBetween, DaysBetween, IncYear, IncMonth (для последних 2х можно передавать отрицательное значение для вычитания). С перерывами не понял твой ответ. Если, допустим, перерыв, например, меньше месяца не считается как прерывание стажа, то цикл подсчета надо изменить таким образом, что бы он вычислял "непрерывный" интервал, а потом уже считал кол-во дней в этом интервале. ЗЫ. Аккуратнее с DaysBetween функцией. Она считает кол-во ПОЛНЫХ дней. Т.е. если у тебя где-то попадется dStart или sEnd со временем, то можно получить немного неправильный результат. |
#6
|
||||
|
||||
Так вроде не сложно подсчитать.
|