Быстрое обновление веток дерева на управляемой форме. Как?

1. nomad_irk 80 25.10.24 19:56 Сейчас в теме
Дано: дерево на форме, числовые значения в листьях меняются случайным образом. Необходимо находить сумму числовых значений всех листьев и фиксировать в каждой ветке.

Факт изменения листьев известен.

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

Как это можно сделать?
По теме из базы знаний
Найденные решения
9. user2033930 25.10.24 20:59 Сейчас в теме
(8) Так может не надо пересчитывать всю ветку и все родительские ветки вверх по иерархии?
Может при начале изменения запоминать состояние листочка, после изменения получать дельту, и это дельту вверх по иерархии применить только к родителям?
nomad_irk; +1 Ответить
13. Sashares 35 25.10.24 21:53 Сейчас в теме
(12) Я имел в виду, что в дереве для значения предусмотреть 2 реквизита - текущее и старое.
Пользователи что-то отметили, когда алгоритм меняет значения в листе, считать дельту и менять на нее значение родителя.

Хранить старое значение бывает проще, чем запоминать текущее перед изменением.
nomad_irk; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. kuzev 48 25.10.24 20:17 Сейчас в теме
(1) Дерево большое? Сколько листьев на ветках?
3. nomad_irk 80 25.10.24 20:18 Сейчас в теме
(2) большое, на чем проверял - было 869 элементов в одной ветке.
4. kuzev 48 25.10.24 20:19 Сейчас в теме
(3) долго - это сколько в секундах?
5. nomad_irk 80 25.10.24 20:22 Сейчас в теме
(4) на память не вспомню, но это прям самая долгая операция, более 85% общего времени из вообще всех операций, судя по замеру производительности. Счет идет на 10ки секунд.
6. kuzev 48 25.10.24 20:25 Сейчас в теме
7. user2033930 25.10.24 20:33 Сейчас в теме
(5)
Счет идет на 10ки секунд.
Ну это что-то совсем непонятное...
8. nomad_irk 80 25.10.24 20:38 Сейчас в теме
(7) а чего не понятного? Изменились условно 2 листа ветки, нужно по всем листьям ветки пробежаться, изменился еще один лист - опять бежим по всем листьям ветки. Когда листьев в ветке в районе 1к, то будет в районе 1М итераций обновления 1ой ветки.
9. user2033930 25.10.24 20:59 Сейчас в теме
(8) Так может не надо пересчитывать всю ветку и все родительские ветки вверх по иерархии?
Может при начале изменения запоминать состояние листочка, после изменения получать дельту, и это дельту вверх по иерархии применить только к родителям?
nomad_irk; +1 Ответить
10. nomad_irk 80 25.10.24 21:08 Сейчас в теме
(9) хм, спасибо, попробую реализовать
11. Sashares 35 25.10.24 21:28 Сейчас в теме
(10) Или просто храните 2 значения - текущее и старое.
Сначала значения заполняются одинаково, а при изменении текущего получаем дельту со старым, правим все что нужно, и старое заполняем текущим.
12. nomad_irk 80 25.10.24 21:34 Сейчас в теме
(11) там еще есть небольшая сложность: могут меняться не все листья, а часть и по неизменной части суммы хотелось бы оставлять.

Условно: отметили галочками изменяемые листья/ветку целиком, она начала меняться, то что отмечали до этого не должно меняться
13. Sashares 35 25.10.24 21:53 Сейчас в теме
(12) Я имел в виду, что в дереве для значения предусмотреть 2 реквизита - текущее и старое.
Пользователи что-то отметили, когда алгоритм меняет значения в листе, считать дельту и менять на нее значение родителя.

Хранить старое значение бывает проще, чем запоминать текущее перед изменением.
nomad_irk; +1 Ответить
14. user2107184 25.10.24 21:58 Сейчас в теме
(13)
Хранить старое значение бывает проще, чем запоминать текущее перед изменением.
Обычная переменная в клиентском контексте модуля формы, ничего сложного...
16. Sashares 35 25.10.24 23:34 Сейчас в теме
(14) Ну например в событии ПриИзменении старого значения нет. А если значение вручную меняет пользователь, проще отловить все в ПриИзменении.
17. nomad_irk 80 25.10.24 23:37 Сейчас в теме
(16) в моем случае значения меняются машиной, просто по правилам хорошего тона хотелось бы отображать пользователю итог по ветке дерева для наглядности
18. user2107184 26.10.24 00:10 Сейчас в теме
(16) Если мы говорим про дерево - то это таблица формы. Там есть ПередНачаломИзменения.
19. Sashares 35 26.10.24 10:35 Сейчас в теме
15. nomad_irk 80 25.10.24 22:57 Сейчас в теме
(13) да, спасибо, идея понятна.

На самом деле я изначально таким путем и пошел, но отказался от этого варианта, когда начал пробовать менять часть дерева. Нужно было просто развить идею до оперирования дельтой вместо абсолютного значения.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот