Имя: Пароль:
1C
 
Подскажите - как сделать такой расчет по дереву значений?
0 Невский Александр
 
17.05.10
15:09
Есть дерево значений, одна колонка имеет числовое значение. Подскажите, как можно рассчитать среднее значение в нем следующим образом - нужно взять строки самых нижних уровней, рассчитать среднее значение (сумму по строкам / количество элементов) и подставить в более высший и так до конца - до самого верха.
Может кто сталкивался? Может как-нить рекурсией это можно решить?
1 Mitriy
 
17.05.10
15:11
Итог тебе в помощь...
2 Невский Александр
 
17.05.10
15:13
За Итог спасибо конечно - но самое главное, как посчитать - с самых нижних уровней к самым верхним?
3 Mitriy
 
17.05.10
15:15
посчитать количество строк во всех уровнях, а потом разделить на это количество итог по всем строкам, например... Ну, или просто собрать итоги и количество по всем уровням... в чем именно затык?
4 Jstunner
 
17.05.10
15:17
Не вижу проблем. Рекурсия. Добираешься до нижних уровней, считаешь среднее, возвращаешь его на верхний уровень. Считаешь среднее у всех остальных веток и получаешь среднее на текущем уровне. Все просто.
5 Лефмихалыч
 
17.05.10
15:17
(0) заменить дерево на таблицу и засунуть ее в дапрос
6 Невский Александр
 
17.05.10
15:22
(4) Все правильно .. Еще бы разобраться - как это сделать :)
С деревом до этого вообще не работал
7 Mitriy
 
17.05.10
15:23
(6) у дерева есть свойство Строки (коллекция), а у каждой строки есть тоже свойсво Строки, они могут быть, а могут и не быть (СтрокаДерева.Строки.Количество() = 0)
8 Abracadabra
 
17.05.10
15:24
(0) можно все в СКД посчитать, а потом это выгрузить в дерево значений.
9 Лефмихалыч
 
17.05.10
15:24
(6) рекурсия делается вот так:

Функция ХлебнутьФантыИТормознутьСервер(СтрокиДереваЗначений)
  Возврат ХлебнутьФантыИТормознутьСервер(СтрокиДереваЗначений.Строки);
КонецФункции
ХлебнутьФантыИТормознутьСервер(ТвоеДерево.Строки);
10 Mitriy
 
17.05.10
15:25
(7)+
КоллекцияСтрокДереваЗначений (ValueTreeRowCollection)
Итог (Total)
Синтаксис:
Итог(<Колонка>, <Включать подчиненные>)
Параметры:
<Колонка> (обязательный)
Тип: Число, Строка, КолонкаДереваЗначений. Колонка, по которой подсчитывается итог.
В качестве значения параметра может быть передан индекс колонки, имя колонки, либо колонка дерева значений.
<Включать подчиненные> (необязательный)
Тип: Булево. Определяет, будут ли включены в сумму итоги по подчиненным строкам (если таковые имеются). Истина - итоги будут включены.
Значение по умолчанию: Ложь
11 Невский Александр
 
17.05.10
15:25
(7) (9) Все это я знаю
Как перебирать строки - через свойство Строки?
12 Новиков
 
17.05.10
15:26
А запрос можно к плоской тз написать с итогами по твоим полям? Если да - то совсем просто. В запрос ее как параметр и итоги по. Если нет - тогда собери сначала правильное тз, потом итоги посчитай.
13 Лефмихалыч
 
17.05.10
15:28
(11) А я тебя наиграл, вот так это делается:

Функция ХлебнутьФантыИТормознутьСервер(СтрокиДереваЗначений)
  Для каждого Строка СтрокиДереваЗначений.Строки Цикл
     ХлебнутьФантыИТормознутьСервер(Строка.Строки);
  КонецДля
КонецФункции
ХлебнутьФантыИТормознутьСервер(ТвоеДерево.Строки);
[\1C]
14 Фокусник
 
17.05.10
15:28
(11) Для Каждого Строка из Дерево.Строки Цикл :)
15 Лефмихалыч
 
17.05.10
15:29
даштозаёманарот!.. Вот что трудного - сделать кнопочку, которая бы обрамляла код правильными тэгами?..
16 Jstunner
 
17.05.10
15:32
Функция Ф(Строки)
 С = 0;
 Для Каждого Й Из Строки Цикл
   С = С + Ф(Й);
 КонецЦикла;
 Возврат С/Макс(1,Строки.Количество());
КонецФункции
17 Maniac
 
17.05.10
15:33
Функция ХлебнутьФантыИТормознутьСервер(СтрокиДереваЗначений)
 РодительскаяСтрока = СтрокиДереваЗначений.Строки;
 
 НафигачилиКоличество = 0;
 Сумма = 0;
 Для каждого Строка Из РодительскаяСтрока Цикл
    НафигачилиКоличество = НафигачилиКоличество + 1;
    Сумма = Сумма + Строка.КакаяТоХреноСумма;
 КонецДля

 РодительскаяСтрока.СредняяФигня = Сумма/НафигачилиКоличество;
 
 ХлебнутьФантыИТормознутьСервер(РодительскаяСтрока);
КонецФункции
18 Лефмихалыч
 
17.05.10
15:35
(17) ошибко - итератор для значения не оперделен
19 Maniac
 
17.05.10
15:36
Правда 17 будет заполнять только для верхней строки. Для того чтобы вообще по всем строкам дерева сичталось( если многоувровная фигня тогда надо не так.
20 Невский Александр
 
17.05.10
15:40
СформироватьМассивНижнихУровней(Новый Массив,ДеревоРезультатов);

Процедура СформироватьМассивНижнихУровней(МассивНижнихУровней,Дерево)
   Если Дерево.Строки.Количество() = 0 Тогда
       МассивНижнихУровней.Добавить(Дерево);
   Иначе
       Для Каждого Строка ИЗ Дерево.Строки Цикл    
           СформироватьМассивНижнихУровней(МассивНижнихУровней,Строка);
       КонецЦикла;
   КонецЕсли;
КонецПроцедуры

Интересно - а такой кусок программки мне правильно заполнит массив - самыми нижними уровнями дерева?
21 Maniac
 
17.05.10
15:46
(20) проще сделать в дереве колонку с галкой. промаркировать дерево галками - нижние элементы. достаточно просто сделать.
И потом методом НастиСтроки - получить весь массив нижних строк.
22 Невский Александр
 
17.05.10
15:47
(21) Это мысль :)) А потом уже от нижних - к верхним двигаться - через Родителя
Основная теорема систематики: Новые системы плодят новые проблемы.