|
Подскажите - как сделать такой расчет по дереву значений? | ☑ | ||
|---|---|---|---|---|
|
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) А я тебя наиграл, вот так это делается:
|
|||
|
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) Это мысль :)) А потом уже от нижних - к верхним двигаться - через Родителя
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |