Soma de custos hierárquica
Um orçamento em que cada nível soma os filhos automaticamente, com formatação de moeda.
Soma de custos hierárquica🔗
Problema. Um orçamento em que cada fase soma seus itens e o total geral soma as fases, sem recalcular nada à mão.
Solução. Atributo custo nas folhas e fórmula de soma nos nós internos.
Antes de começar
O que você vai aprender
- Montar um orçamento em que cada nível soma o nível abaixo
- Usar
num0para tratar texto de atributo como número - Escolher entre somar filhos diretos e somar o ramo inteiro
Estrutura🔗
Orçamento do projeto
├── Infraestrutura
│ ├── Servidores custo: 24000
│ ├── Rede custo: 8000
│ └── Licenças custo: 12000
├── Equipe
│ ├── Desenvolvimento custo: 180000
│ └── Design custo: 45000
└── Contingência custo: 25000Passos🔗
-
Registre a chave
custoem Editar → Atributos → Gerenciar atributos do mapa. Isso evita variações de escrita. -
Preencha
custonas folhas, com números puros — semR$, sem separador de milhar, ponto como decimal. -
Nos nós de fase, crie o atributo
subtotal:=node.children.sum { it['custo'].num0 } -
Na raiz do ramo, crie
totalsomando o ramo inteiro:=node.branch.sum { it['custo'].num0 }Atenção:
branchinclui o próprio nó. Se a raiz não tivercustopróprio, não há dupla contagem.
Formatando como moeda🔗
Números crus são difíceis de ler. Duas opções:
=def v = node.children.sum { it['custo'].num0 }
String.format('R$ %,.2f', v)
Ou, com separador brasileiro explícito:
=def v = node.children.sum { it['custo'].num0 }
'R$ ' + String.format('%,.2f', v).replace(',', '§').replace('.', ',').replace('§', '.')Extensões úteis🔗
Percentual do total. Em cada fase:
=def meu = node.branch.sum { it['custo'].num0 }
def tudo = node.map.root.branch.sum { it['custo'].num0 }
tudo ? "${(meu*100/tudo).round(1)}%" : '—'
Custo médio por item:
=node.leaves ? (node.leaves.sum { it['custo'].num0 } / node.leaves.size()).round(2) : 0
Só o que foi aprovado, marcado com check:
=node.branch.findAll { it.icons.icons.contains('button_ok') }.sum { it['custo'].num0 } ?: 0
Destaque do maior item:
=node.leaves.max { it['custo'].num0 }?.textCuidados🔗
- Use
num0, nãonum. Uma folha semcustoderruba a soma comnume é tratada como zero comnum0. sumsobre lista vazia devolvenull; o?: 0no fim resolve.- Formate a moeda só na exibição. Se o valor formatado virar entrada de outra fórmula, a conversão falha.
- Datas e valores em formato único — restrinja pelos atributos registrados.
Erros comuns
- Digitar
R$ 24.000,00no atributo: a conversão numérica falha e a soma vira zero - Somar
node.childrenquando a estrutura tem níveis intermediários — o certo énode.leaves - Não registrar a chave
custoe acabar comcusto,Custoevalorno mesmo mapa - Pôr a fórmula no texto do nó, substituindo o rótulo pelo número
Você aprendeu
- Números puros no atributo; formatação é assunto de exibição, não de dado
num0converte texto em número tratando vazio como zeronode.childrensoma um nível;node.leavessoma o ramo inteiro- Registrar a chave é o que impede a soma de mentir
Perguntas para reflexão
- Por que valores de atributo precisam de
num0antes de somar? - Quando usar
node.leavesem vez denode.children? - Que problema o registro de atributos resolve nesta receita?
- Por que a fórmula fica melhor no atributo do que no texto do nó?