|
Расчет суммы сроков трудового договора | ☑ | ||
---|---|---|---|---|
0
fantomrik
18.08.13
✎
16:15
|
Добрый день!
Наверно с начало напишу часть текста запроса, а далее поясню проблему над которой бьюсь 3 день, но не могу ни чего придумать... ВЫБРАТЬ СотрудникиОрганизаций.Ссылка КАК Ссылка, СотрудникиОрганизаций.Организация, РАЗНОСТЬДАТ(СотрудникиОрганизаций.ДатаНачала, СотрудникиОрганизаций.ДатаОкончания, МЕСЯЦ) КАК СрокТрудовогоДоговора, СотрудникиОрганизаций.Физлицо ПОМЕСТИТЬ ВТСотрудникиБезОтбораПоСроку ИЗ Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций ГДЕ СотрудникиОрганизаций.Организация = &Организация И СотрудникиОрганизаций.ВидЗанятости <> &ВидЗанятостиСовместительство И СотрудникиОрганизаций.ВидЗанятости <> &ВидЗанятостиСовместительство1 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТСотрудникиБезОтбораПоСроку.Физлицо, СУММА(ВТСотрудникиБезОтбораПоСроку.СрокТрудовогоДоговора) КАК СрокТрудовогоДоговора ПОМЕСТИТЬ ВТСрокТД ИЗ ВТСотрудникиБезОтбораПоСроку КАК ВТСотрудникиБезОтбораПоСроку СГРУППИРОВАТЬ ПО ВТСотрудникиБезОтбораПоСроку.Физлицо ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТСотрудникиБезОтбораПоСроку.Организация, ВТСотрудникиБезОтбораПоСроку.Физлицо, ВТСотрудникиБезОтбораПоСроку.Ссылка, ВТСрокТД.СрокТрудовогоДоговора ИЗ ВТСотрудникиБезОтбораПоСроку КАК ВТСотрудникиБезОтбораПоСроку ЛЕВОЕ СОЕДИНЕНИЕ ВТСрокТД КАК ВТСрокТД ПО ВТСотрудникиБезОтбораПоСроку.Физлицо = ВТСрокТД.Физлицо Собственно отбираю сотрудников и считаю сумму сроков их работы из вкладки Трудовой договор (требование заказчика). Далее будет отбор сотрудников, кто проработал более 6 месяцев и работает в настоящий момент. Но возникло доп условие, если физлицо имеет несколько сроков трудового договора(к примеру сюда могу попасть иностранные граждане, которых увольняю и принимают заного или т.п.), то нужно учесть, что если разрыв между сроками более 7 дней, то такие сроки не складываются, а берется максимальный из них и сравнивается на продолжительность 6 месяцев. Вот как это реализовать не могу придумать :( Заранее спасибо за помощь! |
|||
1
Cube
19.08.13
✎
06:36
|
(0) Задача интересная, но мне кажется, что ты делаешь велосипед...
Подозреваю, что тебе это надо для того, чтобы начислить страховые взносы? А ты знаешь о списке трудовых договоров в форме редактирования данных о гражданстве физического лица, который должны заполнять кадровики вручную? Если правильно заполнить этот список, то страховые взносы считаются как надо сами... |
|||
2
fantomrik
19.08.13
✎
09:34
|
(1) нет, не страховые взносы. В данном случае тут это просто кусочек полностью нетипового документа по оформлению страховых полисов. Причем хотелось бы конечно в 1 запросе реализовать поставленное условие, но уже не принципиально, можно и другим запросом и обработать программно ТЗ что бы получить список сотрудников которых нужно вычесть с основной ТЗ... Но все равно не могу придумать как так сделать (
|
|||
3
Cube
19.08.13
✎
09:37
|
(2) Окей, а почему тогда ты берешь даты работы из справочника сотрудников, а не по кадровым документам?
|
|||
4
fantomrik
19.08.13
✎
09:41
|
(3)ну в данном кусочке такое условие - учет сотрудников принятых временно(и временно несколько раз) и брать эту инф с карточки сотрудника с вкладки ТД. Хотя конечно понятно что эта информация просто для того что бы распечатать трудовой договор.
|
|||
5
Cube
19.08.13
✎
09:43
|
(4) Это бредовое условие... вот он взял и уволился раньше срока... И что? А потом хоп и вернулся в срой...
|
|||
6
Cube
19.08.13
✎
09:46
|
(4) И что значит "принятых временно"? По договорам подряда?
|
|||
7
fantomrik
19.08.13
✎
09:59
|
условие из ТЗ по заполнению ТЧ документа (кнопкой заполнить): "В справочнике «Сотрудники» происходит отбор сотрудников для заполнения табличной части документа, соответствующих условиям: трудовой договор с сотрудником заключен не менее чем на 6 месяцев...".
Я не придумал как по другому можно проконтролировать на какой срок заключен ТД, заказчик осведомлен что вкладка ТД мб не заполнена или заполнена не целиком... Просто к этому условию добавилось условие про несколько сроков и разрыв в 7 дней. Уже так и подрывает сказать заказчику - "Технически не выполнимо", но чувствую что выполнимо, хотелось бы понять как так сделать. |
|||
8
Cube
19.08.13
✎
10:04
|
(7) "Технически не выполнимо"
Не паникуй. В программировании невозможного нет. Главное, чтобы деньги у заказчика не кончались :) Ща накидаю запросик по кадровым документам. Берем только тех, кто по основному месту работы или договорников тоже? |
|||
9
fantomrik
19.08.13
✎
10:14
|
(8) Только по основному . Совместители внутренние и внешние нам не нужны.
Я понимаю что отбирать со сроком не менее 6 месяцев из информативной вкладки Сотрудники-ТД по разнице реквизитов дата начала и дата окончания не правильно, но уже так построен весь запрос. Просто как в клинить сюда условие про суммы нескольких скров (если таковые есть) но с разрывом не более 7 дней. Судя по логике, интересуют только 2 последних срока нас (если их несколько) |
|||
10
Cube
19.08.13
✎
10:16
|
(9) У тебя запрос гнилой))) Я уже пишу, погоди немного...
|
|||
11
Cube
19.08.13
✎
10:18
|
fantomrik ты мне лучше скажи, какие параметры нужно будет в отчет вставлять? Организация, дата?
|
|||
12
Cube
19.08.13
✎
10:18
|
(11) "отчет" = "запрос"
|
|||
13
fantomrik
19.08.13
✎
10:24
|
(11) Да конечно, параметром передастся
|
|||
14
fantomrik
19.08.13
✎
10:25
|
Сейчас напишу тек запрос если интересно
|
|||
15
fantomrik
19.08.13
✎
10:27
|
ВЫБРАТЬ
СотрудникиОрганизаций.Ссылка КАК Ссылка, СотрудникиОрганизаций.Организация, РАЗНОСТЬДАТ(СотрудникиОрганизаций.ДатаНачала, СотрудникиОрганизаций.ДатаОкончания, МЕСЯЦ) КАК СрокТрудовогоДоговора, СотрудникиОрганизаций.Физлицо ПОМЕСТИТЬ ВТСотрудникиБезОтбораПоСроку ИЗ Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций ГДЕ СотрудникиОрганизаций.Организация = &Организация И СотрудникиОрганизаций.ВидЗанятости <> &ВидЗанятостиСовместительство И СотрудникиОрганизаций.ВидЗанятости <> &ВидЗанятостиСовместительство1 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТСотрудникиБезОтбораПоСроку.Физлицо, СУММА(ВТСотрудникиБезОтбораПоСроку.СрокТрудовогоДоговора) КАК СрокТрудовогоДоговора ПОМЕСТИТЬ ВТСрокТД ИЗ ВТСотрудникиБезОтбораПоСроку КАК ВТСотрудникиБезОтбораПоСроку СГРУППИРОВАТЬ ПО ВТСотрудникиБезОтбораПоСроку.Физлицо ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТСотрудникиБезОтбораПоСроку.Организация, ВТСотрудникиБезОтбораПоСроку.Физлицо, ВТСотрудникиБезОтбораПоСроку.Ссылка, ВТСрокТД.СрокТрудовогоДоговора ПОМЕСТИТЬ ВТСотрудники ИЗ ВТСотрудникиБезОтбораПоСроку КАК ВТСотрудникиБезОтбораПоСроку ЛЕВОЕ СОЕДИНЕНИЕ ВТСрокТД КАК ВТСрокТД ПО ВТСотрудникиБезОтбораПоСроку.Физлицо = ВТСрокТД.Физлицо ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ СотрудникиОрганизаций.Ссылка, СотрудникиОрганизаций.Организация, СотрудникиОрганизаций.СрокТрудовогоДоговора, СотрудникиОрганизаций.Физлицо ПОМЕСТИТЬ ВТСотрудникиРаботающие ИЗ РегистрСведений.РаботникиОрганизаций.СрезПоследних(&КонтрольнаяДата, ) КАК РаботникиОрганизацийСрезПоследних ЛЕВОЕ СОЕДИНЕНИЕ ВТСотрудники КАК СотрудникиОрганизаций ПО РаботникиОрганизацийСрезПоследних.Сотрудник = СотрудникиОрганизаций.Ссылка ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КатегорииОбъектов КАК КатегорииОбъектов ПО РаботникиОрганизацийСрезПоследних.Сотрудник = КатегорииОбъектов.Объект И (КатегорииОбъектов.Категория = &Менее6месяцев) ГДЕ (СотрудникиОрганизаций.СрокТрудовогоДоговора <= -6 ИЛИ СотрудникиОрганизаций.СрокТрудовогоДоговора >= 6 ИЛИ СотрудникиОрганизаций.СрокТрудовогоДоговора = 0) И РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение) И КатегорииОбъектов.Категория ЕСТЬ NULL ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ СотрудникиОрганизаций.Ссылка, СотрудникиОрганизаций.Организация, СотрудникиОрганизаций.СрокТрудовогоДоговора, СотрудникиОрганизаций.Физлицо ПОМЕСТИТЬ ВТ_СотрудникиНеРаботающие ИЗ РегистрСведений.РаботникиОрганизаций.СрезПоследних(&КонтрольнаяДата, ) КАК РаботникиОрганизацийСрезПоследних ЛЕВОЕ СОЕДИНЕНИЕ ВТСотрудники КАК СотрудникиОрганизаций ПО РаботникиОрганизацийСрезПоследних.Сотрудник = СотрудникиОрганизаций.Ссылка ГДЕ РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Сотрудники.Ссылка КАК Сотрудник ПОМЕСТИТЬ ЕстьПолисПросроченый ИЗ ВТСотрудникиРаботающие КАК Сотрудники ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.МедицинскиеСтраховыеПолисы КАК МедицинскиеСтраховыеПолисы ПО Сотрудники.Физлицо = МедицинскиеСтраховыеПолисы.Физлицо И (НЕ МедицинскиеСтраховыеПолисы.ПометкаУдаления) И (МедицинскиеСтраховыеПолисы.ПрограммаСтрахования = &ПрограммаМедицинскогоСтрахования) И (МедицинскиеСтраховыеПолисы.ДатаОкончанияПолиса <= &КонтрольнаяДата) СГРУППИРОВАТЬ ПО Сотрудники.Ссылка ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Сотрудники.Ссылка КАК Сотрудник ПОМЕСТИТЬ ЕстьПолисДействующий ИЗ Справочник.МедицинскиеСтраховыеПолисы КАК МедицинскиеСтраховыеПолисы ЛЕВОЕ СОЕДИНЕНИЕ ВТСотрудники КАК Сотрудники ПО (Сотрудники.Физлицо = МедицинскиеСтраховыеПолисы.Физлицо) И (НЕ МедицинскиеСтраховыеПолисы.ПометкаУдаления) И (МедицинскиеСтраховыеПолисы.ПрограммаСтрахования = &ПрограммаМедицинскогоСтрахования) И (МедицинскиеСтраховыеПолисы.ДатаОкончанияПолиса > &КонтрольнаяДата) СГРУППИРОВАТЬ ПО Сотрудники.Ссылка ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Сотрудники.Ссылка КАК Сотрудник ПОМЕСТИТЬ НетПолиса ИЗ ВТСотрудникиРаботающие КАК Сотрудники ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.МедицинскиеСтраховыеПолисы КАК МедицинскиеСтраховыеПолисы ПО Сотрудники.Физлицо = МедицинскиеСтраховыеПолисы.Физлицо ГДЕ (МедицинскиеСтраховыеПолисы.ПометкаУдаления ИЛИ МедицинскиеСтраховыеПолисы.Ссылка ЕСТЬ NULL ИЛИ МедицинскиеСтраховыеПолисы.ПрограммаСтрахования <> &ПрограммаМедицинскогоСтрахования) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_СотрудникиНеработающие.Ссылка КАК Сотрудник ПОМЕСТИТЬ ВТ_УволенныеНеПринятыеЗаного ИЗ ВТ_СотрудникиНеРаботающие КАК ВТ_СотрудникиНеработающие ЛЕВОЕ СОЕДИНЕНИЕ ВТСотрудникиРаботающие КАК ВТСотрудникиРаботающие ПО ВТ_СотрудникиНеработающие.Физлицо = ВТСотрудникиРаботающие.Физлицо ГДЕ ВТСотрудникиРаботающие.Ссылка ЕСТЬ NULL ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЕстьПолисПросроченый.Сотрудник КАК Сотрудник ИЗ ЕстьПолисПросроченый КАК ЕстьПолисПросроченый ЛЕВОЕ СОЕДИНЕНИЕ ЕстьПолисДействующий КАК ЕстьПолисДействующий ПО ЕстьПолисПросроченый.Сотрудник = ЕстьПолисДействующий.Сотрудник ГДЕ ЕстьПолисДействующий.Сотрудник ЕСТЬ NULL УПОРЯДОЧИТЬ ПО ЕстьПолисПросроченый.Сотрудник.Наименование ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ЕстьПолисДействующий.Сотрудник КАК Сотрудник, франч_ПолисыСотрудниковРБПСрезПоследних.Неактуален ИЗ ЕстьПолисДействующий КАК ЕстьПолисДействующий ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_УволенныеНеПринятыеЗаного КАК ВТ_УволенныеНеПринятыеЗаного ПО ЕстьПолисДействующий.Сотрудник.Физлицо = ВТ_УволенныеНеПринятыеЗаного.Сотрудник.Физлицо ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.франч_ПолисыСотрудниковРБП.СрезПоследних КАК франч_ПолисыСотрудниковРБПСрезПоследних ПО ЕстьПолисДействующий.Сотрудник = франч_ПолисыСотрудниковРБПСрезПоследних.Сотрудник ГДЕ франч_ПолисыСотрудниковРБПСрезПоследних.Неактуален = ЛОЖЬ УПОРЯДОЧИТЬ ПО ЕстьПолисДействующий.Сотрудник.Наименование правда 2 регистра нетиповых используются, но они уже для дальнейших условий... |
|||
16
Cube
19.08.13
✎
11:21
|
Так, вот, что-то накидал...
Минус в том, что при таком подходе сложно сделать рекурсию. Поэтому у запроса есть ограничение: если за последние шесть месяцев сотрудник устраивался и увольнялся более трех раз, то он, скорее всего, не попадет в выборку... Число приемов/увольнений можно увеличить при желании, но оно всё равно будет фиксированным. Запрос: ВЫБРАТЬ РаботникиОрганизаций_Приемы.Сотрудник.Физлицо КАК Физлицо, РаботникиОрганизаций_Приемы.Организация КАК Организация, РаботникиОрганизаций_Приемы.Период КАК ДатаПриема, МИНИМУМ(ЕСТЬNULL(ДОБАВИТЬКДАТЕ(РаботникиОрганизаций_Увольнения.Период, ДЕНЬ, -1), ДАТАВРЕМЯ(1, 1, 1))) КАК ДатаУвольнения ПОМЕСТИТЬ ПериодыРаботы ИЗ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций_Приемы ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций_Увольнения ПО РаботникиОрганизаций_Приемы.Сотрудник = РаботникиОрганизаций_Увольнения.Сотрудник И РаботникиОрганизаций_Приемы.Организация = РаботникиОрганизаций_Увольнения.Организация И РаботникиОрганизаций_Приемы.Период < РаботникиОрганизаций_Увольнения.Период И (РаботникиОрганизаций_Увольнения.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)) ГДЕ РаботникиОрганизаций_Приемы.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.ПриемНаРаботу) СГРУППИРОВАТЬ ПО РаботникиОрганизаций_Приемы.Организация, РаботникиОрганизаций_Приемы.Период, РаботникиОрганизаций_Приемы.Сотрудник.Физлицо ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РаботникиОрганизацийСрезПоследних.Сотрудник.Физлицо КАК Физлицо, РаботникиОрганизацийСрезПоследних.Организация, РаботникиОрганизацийСрезПоследних.Период КАК ДатаПриема ПОМЕСТИТЬ СписокСотрудников ИЗ РегистрСведений.РаботникиОрганизаций.СрезПоследних(&Период, ) КАК РаботникиОрганизацийСрезПоследних ГДЕ РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния <> ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВложенныйЗапрос.Физлицо КАК Физлицо, ВложенныйЗапрос.Организация КАК Организация, ВложенныйЗапрос.ДатаПриема ИЗ (ВЫБРАТЬ ВложенныйЗапрос.Физлицо КАК Физлицо, ВложенныйЗапрос.Организация КАК Организация, ВЫБОР КОГДА НЕ ПериодыРаботы.ДатаПриема ЕСТЬ NULL ТОГДА ПериодыРаботы.ДатаПриема ИНАЧЕ ВложенныйЗапрос.ДатаПриема КОНЕЦ КАК ДатаПриема ИЗ (ВЫБРАТЬ ВложенныйЗапрос.Физлицо КАК Физлицо, ВложенныйЗапрос.Организация КАК Организация, ВЫБОР КОГДА НЕ ПериодыРаботы.ДатаПриема ЕСТЬ NULL ТОГДА ПериодыРаботы.ДатаПриема ИНАЧЕ ВложенныйЗапрос.ДатаПриема КОНЕЦ КАК ДатаПриема ИЗ (ВЫБРАТЬ СписокСотрудников.Физлицо КАК Физлицо, СписокСотрудников.Организация КАК Организация, ВЫБОР КОГДА НЕ ПериодыРаботы.ДатаПриема ЕСТЬ NULL ТОГДА ПериодыРаботы.ДатаПриема ИНАЧЕ СписокСотрудников.ДатаПриема КОНЕЦ КАК ДатаПриема ИЗ СписокСотрудников КАК СписокСотрудников ЛЕВОЕ СОЕДИНЕНИЕ ПериодыРаботы КАК ПериодыРаботы ПО СписокСотрудников.Физлицо = ПериодыРаботы.Физлицо И СписокСотрудников.Организация = ПериодыРаботы.Организация И (РАЗНОСТЬДАТ(ПериодыРаботы.ДатаУвольнения, СписокСотрудников.ДатаПриема, ДЕНЬ) > 0) И (РАЗНОСТЬДАТ(ПериодыРаботы.ДатаУвольнения, СписокСотрудников.ДатаПриема, ДЕНЬ) < 7)) КАК ВложенныйЗапрос ЛЕВОЕ СОЕДИНЕНИЕ ПериодыРаботы КАК ПериодыРаботы ПО ВложенныйЗапрос.Физлицо = ПериодыРаботы.Физлицо И ВложенныйЗапрос.Организация = ПериодыРаботы.Организация И (РАЗНОСТЬДАТ(ПериодыРаботы.ДатаУвольнения, ВложенныйЗапрос.ДатаПриема, ДЕНЬ) > 0) И (РАЗНОСТЬДАТ(ПериодыРаботы.ДатаУвольнения, ВложенныйЗапрос.ДатаПриема, ДЕНЬ) < 7)) КАК ВложенныйЗапрос ЛЕВОЕ СОЕДИНЕНИЕ ПериодыРаботы КАК ПериодыРаботы ПО ВложенныйЗапрос.Физлицо = ПериодыРаботы.Физлицо И ВложенныйЗапрос.Организация = ПериодыРаботы.Организация И (РАЗНОСТЬДАТ(ПериодыРаботы.ДатаУвольнения, ВложенныйЗапрос.ДатаПриема, ДЕНЬ) > 0) И (РАЗНОСТЬДАТ(ПериодыРаботы.ДатаУвольнения, ВложенныйЗапрос.ДатаПриема, ДЕНЬ) < 7)) КАК ВложенныйЗапрос ГДЕ РАЗНОСТЬДАТ(ВложенныйЗапрос.ДатаПриема, &Период, МЕСЯЦ) > 6 УПОРЯДОЧИТЬ ПО Физлицо, Организация АВТОУПОРЯДОЧИВАНИЕ |
|||
17
Cube
19.08.13
✎
11:22
|
+(16) Ограничение по организации добавишь сам.
И я так понял, что нужно по физлицам, да? |
|||
18
Cube
19.08.13
✎
11:23
|
Возможно, я где-то напарился, но общий ход мыслей, думаю, понятен.
|
|||
19
fantomrik
19.08.13
✎
11:28
|
(16) Спасибо огромное, немного позже посмотрю - текущие задачи не дают углубиться в эту.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |