Запрос к периодическому регистру сведений #801033


#0 by first_may
Добрый день. В базе есть периодический регистр сведений с измерением «Контрагент» и ресурсом «Менеджер». Подскажите пож, как с помощью запроса собрать данные по периодам, в течение которых у контрагента был тот или иной менеджер?
#1 by Лефмихалыч
Выбрать Период ИЗ регистрСведений.ПериодическийРегистрСведений ГДЕ Контрагент = &Контрагент и Менеджер = &ОпределенныйМенеджер
#2 by first_may
так получается  только дата.. а как получить таблицу из колонок С     По    Контрагент     Менеджер
#3 by Cyberhawk
Кастуй в ветку ))
#4 by first_may
почему он? :)
#5 by Cyberhawk
Славится умением (и пониманием) в запросах мутить всякую магию
#6 by kumena
есть и другие, которые как минимум не хуже пишут.
#7 by first_may
Хотелось бы научиться :)
#8 by Лефмихалыч
Тогда во временную, потом ещё одну временную с менеджер<>, потом ту с этой соединить по условию период<период и выбрать максимум периодов, и результат ещё раз соединить с самой первой временной. Поищи 'срез последних на каждую дату' - это один и самых распространенных шаблонов проектирования у 1сников
#9 by SleepyHead
Если запросы не знаешь, выгружай в таблицу значений результат простого запроса, в виде сортируй по дате начала, добавляй колонку "дата окончания", пробегайся по строкам таблицы и проставляй дату окончания. Не буду писать, как это сделать, догадайся.
#10 by KishMish
я так понял, есть данные на каждую дату Дата Контрагент Менеджер Надо сделать эту таблицу периодами? ДатаНач  ДатаКон  КОнтрагент Менеджер Если да то вот этот кусок кода это делает ////////////////////////////////////////////////////////////////////////////////                                                     ВЫБРАТЬ                                                         в_Графики.Сотрудник,                                                 ГДЕ                                                         НЕ вт_Данные.Сотрудник ЕСТЬ NULL                                                     И (вт_ДанныеП.ДатаВыхода ЕСТЬ NULL                                                             ИЛИ вт_ДанныеС.ДатаВыхода ЕСТЬ NULL)                                         ;                                                         вт_ГотовыеПериоды.ДатаНачала,                                                             И (вт_Данные.ДатаВыхода МЕЖДУ вт_ГотовыеПериоды.ДатаНачала И вт_ГотовыеПериоды.ДатаОкончания)                                                                                              СГРУППИРОВАТЬ ПО
#11 by KishMish
+ если есть вопросы тексту запроса задавай Основная тема такая Ищем Границы периодов - вт_ПоискГраниц Потом получаем периоды - вт_ГотовыеПериоды А потом соединяем вт_ГотовыеПериоды с данными
#12 by first_may
СПСАИБО!!!
#13 by first_may
а вот тут ВЫБРАТЬ                                                         вт_Данные.ДатаВыхода КАК ДатаВыхода,                                                     вт_Данные.Сотрудник,                                                 ГДЕ                                                         НЕ вт_Данные.Сотрудник ЕСТЬ NULL                                                     И (вт_ДанныеП.ДатаВыхода ЕСТЬ NULL                                                             ИЛИ вт_ДанныеС.ДатаВыхода ЕСТЬ NULL)                                         ;                                                     (ДОБАВИТЬКДАТЕ(вт_Данные.ДатаВыхода, ДЕНЬ, 1) = вт_ДанныеС.ДатаВыхода) ??
#14 by KishMish
таблица вт_Данные должна содержать данные на каждый день интерисуемого периода без пропусков. То есть в твоем случае тебе в таблице Данные нужно сделать так чтобы было Период     Контрагент   Менеджер 01.01.2017 Контрагент1 Менеджер1 02.01.2017 Контрагент1 Менеджер1 03.01.2017 Контрагент1 Менеджер1 03.01.2017 Контрагент1 Менеджер2 04.01.2017 Контрагент1 Менеджер2 05.01.2017 Контрагент1 Менеджер2 ... 01.01.2017 Контрагент2 Менеджер3 02.01.2017 Контрагент2 Менеджер3 03.01.2017 Контрагент2 Менеджер3 03.01.2017 Контрагент2 Менеджер3 04.01.2017 Контрагент2 Менеджер2 05.01.2017 Контрагент2 Менеджер2 ... и так далее. то есть то есть состояние на каждый день, для каждой совокупности Контрагент Менеджер. Ты сможешь ее получить? и далее при получении вт_ПоискГраниц код твой будет такой             И вт_Данные.Контрагент = вт_ДанныеП.Контрагент     И вт_Данные.Менеджер = вт_ДанныеП.Менеджер
#15 by KishMish
+ ГДЕ                                                         НЕ вт_Данные.Контрагент ЕСТЬ NULL                                                     И (вт_ДанныеП.ДатаВыхода ЕСТЬ NULL                                                             ИЛИ вт_ДанныеС.ДатаВыхода ЕСТЬ NULL)
#16 by KishMish
и ответ на почему именно (ДОБАВИТЬКДАТЕ(вт_Данные.ДатаВыхода, ДЕНЬ, 1) = вт_ДанныеС.ДатаВыхода) я соеденяю таблицу со следующим днем (ДОБАВИТЬКДАТЕ(вт_Данные.ДатаВыхода, ДЕНЬ, 1) = вт_ДанныеС.ДатаВыхода) и с предыдущим  ПО (ДОБАВИТЬКДАТЕ(вт_Данные.Период, ДЕНЬ, -1) = вт_ДанныеП.Период)
#17 by first_may
а у меня нет следующего дня, так как есть например запись 01.05.2011 .. 03.08.2011 ..
#18 by first_may
"то есть состояние на каждый день" - такого нет, есть большой промежуток между датами..
#19 by KishMish
сделай из нее таблицу на все даты. как делать? найти в инете как запросом получить курсы валют на каждый день. и сделай по тому типу свою например там используется ПроизводсвенныйКалендарь. Если у тебя нет календаря, то тогда тебе нужно сформировать  таблицу дат. это запрос тоже можно в инете найти.
#20 by Diman000
В детали сабжа я не вникал, но навскидку в не самый плохой вариант предложен. Сервер SQL мощная штука, смекалистая и многое умеет оптимизировать. Я про MS, с остальными в промышленном масштабе не работал. Но задачи сложные для запросов частенько лучше решать кодом на сервере приложений, чем придумывать или искать хитрые решения, которые могут прилично нагрузить сервер СУБД.
#21 by 1dvd
+1
#22 by first_may
надо одним запросом :), без таблиц.
#23 by 1dvd
кому надо?
#24 by Naf2017
#25 by Diman000
Присоединяюсь к вопросу Кому надо? Есть процедура или функция которая обрабатывает именно результат запроса? Тогда ее надо немного подправить, это недолго. Есть динамический список в который хочется зафигачить этот запрос? Тогда этого делать нельзя, это прилично затормозит форму. Лучше переписать на статическую таблицу. Но это долго. Но надо. Ну и третий вариант, тебе поставили задачу выдать именно РезультатЗапроса? В таком случае надо включить свою голову и обосновать постановщику почему это плохо. Могут быть и еще варианты, мне было бы интересно их услышать.
#26 by KishMish
метод решения зависит от предполагаемого количества строк в результате. При большом количество строк в выходной таблице обработка строк в цикле будет намного дольше чем запросом.
#27 by Diman000
Согласен, хороший аргумент.
#28 by first_may
Для саморазвития надо сделать только с помощью запроса :).
#29 by Diman000
Если все так серьезно, то загляните сразу в профайлер SQL. Для саморазвития очень полезно)
#30 by first_may
добрый день.. тут ВЫБРАТЬ                                                         в_Графики.Сотрудник,                                                 я понимаю, что в_Графики - это календарь дней, то есть 01.01.., 02.01.. и  тд.. а вт_УказанныеРанее - ?
#31 by first_may
Спасибо всем. Разобрался.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С