Имя: Пароль:
1C
1С v8
Запрос с суммированием по неполному результату
,
0 Kraspila
 
05.09.14
10:02
Задача:
На предприятии работают сотрудники. Управленческим приказом они периодически увольняются и вновь принимаются на работу. При этом перерыв в деятельности не бывает более 90 дней.
Требуется:
Рассчитать с помощью запроса общую продолжительность работы сотрудника в организации, при этом отбросив периоды работы, предшествующие перерыву более 90 дней.
1 Ненавижу 1С
 
гуру
05.09.14
10:06
Требуется: 20'000 рублей
2 Kraspila
 
05.09.14
10:06
Суть решения сводится к отбрасыванию части запроса, где некоторое значение больше указанной величины, то есть выбираем  периоды работы и количество дней после последнего увольнения,
3 Kraspila
 
05.09.14
10:07
далее отбрасываем "хвост" результатов запроса, начиная с этого    
значения и до конца и суммируем полученные периоды
4 Kraspila
 
05.09.14
10:07
Вот такой запрос:
ВЫБРАТЬ
    РаботникиОрганизаций.Период,
    РаботникиОрганизаций.Сотрудник.Физлицо
ПОМЕСТИТЬ Увольнения
ИЗ
    РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
ГДЕ
    РаботникиОрганизаций.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    РаботникиОрганизаций.Сотрудник.Физлицо,
    РаботникиОрганизаций.Период,
    РаботникиОрганизаций.Сотрудник
ПОМЕСТИТЬ Приемы
ИЗ
    РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
ГДЕ
    РаботникиОрганизаций.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.ПриемНаРаботу)
    И РаботникиОрганизаций.Сотрудник.Физлицо = &Физлицо
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Приемы.СотрудникФизлицо,
    Приемы.Период КАК Прием,
    Увольнения.Период КАК Увольнение,
    ЕСТЬNULL(РАЗНОСТЬДАТ(Увольнения.Период, Приемы.Период, ДЕНЬ), 0.1) КАК ПрошлоДней,
    Приемы.Сотрудник.Код
ПОМЕСТИТЬ ПериодыДней
ИЗ
    Приемы КАК Приемы
        ЛЕВОЕ СОЕДИНЕНИЕ Увольнения КАК Увольнения
        ПО Приемы.СотрудникФизлицо = Увольнения.СотрудникФизлицо
            И (Увольнения.Период В
                (ВЫБРАТЬ
                    МАКСИМУМ(Увольнения.Период) КАК Период
                ИЗ
                    Увольнения КАК Увольнения
                ГДЕ
                    Увольнения.СотрудникФизлицо = Приемы.СотрудникФизлицо
                    И Увольнения.Период <= Приемы.Период))
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ПериодыДней.Прием КАК Прием,
    ПериодыДней.ПрошлоДней,
    ПериодыДней.Увольнение
ИЗ
    ПериодыДней КАК ПериодыДней
ГДЕ
    ПериодыДней.ПрошлоДней > 10

УПОРЯДОЧИТЬ ПО
    Прием УБЫВ
;
5 Kraspila
 
05.09.14
10:08
Внимание, вопрос: как отрубить результату хвост?
6 Kraspila
 
05.09.14
10:11
(1) хочет двадцатку. Предлагаю скинуться ради своего развития.
Задача была решена простой функцией, а цель темы-упражнение для ума.
7 _fvadim
 
05.09.14
10:13
(6) ага-ага.
"хммм, никто кодом не поделился, придётся самому думать"
8 Kraspila
 
05.09.14
10:17
ВЫБРАТЬ
    РаботникиОрганизаций.Период,
    РаботникиОрганизаций.Сотрудник.Физлицо
ПОМЕСТИТЬ Увольнения
ИЗ
    РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
ГДЕ
    РаботникиОрганизаций.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение)
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    РаботникиОрганизаций.Сотрудник.Физлицо,
    РаботникиОрганизаций.Период,
    РаботникиОрганизаций.Сотрудник
ПОМЕСТИТЬ Приемы
ИЗ
    РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций
ГДЕ
    РаботникиОрганизаций.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.ПриемНаРаботу)
    И РаботникиОрганизаций.Сотрудник.Физлицо = &Физлицо
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    Приемы.СотрудникФизлицо,
    Приемы.Период КАК Прием,
    Увольнения.Период КАК Увольнение,
    ЕСТЬNULL(РАЗНОСТЬДАТ(Увольнения.Период, Приемы.Период, ДЕНЬ), 0.1) КАК ПрошлоДней,
    Приемы.Сотрудник.Код
ПОМЕСТИТЬ ПериодыДней
ИЗ
    Приемы КАК Приемы
        ЛЕВОЕ СОЕДИНЕНИЕ Увольнения КАК Увольнения
        ПО Приемы.СотрудникФизлицо = Увольнения.СотрудникФизлицо
            И (Увольнения.Период В
                (ВЫБРАТЬ
                    МАКСИМУМ(Увольнения.Период) КАК Период
                ИЗ
                    Увольнения КАК Увольнения
                ГДЕ
                    Увольнения.СотрудникФизлицо = Приемы.СотрудникФизлицо
                    И Увольнения.Период <= Приемы.Период))
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ПериодыДней.Прием КАК Прием,
    ПериодыДней.ПрошлоДней,
    ПериодыДней.Увольнение
ИЗ
    ПериодыДней КАК ПериодыДней
ГДЕ
    ПериодыДней.ПрошлоДней > 10

УПОРЯДОЧИТЬ ПО
    Прием УБЫВ
;
9 Kraspila
 
05.09.14
10:21
Код есть, но интерес именно в том, чтоб делать запросы с суммированием, допустим, строк, только выше определенного флага
10 Kraspila
 
05.09.14
10:21
(7) Код есть, но интерес именно в том, чтоб делать запросы с суммированием, допустим, строк, только выше определенного флага
11 Kraspila
 
05.09.14
10:57
(1) Имеется 10'000 рублей
12 Enders
 
05.09.14
12:31
В чем проблема то?
1. Получаешь таблицу
Сотрудник, дата приема
2. Получаешь таблицу
Сотрудник, дата уволньнения
3. Соединяешь по сотрудник и датаПриема>ДатыУвольнения
4. Считаешь разницу
5. Оставляешь разницу более 90 дней
6. Группируешь по сотруднику и получаешь макс дату приема. Профит
13 Kraspila
 
06.09.14
04:23
(12) Теперь вторым запросом нужно выбрать периоды работы до даты из первого запроса и сложить их. Но как выбрать периоды до даты, полученной в первом запросе?
14 Ненавижу 1С
 
гуру
06.09.14
07:44
(11) если эта сумма за решение задачи, то давай обговорим точную формулировку
15 Enders
 
08.09.14
16:03
(13) Не до, а после. в (12) Мы получили максимальную дату ПРИЕМА (то есть ту, перед которой был перерыв более 90 дней.
А что сложного? Нужные тебе таблицы соединяем по сотруднику и период >= МаксДатеПриема.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан