|  | 
 
 | 
| 
 | |||||||
| Регистрация | << Правила форума >> | 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  
			
			
			
			
		 | ||||
| 
 | ||||
|   Так вроде не сложно подсчитать. |