|
v7: Мне необходимо рассчитать возраст сотрудника на дату увольнения | ☑ | ||
---|---|---|---|---|
0
ЮлияКорж
28.02.12
✎
10:55
|
Мне необходимо рассчитать возраст сотрудника на дату увольнения вывести сотрудников которым до 20 лет с 21 до 30 на дату увольнения как правильно вычислить возраст на дату увольнения
|
|||
1
Wobland
28.02.12
✎
10:58
|
(0) я б в восьмёрке сказал РАЗНОСТЬДАТ() в запросе...
|
|||
2
SeraFim
28.02.12
✎
11:00
|
глРазобратьРазностьДат?
|
|||
3
K-5
28.02.12
✎
11:00
|
А что сложного?
Кури ДатаГод(<?>) Синтаксис: ДатаГод(<Дата>) Назначение: Возвращает числовое значение года для заданной даты. Параметры: <Дата> - выражение со значением типа дата. |
|||
4
Wobland
28.02.12
✎
11:04
|
(3) високосные года
|
|||
5
ЮлияКорж
28.02.12
✎
11:05
|
Это вариант правильный чи нет на ваш взгляд
ГодР = ДатаГод(ДатаР); МесР = ДатаМесяц(ДатаР); ЧслР = ДатаЧисло(ДатаР); ГодА = ДатаГод(ДатаА); МесА = ДатаМесяц(ДатаА); ЧслА = ДатаЧисло(ДатаА); Лет = Цел(((ГодА-ГодР)*12+МесА-МесР)/12); Мес = ((ГодА-ГодР)*12+МесА-МесР)-Лет*12; |
|||
6
Wobland
28.02.12
✎
11:08
|
(5) ДатаР=29.02.12; ДатаА=28.02.13;
по-твоему получается Лет=1; Мес=0; а на самом деле как? уже 1 или ещё нет? ;) |
|||
7
ЮлияКорж
28.02.12
✎
11:10
|
Этот алгоритм по вашему
Пока Сотр.ПолучитьЭлемент()>0 Цикл ФизЛицо.НайтиЭлемент(Сотр.ТекущийЭлемент().ФизическоеЛицо); Если((Сотр.ДатаОкончанияДействия>=НачалоТекущегоПериода) И (Сотр.ДатаОкончанияДействия<КонецТекущегоПериода)) Тогда ДеньРожденияЭтогоГода = НачГода(Сотр.ДатаОкончанияДействия); Пока ДатаМесяц(ДеньРожденияЭтогоГода) < ДатаМесяц(Сотр.ФизическоеЛицо.ДатаРождения) Цикл ДеньРожденияЭтогоГода = ДобавитьМесяц(ДеньРожденияЭтогоГода,1); КонецЦикла; Пока ДатаЧисло(ДеньРожденияЭтогоГода) < ДатаЧисло(Сотр.ФизическоеЛицо.ДатаРождения) Цикл ДеньРожденияЭтогоГода = ДеньРожденияЭтогоГода + 1; КонецЦикла; ЛетВЭтомГоду = ДатаГод(ДеньРожденияЭтогоГода) - ДатаГод(Сотр.ФизическоеЛицо.ДатаРождения); Если ДеньРожденияЭтогоГода > Сотр.ДатаОкончанияДействия Тогда ЛетСотруднику = ЛетВЭтомГоду - 1; Иначе ЛетСотруднику = ЛетВЭтомГоду; КонецЕсли; КонецЕсли; |
|||
8
НЕА123
28.02.12
✎
11:16
|
(0)
ДобавитьМесяц(ДатаРождения, 20*12) < ДатаУвольнения ? |
|||
9
ЮлияКорж
28.02.12
✎
11:25
|
Так этот алгоритм верный или нет
|
|||
10
TeddySlaf
28.02.12
✎
11:27
|
(9) весьма хорош (8)
Тебе ж не надо конкретно знать возвраст. Надо лишь проверить, на вход в нужные интервалы. |
|||
11
ЮлияКорж
28.02.12
✎
11:34
|
Мне ненравится, что на выходе имеются отрицательные значения возраста
|
|||
12
ЮлияКорж
28.02.12
✎
11:34
|
21
22 53 46 -46 23 51 19 49 45 30 24 44 27 49 24 -46 20 29 30 37 42 -45 2 |
|||
13
TeddySlaf
28.02.12
✎
11:38
|
ты, наверно, пишешь не про алгоритм в (8) , а про другой.
|
|||
14
TeddySlaf
28.02.12
✎
11:41
|
Кстати, в задаче (0) надо уточнить границы диапазонов.
У тебя щас: -до 20; -от 21 до 30; -... Например, Куда девать ровно Двадцатилетних детей? |
|||
15
ЮлияКорж
28.02.12
✎
11:44
|
В УСЛОВИИ ВОЗРАСТ ПОСТАВИТЬ <=20 я еще не учитывала надо сначала добиться чтобы обработка правильно считала возраст
|
|||
16
Deon
28.02.12
✎
11:45
|
(15) Чем тебя (8) не удовлетворяет?
|
|||
17
ЮлияКорж
28.02.12
✎
11:47
|
Мне необходимо, чтобы не было этих отрицательных возрастов, возраст не может быть отрицательным значением
|
|||
18
PuhUfa
28.02.12
✎
11:48
|
(17) весь код показывай
|
|||
19
TeddySlaf
28.02.12
✎
11:48
|
(17) как у тебя , используя алгоритм в (8) может получиться отрицательное целое?
|
|||
20
Deon
28.02.12
✎
11:49
|
(19) Видимо, все-таки нужен именно возраст
|
|||
21
ЮлияКорж
28.02.12
✎
11:50
|
Процедура Выполнить()
Перем НачалоТекущегоПериода, КонецТекущегоПериода,ЛетСотруднику,ДеньРожденияЭтогоГода,ЛетВЭтомГоду; НачалоТекущегоПериода = Дата1; КонецТекущегоПериода = Дата2 + 1; ФизЛицо=СоздатьОбъект("Справочник.ФизическиеЛица"); Сотр=СоздатьОбъект("Справочник.Сотрудники"); Сотр.ВыбратьЭлементы(); Пока Сотр.ПолучитьЭлемент()>0 Цикл ФизЛицо.НайтиЭлемент(Сотр.ТекущийЭлемент().ФизическоеЛицо); Если((Сотр.ДатаОкончанияДействия>=НачалоТекущегоПериода) И (Сотр.ДатаОкончанияДействия<КонецТекущегоПериода)) Тогда ДеньРожденияЭтогоГода = НачГода(Сотр.ДатаОкончанияДействия); Пока ДатаМесяц(ДеньРожденияЭтогоГода) < ДатаМесяц(Сотр.ФизическоеЛицо.ДатаРождения) Цикл ДеньРожденияЭтогоГода = ДобавитьМесяц(ДеньРожденияЭтогоГода,1); КонецЦикла; Пока ДатаЧисло(ДеньРожденияЭтогоГода) < ДатаЧисло(Сотр.ФизическоеЛицо.ДатаРождения) Цикл ДеньРожденияЭтогоГода = ДеньРожденияЭтогоГода + 1; КонецЦикла; ЛетВЭтомГоду = ДатаГод(ДеньРожденияЭтогоГода) - ДатаГод(Сотр.ФизическоеЛицо.ДатаРождения); Если ДеньРожденияЭтогоГода > Сотр.ДатаОкончанияДействия Тогда ЛетСотруднику = ЛетВЭтомГоду - 1; Иначе ЛетСотруднику = ЛетВЭтомГоду; Сообщить(ДеньРожденияЭтогоГода); КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
22
TeddySlaf
28.02.12
✎
11:50
|
если ДобавитьМесяц(ДатаРождения, 20*12) < ДатаУвольнения
Тогда //* тут действия с малолеткой ИначеЕсли ДобавитьМесяц(ДатаРождения, 30*12) < ДатаУвольнения Тогда //* тут действия со студентом Иначе //* тут действия с пенсионэрами КонецЕсли; |
|||
23
Ирис_яркая
модератор
28.02.12
✎
11:53
|
для 8 так
Запрос=новый Запрос; Запрос.Текст=" |ВЫБРАТЬ | УвольнениеИзОрганизацийРаботникиОрганизации.Физлицо, | УвольнениеИзОрганизацийРаботникиОрганизации.ДатаУвольнения, | РАЗНОСТЬДАТ(УвольнениеИзОрганизацийРаботникиОрганизации.Физлицо.ДатаРождения, УвольнениеИзОрганизацийРаботникиОрганизации.ДатаУвольнения, ГОД) КАК Поле1, | УвольнениеИзОрганизацийРаботникиОрганизации.Ссылка |ИЗ | Документ.УвольнениеИзОрганизаций.РаботникиОрганизации КАК УвольнениеИзОрганизацийРаботникиОрганизации |ГДЕ | РАЗНОСТЬДАТ(УвольнениеИзОрганизацийРаботникиОрганизации.Физлицо.ДатаРождения, УвольнениеИзОрганизацийРаботникиОрганизации.ДатаУвольнения, ГОД) = &ТребуемыйВозраст |"; Запрос.УстановитьПараметр("ТребуемыйВозраст",34); Результат = Запрос.Выполнить(); Результат = Результат.Выгрузить(); Для каждого СтрокаТЗ из Результат Цикл КонецЦикла; |
|||
24
Deon
28.02.12
✎
11:56
|
(21) ДеньРожденияЭтогоГода Можно попроще получить:
ДеньРожденияЭтогоГода = ДобавитьМесяц( Сотр.ФизическоеЛицо.ДатаРождения, (ДатаГод(Сотр.ДатаОкончанияДействия) - ДатаГод(Сотр.ФизическоеЛицо.ДатаРождения))*12) |
|||
25
K-5
28.02.12
✎
12:23
|
(4) мрак
|
|||
26
K-5
28.02.12
✎
12:35
|
+(25)
Функция РазностьЛет(ДР,ДатаУвольнения) Если ДР<ДатаУвольнения Тогда Возврат -1; КонецЕсли; ГодР= ДатаГод(ДР); МесР=ДатаМесяц(ДР); ДенР=ДатаЧисло(ДР); ГодУ=ДатаГод(ДатаУвольнения); ДрГу=Дата(ГодУ,МесР,ДенР); Если ДрГу>=ДатаУвольнения Тогда Возврат (ГодУ-ГодР); Иначе Возврат (ГодУ-ГодР-1); КонецЕсли; КонецПроцедуры |
|||
27
zak555
28.02.12
✎
12:49
|
Процедура глРазобратьРазностьДат(Знач Дата1,Знач Дата2,Лет=0,Месяцев=0,Дней=0) Экспорт
Лет = 0; Месяцев = 0; Дней = 0; Если Дата1 > Дата2 Тогда Год1 = ДатаГод(Дата1); Год2 = ДатаГод(Дата2); Месяц1 = ДатаМесяц(Дата1); Месяц2 = ДатаМесяц(Дата2); Число1 = ДатаЧисло(Дата1); Число2 = ДатаЧисло(Дата2); Если Число1 < Число2 Тогда Дней = НачМесяца(Дата1) - НачМесяца(ДобавитьМесяц(Дата1,-1)); Месяц1 = Месяц1 - 1; КонецЕсли; Дней = Дней + Число1 - Число2; // Дней ( до исполнения строки) - заем из Месяцев Если Месяц1 < Месяц2 Тогда Месяцев = 12; Год1 = Год1 - 1; КонецЕсли; Месяцев = Месяцев + Месяц1 - Месяц2; // Месяцев ( до исполнения строки) - заем из Лет Лет = Год1 - Год2; КонецЕсли; КонецПроцедуры |
|||
28
ЮлияКорж
28.02.12
✎
13:15
|
И в первом и во втором случае выбиваютя отрицательные значения
|
|||
29
TeddySlaf
28.02.12
✎
13:21
|
из ЗиК:
|
|||
30
TeddySlaf
28.02.12
✎
13:27
|
(28) Почему не делаешь ссылки на сообщения (случаи)?
И все-таки у тебя ведь не стоит задача узнать Срок жизни человека до увольнения. Тебе всего лишь надо проверить в какой диапазон входит срок, а для этого смотри (22). |
|||
31
ЮлияКорж
28.02.12
✎
13:37
|
Мне необходимо узнать вывести количество сотрудников,которым на дату увольнения было до 20,20 включительно, потом 21 по 30,31-40,41-50 и больше 51
|
|||
32
TeddySlaf
28.02.12
✎
13:38
|
чем не устраивает алгоритм в (22) сообщении?
|
|||
33
ЮлияКорж
28.02.12
✎
14:06
|
короче я вот такую наваяла вроде как работает
Функция ОпределениеЛет(ДатаР,ДатаА) ГодР = ДатаГод(ДатаР); МесР = ДатаМесяц(ДатаР); ЧслР = ДатаЧисло(ДатаР); ГодА = ДатаГод(ДатаА); МесА = ДатаМесяц(ДатаА); ЧслА = ДатаЧисло(ДатаА); Лет = Цел(((ГодА-ГодР)*12+МесА-МесР)/12); Мес = ((ГодА-ГодР)*12+МесА-МесР)-Лет*12; Возврат Лет; КонецФункции Процедура Выполнить() Перем Рез; Рез=ОпределениеЛет(ДатаР,ДатаА); Сообщить(Рез); КонецПроцедуры |
|||
34
НЕА123
28.02.12
✎
14:27
|
(33)
ЧслХ не нужны? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |