Имя: Пароль:
1C
1С v8
Обход результата запроса ПоГруппировкамСИерархией
,
0 andrewks
 
20.11.11
20:17
есть такая процедурка:

Процедура ВыборкаПоГруппе(ТекВыб,Способ)

   инд=0;
   
   Пока ТекВыб.Следующий() Цикл
       Преф="Уровень: "+ТекВыб.Уровень();
       инд=инд+1;
       ТипЗап=ТекВыб.ТипЗаписи();
       Если (ТипЗап=ТипЗаписиЗапроса.ИтогПоГруппировке) ИЛИ (ТипЗап=ТипЗаписиЗапроса.ИтогПоИерархии) Тогда
           Преф=Преф+"; "+"ИТОГ ПО: "+ТекВыб.Группировка();
       ИначеЕсли (ТипЗап=ТипЗаписиЗапроса.ОбщийИтог) Тогда
           Преф=Преф+"; "+"ОБЩИЙ ИТОГ: ";
       ИначеЕсли (ТипЗап=ТипЗаписиЗапроса.ДетальнаяЗапись) Тогда
           Преф=Преф+"; "+"Детальная запись: ";
       КонецЕсли;
       
       Сообщить(Преф+"; "+"№"+(инд)+": "+ТекВыб.Материал+Символы.Таб+ТекВыб.Накладная+Символы.Таб+ТекВыб.Склад+Символы.Таб+ТекВыб.Количество+Символы.Таб+ТекВыб.Сумма);
       ВыборкаПоГруппе(ТекВыб.Выбрать(Способ),Способ);
   КонецЦикла;    
КонецПроцедуры


вызываю так:

//ТипОбхода=ОбходРезультатаЗапроса.Прямой;
   ТипОбхода=ОбходРезультатаЗапроса.ПоГруппировкамСИерархией;
   //ТипОбхода=ОбходРезультатаЗапроса.ПоГруппировкам;
   Выборка=РезЗапр.Выбрать(ТипОбхода);
   
   Сообщить("Выборка:");
   ВыборкаПоГруппе(Выборка,ТипОбхода);


никак не разберу, почему при способах Прямой и ПоГруппировкам всё выводится, как надо, а при ПоГруппировкамСИерархией происходит затык после вывода уровня выборки 1 (Следующий() возвращает Ложь)? где косяк?
1 andrewks
 
20.11.11
21:48
есть мысли?
2 Лефмихалыч
 
20.11.11
21:54
в запрсе что?
3 andrewks
 
20.11.11
21:58
| select
   |  ПрихНаклМат.Материал
   | ,ПрихНакл.Ссылка as Накладная
   | ,ПрихНакл.Склад
   | ,sum(ПрихНаклМат.Количество)
   | ,sum(ПрихНаклМат.Сумма)
   | from
   |  Документ.ПриходнаяНакладная as ПрихНакл
   | right join
   |  Документ.ПриходнаяНакладная.Материалы as ПрихНаклМат
   | on ПрихНакл.Ссылка=ПрихНаклМат.Ссылка
   | group by
   |  ПрихНаклМат.Материал
   | ,ПрихНакл.Ссылка
   | order by
   |  ПрихНаклМат.Материал
   | ,ПрихНакл.Ссылка
   | totals by
   | ПрихНаклМат.Материал hierarchy
4 Лефмихалыч
 
20.11.11
22:24
нет идей...
5 andrewks
 
20.11.11
22:31
странно. код практически один в один как в ЖКК, там он приведён как рабочий именно для обхода ПоГруппировкамСИерархией
попробовал сейчас в файловой базе - то же самое
6 andrewks
 
20.11.11
22:55
чё-то такое ощущение складывается, что в этом вопросе в ЖКК опять звиздёжь и провокация.

куча тем в инете, но пока не нашёл ни одного внятного ответа по этому вопросу
7 andrewks
 
20.11.11
23:06
v8: v8: Выборка с иерархией - как обойти иерархию ПоГруппировкамСИерархией

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

в документации наглая ложь
8 mikecool
 
20.11.11
23:06
переделай на левое соединение запрос
9 andrewks
 
20.11.11
23:10
(8) это не влияет, тоже обходит не так, как заявлено разработчиками в документации

причём тема с бородой, ветки аж с 2008 г. идут, и до сих пор никаких сдвигов, ни реализацию, ни документацию поправить не потрудились
10 andrewks
 
21.11.11
09:52
короче, если универсально, то получается так:


Процедура ВыборкаПоГруппе(ТекВыб,Способ)
   инд=0;
   
   Пока ТекВыб.Следующий() Цикл
       Преф="Уровень: "+ТекВыб.Уровень();
       инд=инд+1;
       ТипЗап=ТекВыб.ТипЗаписи();
       Если (ТипЗап=ТипЗаписиЗапроса.ИтогПоГруппировке) Тогда
           Преф=Преф+"; "+"ИТОГ ПО: "+ТекВыб.Группировка();
       ИначеЕсли (ТипЗап=ТипЗаписиЗапроса.ИтогПоИерархии) Тогда
           Преф=Преф+"; "+"ИТОГ ПО ИЕРАРХИИ: "+ТекВыб.Группировка();
       ИначеЕсли (ТипЗап=ТипЗаписиЗапроса.ОбщийИтог) Тогда
           Преф=Преф+"; "+"ОБЩИЙ ИТОГ: ";
       ИначеЕсли (ТипЗап=ТипЗаписиЗапроса.ДетальнаяЗапись) Тогда
           Преф=Преф+"; "+"Детальная запись: ";
       КонецЕсли;
       
       Сообщить(Преф+"; "+"№"+(инд)+": "+ТекВыб.Материал+Символы.Таб+ТекВыб.Накладная+Символы.Таб+ТекВыб.Склад+Символы.Таб+ТекВыб.Количество+Символы.Таб+ТекВыб.Сумма);
       Если (ТипЗап=ТипЗаписиЗапроса.ИтогПоИерархии) Тогда
           СледВыб=ТекВыб.Выбрать(Способ,ТекВыб.Группировка());
       Иначе
           СледВыб=ТекВыб.Выбрать(Способ);
       КонецЕсли;
       ВыборкаПоГруппе(СледВыб,Способ);
   КонецЦикла;    
КонецПроцедуры