Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 17:07

Объединения в запросе

Автор Ermak1985, 20 фев 2016, 11:48

0 Пользователей и 1 гость просматривают эту тему.

Ermak1985

Добрый день! После объединения регистров в запросе при выводе значение удваивается, можете подсказать почему?

ЗапросП = Новый Запрос;
ТекстЗапросаП = "ВЫБРАТЬ
                | ПланировщикРемонтныхЗаявок.Период КАК Период,
                | ПланировщикРемонтныхЗаявок.Мастер,
                | ПланировщикРемонтныхЗаявок.Количество,
                | ПланировщикРемонтныхЗаявок.ВремяЗаявки КАК ВремяЗаявки,
                | ПланировщикРемонтныхЗаявок.ТипУслуги
                |ИЗ
                | РегистрСведений.ПланировщикРемонтныхЗаявок КАК ПланировщикРемонтныхЗаявок
                |ГДЕ
                | ПланировщикРемонтныхЗаявок.ТипУслуги = &ТипУслуги
                |
                |УПОРЯДОЧИТЬ ПО
                | Период УБЫВ";

ЗапросП.УстановитьПараметр("ТипУслуги",ТипУслуги);

ЗапросП.Текст=ТекстЗапросаП;
РезультатП = ЗапросП.Выполнить().Выгрузить();

ПерваяДата=ДатаЗаявки;
ПоследняяДата=РезультатП[0].Период;
РазницаДат=(НачалоДня(ПоследняяДата)-НачалоДня(ПерваяДата))/(60*60*24);

Для Счетчик = 0 По РазницаДат Цикл
ДатаТ=НачалоДня(ДатаЗаявки+86400*Счетчик);

ЗапросВремени = Новый Запрос;
ТекстЗапросВремени = "ВЫБРАТЬ
                     | ПланировщикРемонтныхЗаявок.Период КАК Период,
                     | ПланировщикРемонтныхЗаявок.ВремяЗаявки КАК ВремяЗаявки,
                     | ПланировщикРемонтныхЗаявок.ТипУслуги,
                     | ПланировщикРемонтныхЗаявок.Мастер
                     |ИЗ
                     | РегистрСведений.ПланировщикРемонтныхЗаявок КАК ПланировщикРемонтныхЗаявок
                     |ГДЕ
                     | ПланировщикРемонтныхЗаявок.Период МЕЖДУ &ДатаНач И &ДатаКон
                           | И ПланировщикРемонтныхЗаявок.ТипУслуги = &ТипУслуги
                     |
                     |УПОРЯДОЧИТЬ ПО
                     | ВремяЗаявки";

ЗапросВремени.УстановитьПараметр("ТипУслуги",ТипУслуги);
ЗапросВремени.УстановитьПараметр("ДатаНач",НачалоДня(ДатаТ));
ЗапросВремени.УстановитьПараметр("ДатаКон",КонецДня(ДатаТ));

ЗапросВремени.Текст=ТекстЗапросВремени;
РезультатВремени = ЗапросВремени.Выполнить().Выбрать();

Пока РезультатВремени.Следующий() Цикл
ВремяЗ=РезультатВремени.ВремяЗаявки;
Мастер=РезультатВремени.Мастер;

Фильтр = Новый Структура();
Фильтр.Вставить("ВремяЗаявки",ВремяЗ);
Фильтр.Вставить("ТипУслуги",ТипУслуги);
КоличествоРЗ=РегистрыСведений.ПланировщикРемонтныхЗаявок.ПолучитьПоследнее(КонецДня(ДатаТ),Фильтр).Количество;

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

Запрос.УстановитьПараметр("ТипУсулги",ТипУслуги);
Запрос.УстановитьПараметр("Статус",Перечисления.СтатусЕдиноеОкно.Открыта);
Запрос.УстановитьПараметр("ВремяЗаявки",ВремяЗ);
Запрос.УстановитьПараметр("ДатаНач",НачалоДня(ДатаТ));
Запрос.УстановитьПараметр("ДатаКон",КонецДня(ДатаТ));

Запрос.Текст=ТекстЗапрос;
Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл             
КоличествоЗаявок=Результат.Количество;
КонецЦикла;

Если КоличествоЗаявок=Неопределено или КоличествоЗаявок < КоличествоРЗ или КоличествоРЗ=Неопределено Тогда
Ответ=Вопрос("Ближайшая свободная дата: "+Формат(ДатаТ,"ДФ=dd.MM.yyyy")+" время: "+ВремяЗ+Символы.ПС+"Вы хотите добавить заявку?",РежимДиалогаВопрос.ДаНет,0);
Если Ответ = КодВозвратаДиалога.Да Тогда
ДатаЗаявки=ДатаТ;
ВремяЗаявки=ВремяЗ;
Возврат
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;

LexaK

один из самый отвратительных кодов, которые я видел

Запрос1
Цикл1
    Запрос2 //запрос в цикле!!!
    Цикл2
        Запрос3 //запрос УЖЕ В ДВОЙНОМ цикле!!!
        Цикл3
        КонецЦикла3
    КонецЦикла2
КонецЦикла1

Постройте задачу так, что бы собрать нужные данные в одном запросе!

если помогло нажмите: Спасибо!

Ermak1985

Цитата: LexaK от 20 фев 2016, 12:15
один из самый отвратительных кодов, которые я видел

Запрос1
Цикл1
    Запрос2 //запрос в цикле!!!
    Цикл2
        Запрос3 //запрос УЖЕ В ДВОЙНОМ цикле!!!
        Цикл3
        КонецЦикла3
    КонецЦикла2
КонецЦикла1

Постройте задачу так, что бы собрать нужные данные в одном запросе!
Я думаю один запрос не получится так ка используется в первом Выгрузка а во втором Выборка, или есть другой вариант?

дфтын

ЛЮБЫЕ выборки можно сделать ОДНИМ запросом. ну Запрос может быть навороченный, но все же

LexaK

в данной задаче всего три регистра сведений! 

опишите подробно каждый регистр,
опишите связи между регистрами,

опишите при каких исходных данных, какой результат вам нужно получить.
если помогло нажмите: Спасибо!

Ermak1985

Цитата: LexaK от 20 фев 2016, 13:46
в данной задаче всего три регистра сведений! 

опишите подробно каждый регистр,
опишите связи между регистрами,

опишите при каких исходных данных, какой результат вам нужно получить.
Вот код

ЗапросП = Новый Запрос;
ТекстЗапросаП = "ВЫБРАТЬ
                | ПланировщикРемонтныхЗаявок.Период КАК Период,
                | ПланировщикРемонтныхЗаявок.Мастер,
                | ПланировщикРемонтныхЗаявок.Количество,
                | ПланировщикРемонтныхЗаявок.ВремяЗаявки КАК ВремяЗаявки,
                | ПланировщикРемонтныхЗаявок.ТипУслуги
                |ИЗ
                | РегистрСведений.ПланировщикРемонтныхЗаявок КАК ПланировщикРемонтныхЗаявок
                |ГДЕ
                | ПланировщикРемонтныхЗаявок.ТипУслуги = &ТипУслуги
                |
                |УПОРЯДОЧИТЬ ПО
                | Период УБЫВ";

ЗапросП.УстановитьПараметр("ТипУслуги",ТипУслуги);

ЗапросП.Текст=ТекстЗапросаП;
РезультатП = ЗапросП.Выполнить().Выгрузить();

ПерваяДата=ДатаЗаявки;
ПоследняяДата=РезультатП[0].Период;
РазницаДат=(НачалоДня(ПоследняяДата)-НачалоДня(ПерваяДата))/(60*60*24);

Для Счетчик = 0 По РазницаДат Цикл
ДатаТ=НачалоДня(ДатаЗаявки+86400*Счетчик);

ЗапросВремени = Новый Запрос;
ТекстЗапросВремени = "ВЫБРАТЬ
                     | ПланировщикРемонтныхЗаявок.Период КАК Период,
                     | ПланировщикРемонтныхЗаявок.ВремяЗаявки КАК ВремяЗаявки,
                     | ПланировщикРемонтныхЗаявок.ТипУслуги,
                     | ПланировщикРемонтныхЗаявок.Мастер
                     |ИЗ
                     | РегистрСведений.ПланировщикРемонтныхЗаявок КАК ПланировщикРемонтныхЗаявок
                     |ГДЕ
                     | ПланировщикРемонтныхЗаявок.Период МЕЖДУ &ДатаНач И &ДатаКон
                           | И ПланировщикРемонтныхЗаявок.ТипУслуги = &ТипУслуги
                     |
                     |УПОРЯДОЧИТЬ ПО
                     | ВремяЗаявки";

ЗапросВремени.УстановитьПараметр("ТипУслуги",ТипУслуги);
ЗапросВремени.УстановитьПараметр("ДатаНач",НачалоДня(ДатаТ));
ЗапросВремени.УстановитьПараметр("ДатаКон",КонецДня(ДатаТ));

ЗапросВремени.Текст=ТекстЗапросВремени;
РезультатВремени = ЗапросВремени.Выполнить().Выбрать();

Пока РезультатВремени.Следующий() Цикл
ВремяЗ=РезультатВремени.ВремяЗаявки;
Мастер=РезультатВремени.Мастер;

Фильтр = Новый Структура();
Фильтр.Вставить("ВремяЗаявки",ВремяЗ);
Фильтр.Вставить("ТипУслуги",ТипУслуги);
КоличествоРЗ=РегистрыСведений.ПланировщикРемонтныхЗаявок.ПолучитьПоследнее(КонецДня(ДатаТ),Фильтр).Количество;

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

Запрос.УстановитьПараметр("ТипУсулги",ТипУслуги);
Запрос.УстановитьПараметр("Статус",Перечисления.СтатусЕдиноеОкно.Открыта);
Запрос.УстановитьПараметр("ВремяЗаявки",ВремяЗ);
Запрос.УстановитьПараметр("ДатаНач",НачалоДня(ДатаТ));
Запрос.УстановитьПараметр("ДатаКон",КонецДня(ДатаТ));

Запрос.Текст=ТекстЗапрос;
Результат = Запрос.Выполнить().Выбрать();

Пока Результат.Следующий() Цикл             
КоличествоЗаявок=Результат.Количество;
КонецЦикла;

Если КоличествоЗаявок=Неопределено или КоличествоЗаявок < КоличествоРЗ или КоличествоРЗ=Неопределено Тогда
Ответ=Вопрос("Ближайшая свободная дата: "+Формат(ДатаТ,"ДФ=dd.MM.yyyy")+" время: "+ВремяЗ+Символы.ПС+"Вы хотите добавить заявку?",РежимДиалогаВопрос.ДаНет,0);
Если Ответ = КодВозвратаДиалога.Да Тогда
ДатаЗаявки=ДатаТ;
ВремяЗаявки=ВремяЗ;
Возврат
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;

Получаю ближайшую свободную дату и время из регистра ПланировщикРемонтныхЗаявок. В регистре ИсторияЗаявкиЕдиноеОкноГРО и ИсторияЗаявкиЕдиноеОкно записывается история созданных заявок. Не понятно почему выводит два раза одинаковую дату, должен один раз показать ближайшую дату и все. Это началось после того как я объеденил два регистра ИсторияЗаявкиЕдиноеОкноГРО и ИсторияЗаявкиЕдиноеОкно, до этого у меня было две функции и все работало нормально, я могу конечно все вернуть назада но мне очень интересно почему так стало

vitasw

Фиерически!
За такое я б сразу отрубал руки по самую зад***цу.
Двухуровневая вложенность запроса в цикле!!!

Ermak1985

Цитата: vitasw от 26 фев 2016, 11:29
Фиерически!
За такое я б сразу отрубал руки по самую зад***цу.
Двухуровневая вложенность запроса в цикле!!!
вы подскажите как правильно надо, чем критиковать

vitasw

Выкладывайте базу/конфу - покажу. Начну показывать на левых примерах - начнете задавать мильйоны вопросов.

Ermak1985

Цитата: vitasw от 26 фев 2016, 12:11
Выкладывайте базу/конфу - покажу. Начну показывать на левых примерах - начнете задавать мильйоны вопросов.
я бы с радостью но база очень большая и ест информация не для открытого доступа, пытался сделать отдельно но не получилось очень много привязок. Можете по пробовать подсказать на примере я думаю что пойму.
Спасибо

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск