Имеется периодический регистр сведений "ТВ_Программа" (см. рис)
Требуется при помощи запроса вычислять некоторую величину для блока передач по одному часу каждый (в примере - сумму длин , но не суть)
Проблема в том, что обе группировки - и внешняя и внутренняя ходят по всем передачам, а надо, чтобы внешняя срабатывала 1 раз на каждый час, а внутренняя - на каждую передачу ИЗ ЭТОГО ЧАСА.
Вот код
Что я делаю не так?
P.S. Группировки "ТВ_Программа.Период" и ниже внёс Конструктор, если их убрать - Запрос ругается.
Требуется при помощи запроса вычислять некоторую величину для блока передач по одному часу каждый (в примере - сумму длин , но не суть)
Проблема в том, что обе группировки - и внешняя и внутренняя ходят по всем передачам, а надо, чтобы внешняя срабатывала 1 раз на каждый час, а внутренняя - на каждую передачу ИЗ ЭТОГО ЧАСА.
Вот код
&НаСервереБезКонтекста
Функция ОпределитьМаксДлинуБлокаПрограммНаСервере(пчДатаСтарт, пчДатаФиниш, пбЭтоПерваяПоловина)
лчМаксДлина=0;
лсТекстЗапроса="ВЫБРАТЬ
| ТВ_Программа.Период КАК Период,
| ТВ_Программа.ТВ_Передача КАК ТВ_Передача,
| ТВ_Программа.ЭтоПерваяПоловина КАК ЭтоПерваяПоловина,
| ТВ_Программа.ЧасыСмещенияДоДругойПоловины КАК ЧасыСмещенияДоДругойПоловины,
| НАЧАЛОПЕРИОДА(ТВ_Программа.Период, ЧАС) КАК НачалоБлока
|ИЗ
| РегистрСведений.ТВ_Программа КАК ТВ_Программа
|ГДЕ
| ТВ_Программа.ЭтоПерваяПоловина = &ЭтоПерваяПоловина
| И МИНУТА(ТВ_Программа.Период) < 47
| И ТВ_Программа.Период МЕЖДУ &ДатаСтарт И &ДатаФиниш
|
|СГРУППИРОВАТЬ ПО
| НАЧАЛОПЕРИОДА(ТВ_Программа.Период, ЧАС),
| ТВ_Программа.ТВ_Передача,
| ТВ_Программа.Период,
| ТВ_Программа.ЭтоПерваяПоловина,
| ТВ_Программа.ЧасыСмещенияДоДругойПоловины
|
|УПОРЯДОЧИТЬ ПО
| Период,
| ТВ_Передача";
лаЗапрос=Новый Запрос;
лаЗапрос.Текст=лсТекстЗапроса;
лаЗапрос.УстановитьПараметр("ЭтоПерваяПоловина", пбЭтоПерваяПоловина);
лаЗапрос.УстановитьПараметр("ДатаСтарт", пчДатаСтарт);
лаЗапрос.УстановитьПараметр("ДатаФиниш", пчДатаФиниш);
ВыборкаЧас=лаЗапрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
Пока ВыборкаЧас.Следующий() Цикл
лсСоставБлока=""; лбПервыйРаз=Истина;
ВыборкаПередача=ВыборкаЧас.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
Пока ВыборкаПередача.Следующий() Цикл
Если лбПервыйРаз Тогда
лбПервыйРаз=Ложь;
Иначе
лсСоставБлока=лсСоставБлока+"/";
КонецЕсли;
лсСоставБлока=лсСоставБлока+ВыборкаПередача.ТВ_Передача.Наименование;
КонецЦикла; // ВыборкаПередача
лчДлина=СтрДлина(лсСоставБлока);
Если лчМаксДлина<лчДлина Тогда
лчМаксДлина=лчДлина;
КонецЕсли;
КонецЦикла; // ВыборкаЧас
Возврат лчМаксДлина;
КонецФункции
ПоказатьЧто я делаю не так?
P.S. Группировки "ТВ_Программа.Период" и ниже внёс Конструктор, если их убрать - Запрос ругается.
Прикрепленные файлы:
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(8) Только для красоты нужно 3 группировки
а то передачи идут не по порядку. Для суммарной длины наплевать, а вот для сверки ...
ВЫБРАТЬ
| ТВ_Программа.Период КАК Период,
| ТВ_Программа.ТВ_Передача КАК ТВ_Передача,
| ТВ_Программа.ЭтоПерваяПоловина КАК ЭтоПерваяПоловина,
| ТВ_Программа.ЧасыСмещенияДоДругойПоловины КАК ЧасыСмещенияДоДругойПоловины,
| НАЧАЛОПЕРИОДА(ТВ_Программа.Период, ЧАС) КАК НачалоБлока
|ИЗ
| РегистрСведений.ТВ_Программа КАК ТВ_Программа
|ГДЕ
| ТВ_Программа.ЭтоПерваяПоловина = &ЭтоПерваяПоловина
| И МИНУТА(ТВ_Программа.Период) < 47
| И ТВ_Программа.Период МЕЖДУ &ДатаСтарт И &ДатаФиниш
|
|УПОРЯДОЧИТЬ ПО
| НачалоБлока,
| Период
|ИТОГИ ПО
| НачалоБлока,
| Период,
| ТВ_Передача
Показатьа то передачи идут не по порядку. Для суммарной длины наплевать, а вот для сверки ...
(1)А почему не создать в самом запросе Для таблицы НачПериода И КонПериода, а потом объединится с другой таблицей по период между, например:
Код создания синтктического периода |
---|
ВЫБРАТЬ
ПланыПроизводстваОбороты.Номенклатура,
ПланыПроизводстваОбороты.ПериодДень,
СУММА(ПланыПроизводстваОбороты.КоличествоОборот) КАК План
ПОМЕСТИТЬ ВтПлан
ИЗ
РегистрНакопления.ПланыПроизводства.Обороты(, , Авто, ) КАК ПланыПроизводстваОбороты
СГРУППИРОВАТЬ ПО
ПланыПроизводстваОбороты.Номенклатура,
ПланыПроизводстваОбороты.ПериодДень
;
//////////////////////////////////////////////////////////// Показать |
(4)А в чем разница? Если он периодический брать Период как первое значение, а потом создать к нему нужное приращивание, если нет нужных значений для периода, то создать таблицу типа:
22.04.2019 начПериода 00.00 конПериода 01.00
22.04.2019 начПериода 01.00 конПериода 02.00
И т.д., а потом расположить в ней нужные значения по периодам
22.04.2019 начПериода 00.00 конПериода 01.00
22.04.2019 начПериода 01.00 конПериода 02.00
И т.д., а потом расположить в ней нужные значения по периодам
(4)Вот с регистром сведений:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
КурсыВалют.Период,
КурсыВалют.Валюта
ПОМЕСТИТЬ ВтКурс
ИЗ
РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ
КурсыВалют.Период МЕЖДУ &НачалоПериода И &КонецПериода
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВтКурс.Период КАК НачПериода,
ВтКурс.Валюта,
МАКСИМУМ(ЕСТЬNULL(ВтКурс1.Период, &КонецПериода)) КАК КонПериода
ИЗ
ВтКурс КАК ВтКурс
ЛЕВОЕ СОЕДИНЕНИЕ ВтКурс КАК ВтКурс1
ПО ВтКурс.Валюта = ВтКурс1.Валюта
И ВтКурс.Период < ВтКурс1.Период
СГРУППИРОВАТЬ ПО
ВтКурс.Период,
ВтКурс.Валюта
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот