ОбходРезультатаЗапроса.ПоГруппировкам

Страницы: 1

При обходе результата запроса обрабатываются только те записи, у которых тип=ИтогПоГруппировке. Детальных записей нет. Почему?

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

Выборка=Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка.Следующий() Цикл
Если Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке Тогда
ОбластьСтрокаПериод.Параметры.Период=Выборка.Период;
ОбластьСтрокаПериод.Параметры.СуммаПлатежей=Выборка.СуммаПлатежей;
ТабДок.Вывести(ОбластьСтрокаПериод);
Иначе
ОбластьСтрокаОбъект.Параметры.Заполнить(Выборка);
ТабДок.Вывести(ОбластьСтрокаОбъект);
КонецЕсли;
КонецЦикла;

Ответили: (3)

В цикле надо обходить детальные записи ещё одним циклом.


(1) ArBus, а потому что у тебя только оодин обход выборки -

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

этот обход выбирате записи только по 1 группировке (игнорируя детальные).

В твоем случае два варианта:
1. Оставить текст как есть, но
или убрать "ОбходРезультатаЗапроса.ПоГруппировкам", оставить:
Выборка=Запрос.Выполнить().Выбрать(); //будет линейный обход всех строк (итоговых и детальных).

или написать Выборка=Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.Прямой); -тот же самый эффект

Но 1-вым способом обычно не пользуются (даже не уверен что будет работать - чисто теоретически пишу :) )

2. Обычно делают две вложенные выборки

 Выборка=Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка.Следующий() цикл
  // тут итоги по группировкам
  вб2 = Выборка.Выбрать();
  пока Вб2.Следующий() цикл
   // тут детальные
  КонецЦикла;
КонецЦикла; 
...Показать Скрыть

Ответили: (4) (5)

(3) Сделал такие выборки:

Пока Выборка.Следующий() Цикл
Если Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке Тогда
ОбластьСтрокаПериод.Параметры.Период=Выборка.Период;
ОбластьСтрокаПериод.Параметры.СуммаПлатежей=Выборка.СуммаПлатежей;
ТабДок.Вывести(ОбластьСтрокаПериод);
ВыборкаДетали = Выборка.Выбрать();
Пока ВыборкаДетали.Следующий() Цикл
ОбластьСтрокаОбъект.Параметры.Заполнить(ВыборкаДетали);
ТабДок.Вывести(ОбластьСтрокаОбъект);
КонецЦикла;
КонецЕсли;
КонецЦикла;

В итоге, если, например, за 05.01.13г. есть платежи по разным подразделениям, то группировка по периоду идет 2раза... т.е.:

05.01.13
Основное подразделение 100руб.
05.01.13
Обособленное подразделение 200руб.

как привести к след.виду:
05.01.13
Основное подразделение 100руб.
Обособленное подразделение 200руб.

Ответили: (5)

(4) ArBus, не мучайся, сделай вложенные циклы (способ 2 из (3)) это будет и правильнее и легче :)

Ответили: (6) (7)

(5) так так и сделано, все равно не получается как надо

Ответили: (8)

(5) думаю, дело в тексте запроса. ИТОГИ. Но как нужно правильно написать?


(6) ArBus, ааа.. убери ты все эти проверки на типы записей (код плохо читаетатся - виноват, не заметил). :)

У тебя видимо "точность" поля период идет с секундами. Кодга ты выводищь отчет используешь формат отсчения времени, но для группировки "05.01.2013 00:00:01" и "05.01.2013 00:00:02" два соверщенно разных значения, и каждое группирвуется отдельно.

В запросе вместо

"|ВЫБРАТЬ
| период, ..."

напиши

"|ВЫБРАТЬ
| НачалоПериода(период, ДЕНЬ ) как период, ..."

т.е. уже в запросе приведи к началу дня (что бы "05.01.2013 00:00:01" и "05.01.2013 00:00:02" воспринимались как одно и тоже "05.01.2013 00:00:00")


ЗЫ. А вобще это наверно можно сделать через виртуальнуюж таблицу оборотв с периодичностью день. Так наверно правильно будет.

Изменено: Ягг - 25.01.13 10:03

Ответили: (9)

(8) СПАСИБО БОЛЬШОЕ! ВСЕ ПОЛУЧИЛОСЬ

Страницы: 1
Форма ответов
Логин:
Пароль:
Текст сообщения*
Прикрепить файл