Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Выборка из запроса  (Прочитано 11503 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
jonik_joker
Участник

ru
Offline Offline

« : 27-09-2013 11:20 » 

Всем привет. Вопрос может простой , так что заранее сорри.
Есть запрос

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

        ОбластьСтрока.Параметры.НомерЗаказ=СтрокаДанных.НомерЗаказ;
    ОбластьСтрока.Параметры.НомерЗаявка=СтрокаДанных.НомерЗаявка;
    ОбластьСтрока.Параметры.ДатаЗаявка=СтрокаДанных.ДатаЗаявка;
    ОбластьСтрока.Параметры.НомерИнвойс=СтрокаДанных.НомерИнвойс;
    ОбластьСтрока.Параметры.ДатаИнвойс=СтрокаДанных.ДатаИнвойс;
    ОбластьСтрока.Параметры.СуммаИнвойс=СтрокаДанных.СуммаИнвойс;
    ОбластьСтрока.Параметры.СуммаЗаявка=СтрокаДанных.СуммаЗаявка;
    ОбластьСтрока.Параметры.СуммаИнвойс=СтрокаДанных.СуммаПриход;
    ОбластьСтрока.Параметры.СуммаЗаявка=СтрокаДанных.СуммаЗаявка;
       
    ДокументДанных.Вывести(ОбластьЗаголовок);
    ДокументДанных.Вывести(ОбластьСтрока);
               
    КонецЦикла;
   
    Возврат ДокументДанных;


В результате выполнения получается табличка типа
...заявка инвойс...
...заявка инвойс...

но, в самом документе в 1 заявке может быть 2 инвойса, соответственно хотелось бы вывести
...заявка инвойс...
...       инвойс...

я понимаю что по регистру накоплений есть 2 записи по приходу от одной и той же заявки соответственно цикл эти 2 строки и выводит, но как вывести это одной строкой?
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 27-09-2013 12:27 » 

Для такой задачи (многоуровневая выборка) "ТаблицаДанных=Запрос.Выполнить().Выгрузить();" не предназначено.

1. Тебе в запросе нужно добавить Итоги (по заявке): легче всего это сделать через конструктор
2. Тебе потребуется 2 выборки: по заявкам и по инвойсам, см. в синтакс помощнике РезультатЗапроса.Выбрать()
2а. Обрати особое внимание на параметр метода Выбрать()

Когда прочитаешь и если останутся вопросы - пиши

Добавлено через 53 секунды:
P.S. Хотя можно и через Выгрузить(), но тоже с параметром. И потом разбираться с деревом значений ИМХО сложнее
« Последнее редактирование: 27-09-2013 12:28 от Kivals » Записан
jonik_joker
Участник

ru
Offline Offline

« Ответ #2 : 27-09-2013 12:40 » new

Kivals, да про дерево мне уже посоветовали, но там как-то я совсем невкуриваю что к чему
Записан
jonik_joker
Участник

ru
Offline Offline

« Ответ #3 : 30-09-2013 13:17 » 

прописал после запроса

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

ДокументДанных=Новый ТабличныйДокумент;



Макет=Отчеты.Отчет1.ПолучитьМакет("Макет1");
ОбластьШапкаЗаявки=Макет.ПолучитьОбласть("ШапкаЗаявки");
ОбластьЗаголовок=Макет.ПолучитьОбласть("Заголовок");
ОбластьСтрока=Макет.ПолучитьОбласть("Строка");

ОбластьШапкаЗаявки.Параметры.Клиент=Клиент;
ОбластьШапкаЗаявки.Параметры.Грузополучатель=Грузополучатель;
ДокументДанных.Вывести(ОбластьШапкаЗаявки);
ТекЗаявка=Неопределено;

     
Пока Выборка.Следующий() Цикл

Если Выборка.Заявка=ТекЗаявка Тогда

ОбластьСтрока.Параметры.НомерИнвойс=Выборка.НомерИнвойс;
ОбластьСтрока.Параметры.ДатаИнвойс=Выборка.ДатаИнвойс;
ОбластьСтрока.Параметры.СуммаИнвойс=Выборка.СуммаИнвойс;

                ДокументДанных.Вывести(ОбластьЗаголовок);
ДокументДанных.Вывести(ОбластьСтрока);

Иначе
ТекЗаявка=Выборка.Заявка;
ОбластьСтрока.Параметры.НомерЗаказ=Выборка.НомерЗаказ;
ДокументДанных.Вывести(ОбластьЗаголовок);
ДокументДанных.Вывести(ОбластьСтрока);
КонецЕсли;

              КонецЦикла;

Возврат ДокументДанных;
         
         
Почему то при первом обходе,  все параметры запроса ( если вставить Выборка в табло) имеют значение "Ошибка чтения значения".          
« Последнее редактирование: 02-10-2013 09:01 от jonik_joker » Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 02-10-2013 10:33 » 

Синтакс-помощник либо не читал, либо читал не внимательно: предложенный мною выше метод не используется.

Что касается последнего вопроса - то согласно СП Выборка вообще не имеет параметров.
Записан
jonik_joker
Участник

ru
Offline Offline

« Ответ #5 : 03-10-2013 19:15 » 

Kivals,  сорри, вчитался внимательней и написал так

Код:
ВыборкаПоЗаявке=РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

ДокументДанных.Вывести(ОбластьЗаголовок);    
Пока ВыборкаПоЗаявке.Следующий() Цикл

ОбластьСтрока.Параметры.НомерЗаказ=ВыборкаПоЗаявке.НомерЗаказ;
ОбластьСтрока.Параметры.НомерЗаявка=ВыборкаПоЗаявке.НомерЗаявка;
ОбластьСтрока.Параметры.ДатаЗаявка=ВыборкаПоЗаявке.ДатаЗаявка;
ОбластьСтрока.Параметры.НомерИнвойс=ВыборкаПоЗаявке.НомерИнвойс;
ОбластьСтрока.Параметры.ДатаИнвойс=ВыборкаПоЗаявке.ДатаИнвойс;
ОбластьСтрока.Параметры.СуммаИнвойс=ВыборкаПоЗаявке.СуммаИнвойс;
ОбластьСтрока.Параметры.СуммаЗаявка=ВыборкаПоЗаявке.СуммаЗаявка;
             
ДокументДанных.Вывести(ОбластьСтрока);

    ВыборкаПоИнвойсу=ВыборкаПоЗаявке.Выбрать();

Пока ВыборкаПоИнвойсу.Следующий() Цикл
ОбластьСтрока.Параметры.НомерИнвойс=ВыборкаПоИнвойсу.НомерИнвойс;
ОбластьСтрока.Параметры.ДатаИнвойс=ВыборкаПоИнвойсу.ДатаИнвойс;
ОбластьСтрока.Параметры.СуммаИнвойс=ВыборкаПоИнвойсу.СуммаИнвойс;

 ДокументДанных.Вывести(ОбластьСтрока);
 КонецЦикла;
КонецЦикла;

Возврат ДокументДанных;

В результате получился такой документ ( см. вложение ).

* Documents.xlsx (5.6 Кб - загружено 865 раз.)
« Последнее редактирование: 05-10-2013 11:31 от jonik_joker » Записан
jonik_joker
Участник

ru
Offline Offline

« Ответ #6 : 03-10-2013 19:42 » 

в принципе сойдет.Спасибо.
« Последнее редактирование: 05-10-2013 11:32 от jonik_joker » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines