Версия для печати темы (https://pro1c.org.ua/index.php?showtopic=25253)
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Помогите с связями в запросе
Автор: kosalex 21.09.15, 9:45
Есть запрос:
ВЫБРАТЬ
ДанныеПроходныхКОДОС.Сотрудник КАК Сотрудник,
ДанныеПроходныхКОДОС.ТабельныйНомер КАК ТабельныйНомер,
ДанныеПроходныхКОДОС.График КАК График,
ДанныеПроходныхКОДОС.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
ДанныеПроходныхКОДОС.Период1 КАК Период1,
ДанныеПроходныхКОДОС.Период КАК ВремяВход
ИЗ
РегистрСведений.ДанныеПроходныхКОДОС КАК ДанныеПроходныхКОДОС
ГДЕ
ДанныеПроходныхКОДОС.Период МЕЖДУ &ПериодНачало И &ПериодКонец
И ДанныеПроходныхКОДОС.Сотрудник В(&Сотрудник)
И (ДанныеПроходныхКОДОС.Событие = "Вход"
ИЛИ ДанныеПроходныхКОДОС.Событие = "Въезд")
Результат:Второй запрос:
ВЫБРАТЬ РАЗЛИЧНЫЕ
ДанныеПроходныхКОДОС.Период КАК ВремяВыход,
ДанныеПроходныхКОДОС.Сотрудник КАК Сотрудник,
ДанныеПроходныхКОДОС.Период1 КАК Период1
ИЗ
РегистрСведений.ДанныеПроходныхКОДОС КАК ДанныеПроходныхКОДОС
ГДЕ
ДанныеПроходныхКОДОС.Период МЕЖДУ &ПериодНачало И &ПериодКонец
И ДанныеПроходныхКОДОС.Сотрудник В(&Сотрудник)
И (ДанныеПроходныхКОДОС.Событие = "Выход"
ИЛИ ДанныеПроходныхКОДОС.Событие = "Выезд")
Результат:Вопрос: Какие должны быть связи между итими запросами чтобы получилось:
Сотрудник|ВремяВхода|ВремяВыхода|День
Сейчас получается вот так:
А должно:
Сотрудник | ВремяВхода |ВремяВыхода |День
Сотрудник1| 08.09.2015 7:36:00 | 08.09.2015 10:53:00|8
Сотрудник1| 08.09.2015 15:00:00| 08.09.2015 16:34:00|8
Видно что записи связываются не правильно. Помогите плиз...
Автор: sava1 21.09.15, 10:57
в первом запросе мин(период) как времяВхода
во втором мах() Время выхода
объдинить результат и сгруппировать
Автор: kosalex 21.09.15, 11:33
Цитата(sava1 @ 21.09.15, 11:57)
в первом запросе мин(период) как времяВхода
во втором мах() Время выхода
объдинить результат и сгруппировать
Что то не получается...у меня ситуация когда сотрудник может выйти и зайти несколько раз за рабочий день
Автор: sava1 21.09.15, 11:45
А видеть это как надо?
Автор: kosalex 21.09.15, 11:52
Цитата(sava1 @ 21.09.15, 12:45)
А видеть это как надо?
"Это" - это что? код или то что сотрудник может зайти и выйти несколько раз?
Вот код:
ВЫБРАТЬ
ДанныеПроходныхКОДОС.Сотрудник,
ДанныеПроходныхКОДОС.ТабельныйНомер,
ДанныеПроходныхКОДОС.График,
ДанныеПроходныхКОДОС.ПодразделениеОрганизации,
ДЕНЬ(ДанныеПроходныхКОДОС.Период1) КАК День,
МИНИМУМ(ДанныеПроходныхКОДОС.Период) КАК ВремяВход,
NULL КАК ВремяВыход
ИЗ
РегистрСведений.ДанныеПроходныхКОДОС КАК ДанныеПроходныхКОДОС
ГДЕ
ДанныеПроходныхКОДОС.Период МЕЖДУ &ПериодНачало И &ПериодКонец
И ДанныеПроходныхКОДОС.Сотрудник В(&Сотрудник)
И (ДанныеПроходныхКОДОС.Событие = "Вход"
ИЛИ ДанныеПроходныхКОДОС.Событие = "Въезд")
СГРУППИРОВАТЬ ПО
ДанныеПроходныхКОДОС.Сотрудник,
ДанныеПроходныхКОДОС.ТабельныйНомер,
ДанныеПроходныхКОДОС.ПодразделениеОрганизации,
ДанныеПроходныхКОДОС.График,
ДЕНЬ(ДанныеПроходныхКОДОС.Период1)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДанныеПроходныхКОДОС.Сотрудник,
ДанныеПроходныхКОДОС.ТабельныйНомер,
ДанныеПроходныхКОДОС.График,
ДанныеПроходныхКОДОС.ПодразделениеОрганизации,
ДЕНЬ(ДанныеПроходныхКОДОС.Период1),
NULL,
МАКСИМУМ(ДанныеПроходныхКОДОС.Период)
ИЗ
РегистрСведений.ДанныеПроходныхКОДОС КАК ДанныеПроходныхКОДОС
ГДЕ
ДанныеПроходныхКОДОС.Период МЕЖДУ &ПериодНачало И &ПериодКонец
И ДанныеПроходныхКОДОС.Сотрудник В(&Сотрудник)
И (ДанныеПроходныхКОДОС.Событие = "Выход"
ИЛИ ДанныеПроходныхКОДОС.Событие = "Выезд")
СГРУППИРОВАТЬ ПО
ДанныеПроходныхКОДОС.Сотрудник,
ДанныеПроходныхКОДОС.ПодразделениеОрганизации,
ДанныеПроходныхКОДОС.ТабельныйНомер,
ДанныеПроходныхКОДОС.График,
ДЕНЬ(ДанныеПроходныхКОДОС.Период1)
Результат:
Автор: sava1 21.09.15, 11:53
Цитата(kosalex @ 21.09.15, 12:52)
то что сотрудник может зайти и выйти несколько раз
Автор: kosalex 21.09.15, 11:55
Посмотрите пожалуйста первый пост. Без обид, думал что будет понятно. Как есть сейчас - на картинке, а ниже текстом написано как мне надо. Красным квадратом выделено то что сотрудник может входить и выходить несколько раз за рабочий день.
Автор: sava1 21.09.15, 11:59
Нужно показывать все входы и выходы?
Автор: kosalex 21.09.15, 12:04
Цитата(sava1 @ 21.09.15, 12:59)
Нужно показывать все входы и выходы?
Нужно получить табель с отработанным временем.
Сотрудник может войти и выйти один раз, а может несколько раз войти и выйти. нужно посчитать время нахождения его на предприятии, т.е. от выхода2 отнять вход2 = время2, от выхода1 отнять вход1 = время1
Отработанное время за день = Время1+Время2
Автор: sava1 21.09.15, 12:06
Когда-то обсуждалась эта тема и я предлагал - время входа регистрировать с минусом - в итоге отработанное время находится простым суммированием.
Автор: kosalex 21.09.15, 12:08
Цитата(sava1 @ 21.09.15, 13:06)
Когда-то обсуждалась эта тема и я предлагал - время входа регистрировать с минусом - в итоге отработанное время находится простым суммированием.
Оно и так найдется простым суммированием, тут дело то в другом. По моему без разницы с минусом писать или без если не получается в выборке получить запись Сотрудник/ВремяВход/ВремяВыхода/День
Автор: sava1 21.09.15, 12:11
Не надо ВремяВход,ВремяВыход -
Выбираем входы с минусом, выходы с плюсом в одну колонку Отработанное время
Группируем выборку по сотрудник,дата
Автор: kosalex 21.09.15, 12:15
Цитата(sava1 @ 21.09.15, 13:11)
Не надо ВремяВход,ВремяВыход -
Выбираем входы с минусом, выходы с плюсом в одну колонку Отработанное время
Группируем выборку по сотрудник,дата
Угу)
А как быть в моем случае с событием вход/выход?
Автор: sava1 21.09.15, 12:17
Select .......
SUM(CASE WHEN ДанныеПроходныхКОДОС.Событие = "Вход" ИЛИ ДанныеПроходныхКОДОС.Событие = "Въезд") THEN -Период ELSE Период END) as OtrabVremya
Автор: kosalex 21.09.15, 12:28
Цитата(sava1 @ 21.09.15, 13:17) http://pro1c.org.ua/index.php?act=findpost&pid=103251
Select .......
SUM(CASE WHEN ДанныеПроходныхКОДОС.Событие = "Вход" ИЛИ ДанныеПроходныхКОДОС.Событие = "Въезд") THEN -Период ELSE Период END) as OtrabVremya
А "-Период" не получить, там тип дата ((
Автор: sava1 21.09.15, 12:31
Преобразовать время к числу (Период для примера)
Автор: kosalex 21.09.15, 12:33
Цитата(sava1 @ 21.09.15, 13:31)
Преобразовать время к числу (Период для примера)
В запросе преобразовать получиться?
Или лучше выгруззить в ТЗ и там уже проставить минусы?
Автор: sava1 21.09.15, 12:35
Счас не вспомню, но никто не отменял Выразить,Подстрока
Автор: kosalex 21.09.15, 12:37
Цитата(sava1 @ 21.09.15, 13:35)
Счас не вспомню, но никто не отменял Выразить,Подстрока
ВЫРАЗИТЬ...не хочет работать с датой
Автор: sava1 21.09.15, 12:46
ВЫРАЗИТЬ(РАЗНОСТЬДАТ(Дата1, Дата2, Секунда))
Вместо дата1/Дата2 подставлять НАЧАЛОПЕРИОДА(Период, Секунда)
Автор: kosalex 21.09.15, 12:59
Цитата(sava1 @ 21.09.15, 13:46)
ВЫРАЗИТЬ(РАЗНОСТЬДАТ(Дата1, Дата2, Секунда))
Вместо дата1/Дата2 подставлять НАЧАЛОПЕРИОДА(Период, Секунда)
нет такого как секунда :-)
Автор: andr_andrey 21.09.15, 13:17
Цитата(kosalex @ 21.09.15, 13:04)
Нужно получить табель с отработанным временем.
Сотрудник может войти и выйти один раз, а может несколько раз войти и выйти. нужно посчитать время нахождения его на предприятии, т.е. от выхода2 отнять вход2 = время2, от выхода1 отнять вход1 = время1
Отработанное время за день = Время1+Время2
...
Не всё так просто, сотрудник может войти не один раз подряд, и выйти не один раз подряд, пропуском щёлкнул, но не прошёл, замешкался, забыл что-то в шкафчике, позвал начальник назад.
Автор: kosalex 21.09.15, 13:20
Цитата(andr_andrey @ 21.09.15, 14:17)
Не всё так просто, сотрудник может войти не один раз подряд, и выйти не один раз подряд, пропуском щёлкнул, но не прошёл, замешкался, забыл что-то в шкафчике, позвал начальник назад.
Согласен. Этого в задаче нет, сотрудник входит и выходит, может сделать это несколько раз. Если он зашел и не вышел и т.п. то это уже отслеживает ОК.
Автор: sava1 21.09.15, 13:28
Цитата(kosalex @ 21.09.15, 13:59)
нет такого как секунда :-)
Да уж на автомате
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua