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

1. Артем Безымянный (ArBus) 25.01.13 01:50
При обходе результата запроса обрабатываются только те записи, у которых тип=ИтогПоГруппировке. Детальных записей нет. Почему?

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

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

Ответы

2. Rushan Sadretdinov (Rulllan) 25.01.13 07:25
В цикле надо обходить детальные записи ещё одним циклом.
3. Слава Кирлан (Ягг) 25.01.13 07:28
(1) ArBus, а потому что у тебя только оодин обход выборки -

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

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

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

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

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

2. Обычно делают две вложенные выборки
 Выборка=Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока Выборка.Следующий() цикл
  // тут итоги по группировкам
  вб2 = Выборка.Выбрать();
  пока Вб2.Следующий() цикл
   // тут детальные
  КонецЦикла;
КонецЦикла; 
...Показать Скрыть
burlakov_a_a; +1 Ответить 2
4. Артем Безымянный (ArBus) 25.01.13 09:45
(3) Сделал такие выборки:

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

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

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

как привести к след.виду:
05.01.13
Основное подразделение 100руб.
Обособленное подразделение 200руб.
5. Слава Кирлан (Ягг) 25.01.13 09:49
(4) ArBus, не мучайся, сделай вложенные циклы (способ 2 из (3)) это будет и правильнее и легче :)
6. Артем Безымянный (ArBus) 25.01.13 09:53
(5) так так и сделано, все равно не получается как надо
7. Артем Безымянный (ArBus) 25.01.13 09:58
(5) думаю, дело в тексте запроса. ИТОГИ. Но как нужно правильно написать?
8. Слава Кирлан (Ягг) 25.01.13 10:00
(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")


ЗЫ. А вобще это наверно можно сделать через виртуальнуюж таблицу оборотв с периодичностью день. Так наверно правильно будет.
9. Артем Безымянный (ArBus) 25.01.13 10:04
(8) СПАСИБО БОЛЬШОЕ! ВСЕ ПОЛУЧИЛОСЬ