Ajuda · Relatórios

Relatório analítico com saldo acumulado, sem sair do editor

O tipo de página Relatório monta o relatório contábil clássico: rubricas em bandas, linha descritiva sob cada lançamento, sub-totais com rótulo próprio, coluna de saldo que acumula, e cabeçalho do PDF com o período e os filtros escolhidos. Sete passos, tudo pela interface.

Nova página → Relatório Mad Framework 5.75.0 ou superior Exporta PDF paisagem · Excel · CSV
00

O que você vai obter

Exemplo do relatório publicado, com dados fictícios. Cada parte destacada corresponde a uma opção do editor.

Associação Exemplo00.000.000/0000-00
Analítico OrçamentárioProjeto Exemplo · 01/03/2026 a 31/03/2026
Página 1 de 2
DataDocumentoFavorecidoCréditoDébitoSaldo
1.01 · Consultoria técnica Valor aprovado: 6.000,00
02/03/2026TED 0001Concedente Exemplo6.000,006.000,00
Repasse da parcela 1 conf. TED 0001
10/03/2026NF 00101Fornecedor Exemplo A1.500,004.500,00
Consultoria técnica conf. NF 00101
24/03/2026NF 00108Fornecedor Exemplo A1.500,003.000,00
Consultoria técnica conf. NF 00108
Sub-Totais da Rubrica6.000,003.000,003.000,00
1.02 · Material de escritório Valor aprovado: 2.000,00
05/03/2026TED 0002Concedente Exemplo2.000,002.000,00
Repasse da parcela 1 conf. TED 0002
18/03/2026NF 00342Fornecedor Exemplo B640,001.360,00
Material de escritório conf. NF 00342
Sub-Totais da Rubrica2.000,00640,001.360,00
Banda da rubrica (group-by + group-mask) Linha descritiva (row-detail) Sub-total com rótulo (group-total-label) Saldo acumulado (running)
01

Crie a página pelo assistente

Barra lateral → Nova página → tipo Relatório

Escolha a tabela de lançamentos e o assistente lê as colunas. Os campos novos ficam abaixo dos agrupamentos: terceiro nível de quebra, função de cada total (soma, média, contagem, mínimo, máximo), Saldo acumulado com as colunas de crédito e débito, e Linha descritiva com uma máscara de campos.

Agrupar pelo valor de uma tabela relacionada. Quando o nível de agrupamento aponta uma coluna de ligação — a rubrica do lançamento, por exemplo — o assistente abre um segundo campo, Coluna de rubrica. Escolha ali o código ou o nome, e a quebra passa a usar esse valor no lugar do número interno; o mesmo campo existe depois no painel da grade, em Agrupamento. Para agrupar por uma tabela filha (os itens de um lançamento, por exemplo), crie o relatório a partir dela.

Agrupar por dia, mês ou ano. Quando o nível de agrupamento é uma coluna de data, o assistente abre o campo Granularidade da data, com Dia já escolhido. É o que faz vendas do mesmo dia em horários diferentes ficarem no mesmo grupo — sem isso, uma coluna que guarda data e hora quebra o relatório a cada segundo, e cada venda vira um grupo com o seu próprio sub-total. Escolha Mês ou Ano para relatórios mensais e anuais. A mesma escolha existe depois no painel da grade, em Agrupamento.

Studio › Nova página › Relatório
Assistente de nova página do tipo Relatório com os campos de agrupamento, saldo acumulado e linha descritiva preenchidos
Assistente. Grupo 1 = rubrica, período = data do lançamento, colunas totalizadas crédito e débito, saldo = crédito − débito, linha descritiva {descricao} conf. {documento}.
Studio › Nova página › Linha descritiva › Adicionar múltiplos atributos
Modal de máscara da linha descritiva com o texto {descricao} conf. {documento} e a lista de colunas da tabela
Máscara da linha descritiva. Clique nas colunas para inserir os tokens e escreva o texto fixo entre eles.
Bom saberO saldo só aparece quando a tabela tem pelo menos duas colunas numéricas. Uma máscara que cite coluna inexistente é descartada em silêncio pelo assistente.
02

Veja o que foi gerado

Aba de código da página → Blade

A página é um <mad-grid> agrupado com uma coluna sintética saldo_acumulado. Tudo que o assistente fez é um atributo que você pode editar depois no painel ou direto no código.

<mad-grid self per-page="0" sticky exportable
          group-by="rubrica_id" group-mask="{rubrica->codigo} · {rubrica->nome}  Valor aprovado: {rubrica->valor_aprovado|money}"
          group-total group-band="cells" group-total-label="Sub-Totais da Rubrica"
          row-detail="{descricao} conf. {documento}"
          export-title="Analítico Orçamentário" export-subtitle="{PERIOD}">
    <mad-columns>
        <mad-col field="data" label="Data" date />
        <mad-col field="favorecido" label="Favorecido" />
        <mad-col field="credito" label="Crédito" money right total="sum" />
        <mad-col field="debito" label="Débito" money right total="sum" />
        <mad-col field="saldo_acumulado" label="Saldo" money right running="{credito} - {debito}" running-reset="group" />
    </mad-columns>
</mad-grid>
Studio › página › Código (Blade)
Editor de código Blade mostrando o mad-grid gerado com row-detail e a coluna com running
Blade gerado. Os atributos destacados acima são os novos. Nada de PHP para escrever.
03

Ajuste a banda do grupo e o rótulo do sub-total

Canvas → selecione a grade → painel Propriedades → Agrupamento e Relatório

Banda do grupo em Alinhada às colunas põe os totais da rubrica embaixo das colunas certas, em vez de uma faixa corrida. Rótulo do sub-total troca o "Total" padrão pelo texto do seu relatório. No grupo Relatório ficam a linha descritiva e o título e subtítulo da exportação. Em cada nível de Agrupamento, uma coluna de data mostra também a Granularidade: dia, mês, ano ou o valor exato.

Studio › página › Propriedades da grade
Painel de propriedades do mad-grid com os grupos Agrupamento e Relatório expandidos
Propriedades da grade. Banda do grupo, Rótulo do sub-total, Linha descritiva e Título da exportação. O canvas à esquerda já reflete a banda em células.
group-bandgroup-total-labelrow-detailexport-titleexport-subtitlegroup-bygroup-maskgroup-total

Agrupamento, subtotais e os dois mecanismos de filtro estão explicados em detalhe em Listagem e Filtrar.

04

Configure a coluna de saldo

Canvas → selecione a coluna Saldo → painel → Cálculo

Saldo acumulado recebe a expressão que vira o delta de cada linha; o construtor lista as colunas irmãs da grade. Zerar o acumulado decide se o saldo recomeça em cada rubrica ou atravessa o relatório inteiro. Saldo inicial aceita um número ou uma expressão. O Total da coluna de saldo mostra o último valor, nunca a soma dos saldos.

Studio › página › Propriedades da coluna Saldo
Painel de propriedades da coluna Saldo com o grupo Cálculo aberto: saldo acumulado e zerar acumulado
Coluna Saldo. Expressão {credito} - {debito}, zerar a cada quebra de grupo.
runningrunning-resetrunning-starttotal="last"evaluatetotal-mask
AtençãoO saldo exige a página inteira carregada (per-page="0", que o assistente já define) e uma Ordenação padrão. Com paginação ligada o saldo acumula só dentro da página. O campo saldo_acumulado não existe na tabela: o aviso de coluna desconhecida no painel é esperado nessa coluna.
05

Confira no canvas

Área central do editor

O preview usa dados de exemplo com a estrutura final: banda da rubrica, linha descritiva em itálico sob cada registro, sub-total com o rótulo escolhido e a coluna de saldo crescendo linha a linha, marcada com Σ↓ no cabeçalho.

Studio › página › Canvas
Preview da grade no canvas com banda de grupo, linha descritiva, sub-total rotulado e coluna de saldo
Preview. Os valores são fictícios; a forma é a que o app publicado terá.
06

Monte o cabeçalho e o rodapé do PDF

Barra de ações da grade no canvas → PDF (ou painel da página → Exportação PDF)

O editor de bandas é um canvas em milímetros. Arraste texto fixo (nome da empresa, CNPJ), a logomarca do projeto e os campos dinâmicos. Três campos são novos: {PERIOD} imprime o intervalo filtrado, {FILTERS} lista os filtros escolhidos com seus rótulos, {SUBTITLE} traz o subtítulo da exportação. O modelo Relatório financeiro já vem com essa composição.

Studio › página › Exportação PDF › Cabeçalho e rodapé
Editor de cabeçalho e rodapé do PDF com os chips PERIOD, FILTERS e SUBTITLE
Bandas do PDF. Chips de campo com os três tokens novos e o modelo "Relatório financeiro" aplicado.
Studio › Exportação PDF › Modelos prontos
Galeria de modelos de cabeçalho e rodapé com o novo modelo Relatório financeiro
Modelos prontos. "Relatório financeiro" traz título, subtítulo, período e filtros no cabeçalho, total de registros no rodapé.
{PERIOD}{FILTERS}{SUBTITLE}{UNIT_NAME}{USER_NAME}{TENANT_NAME}{TITLE}{LOGO}{PAGE_NUM} de {PAGE_COUNT}{DATE}

Quem emite também entra na banda: {UNIT_NAME} imprime a unidade (filial) ativa da pessoa logada, {USER_NAME} o nome dela e {TENANT_NAME} a empresa. Em app sem multi-unidade ou sem tenancy o campo sai em branco.

Como imprimir o CNPJ (ou outro dado) no cabeçalho

Qualquer dado do app pode virar um campo do PDF. Arraste um elemento de Texto e digite o token entre chaves — {CNPJ}, {ENDERECO}. O editor mostra o token como está (ele não sabe o valor); quem preenche é a tela, no PHP, com o método exportPdfPlaceholders():

protected function exportPdfPlaceholders(): array
{
    return ['CNPJ' => '12.345.678/0001-90', 'ENDERECO' => 'Rua X, 100'];
}

Valor fixo (CNPJ, endereço) não precisa de código: Configurações do projeto → Exportação de PDF → Campos próprios — vira chip no editor. Valor calculado para todas as telas: botão Criar classe de campos na mesma seção. O valor da tela vence os dois. Guia completo: Cabeçalho e rodapé do PDF. Precisa do Mad Framework 5.80 ou mais novo no app.

07

Publique e exporte

App publicado → filtre o período → Exportar → PDF

No app, a pessoa escolhe período e projeto e clica em Exportar. O PDF sai em A4 paisagem com o cabeçalho de colunas repetido em toda página, "Página 1 de N", período e filtros no cabeçalho, sub-totais por rubrica e o total geral. Excel e CSV recebem as mesmas colunas e sub-totais; a linha descritiva fica só na tela e no PDF, para não quebrar tabelas dinâmicas.

Republique para aplicarA funcionalidade depende do Mad Framework 5.74.0. Apps já publicados só passam a imprimir {FILTERS} depois de republicados, porque as telas são recompiladas na publicação.
08

Referência: o que cada propriedade faz

Para quem também mexe no Blade.

PropriedadeValoresEfeito
mad-colrunningvazio · {credito} - {debito}Coluna vira saldo acumulado. Sem valor, acumula o próprio campo; com expressão, acumula o resultado dela a cada linha.
mad-colrunning-resetnone · group · group:1Zera o saldo a cada quebra do nível indicado. Padrão: nunca zera.
mad-colrunning-startnúmero ou expressãoSaldo inicial de cada escopo (saldo anterior, por exemplo).
mad-coltotalsum · avg · count · min · max · lastlast é novo: último valor do grupo. Coluna de saldo com sum também devolve o último valor.
mad-coltotal-masktexto com {value}Formata o total da coluna; sub-total e total geral usam a mesma formatação.
mad-gridrow-detailmáscara {descricao} conf. {documento}Segunda linha, descritiva, abaixo de cada registro. Tela e PDF; Excel e CSV ignoram.
mad-gridgroup-byrubrica_id · rubrica->codigo · data|day · vários níveis separados por vírgulaColuna que quebra o relatório. Com a seta, agrupa pelo valor da tabela relacionada (um nível de relação). Tabela filha, de muitos registros por lançamento, não agrupa — monte o relatório a partir dela.
mad-gridgroup-by · granularidadedata|day · data|month · data|year · combina com a seta: venda->data|dayAgrupa a coluna de data por dia, mês ou ano. Sem o sufixo, uma coluna com data e hora quebra pelo valor exato — ou seja, por segundo.
mad-gridgroup-bandinline · cellsEm cells a banda e o sub-total do grupo alinham cada valor sob a sua coluna.
mad-gridgroup-total-labeltexto, aceita {group}Rótulo da linha de sub-total.
mad-gridexport-title · export-subtitle · export-filenametexto, aceita {PERIOD}Alimentam {TITLE}, {SUBTITLE} e o nome do arquivo. Vencem o título definido no PHP.
máscaras{campo|money}formatadores do frameworkFormatação dentro de group-mask, row-detail e group-total-label.
bandas PDF{PERIOD} · {FILTERS} · {SUBTITLE}tokens do cabeçalho e rodapéPeríodo filtrado, filtros ativos com rótulo, subtítulo da exportação.
bandas PDF{UNIT_NAME} · {USER_NAME} · {TENANT_NAME}tokens do cabeçalho e rodapéUnidade ativa, nome de quem exportou e empresa. Em branco quando o app não tem multi-unidade ou tenancy.
bandas PDF{SEU_TOKEN}texto livre + exportPdfPlaceholders()Campo próprio do app, preenchido no PHP da tela (ou na classe global App\Support\PdfExportPlaceholders).
09

Problemas comuns

O saldo muda de valor a cada vez que abro o relatório

Falta a Ordenação padrão. Sem ela o banco devolve as linhas em qualquer ordem e o acumulado acompanha. Ordene pela data do lançamento (e pela rubrica, se houver quebra).

O saldo não zera na troca de rubrica

Zerar o acumulado está em "Nunca". Troque para "A cada quebra de grupo" no painel da coluna Saldo.

O período não aparece no cabeçalho do PDF

O chip {PERIOD} só imprime quando a tela tem um filtro de período preenchido. Confira o campo de período do relatório e se a pessoa escolheu datas antes de exportar.

{FILTERS} sai em branco no app

O app foi publicado antes desta versão. Republique o projeto: as telas são recompiladas e o cabeçalho passa a receber os filtros.

{UNIT_NAME} ou {TENANT_NAME} sai em branco

O app não tem multi-unidade/tenancy, a pessoa logada não está vinculada a uma unidade, ou o app roda um Mad Framework anterior ao 5.79. Atualize o framework do app e confira o vínculo da pessoa com a unidade.

O meu {CNPJ} apareceu literal no PDF

Ninguém definiu o valor: cadastre em Configurações do projeto → Exportação de PDF → Campos próprios (valor fixo), ou devolva-o na classe de campos / no método exportPdfPlaceholders() da tela, e republique.

A linha descritiva não veio no Excel

É proposital. A segunda linha quebraria tabelas dinâmicas e filtros do Excel; ela existe na tela e no PDF.