
Customização técnica de relatórios no Business Central com AL
Aprenda como customizar relatórios no Business Central usando AL, incluindo Report e Report Extension, request page, triggers, labels e definição de layouts Word e RDLC.
DESENVOLVIMENTORELATÓRIOS & BI
Vinicius Pena
1/7/20264 min read
Como customizar relatórios no Business Central com AL?
Quando falamos de relatórios no Dynamics 365 Business Central, é comum o primeiro contato ser através dos layouts (Word, Excel ou RDLC). Eles resolvem boa parte das necessidades visuais, mas rapidamente chegam ao limite quando precisamos incluir novos campos, alterar datasets, aplicar regras de negócio ou expor dados que simplesmente não existem no relatório padrão.
É nesse ponto que entra a customização via código AL.
Este artigo é voltado para um público mais técnico, especialmente desenvolvedores e consultores técnicos de Business Central, e foca em como estender relatórios usando código, desde a preparação do ambiente até a criação de Report e Report Extension.
Quando usar código em vez de layout
Antes de entrar no código, vale alinhar o cenário correto de uso:
Use layout apenas quando:
A informação já existe no dataset do relatório
A necessidade é apenas visual (posição, fonte, formatação)
Use customização via AL quando:
É necessário adicionar campos de outras tabelas
A lógica de negócio define se o dado deve ou não aparecer
O relatório padrão não expõe todos os dados necessários
Você precisa reutilizar o relatório em múltiplos layouts
Layouts controlam como os dados aparecem.
Código controla quais dados existem.
Preparando o ambiente de desenvolvimento
Visual Studio Code
O Visual Studio Code é o editor padrão para desenvolvimento AL no Business Central.
Após instalar o VS Code, o próximo passo é preparar o ambiente com as extensões corretas.
Extensões essenciais
Instale obrigatoriamente:
AL Language (Microsoft)
Extensão oficial que permite criar, compilar, publicar e depurar extensões do Business Central.
Com isso, o ambiente já estará pronto para desenvolvimento técnico.
Criando um projeto AL
Com o VS Code aberto:
Pressione Ctrl + Shift + P
Execute AL: Go!
Selecione a pasta do projeto
Escolha o ambiente (Sandbox ou Docker)
Esse processo cria a estrutura base do projeto, incluindo o arquivo app.json , onde são definidos versão, dependências e permissões.
Report vs Report Extension
Esse é um dos pontos mais importantes — e onde muitos erros de arquitetura acontecem.
Report
Um objeto Report é utilizado quando:
Você está criando um relatório totalmente novo
Não existe um relatório padrão que atenda minimamente o cenário
Você controla 100% do dataset e da lógica
Exemplo básico:
report 50100 "Sales Summary Custom"
{
UsageCategory = eportsAndAnalysis;
ApplicationArea = All;
dataset
{
dataitem(SalesHeader; "Sales Header")
{
column(No_; "No.") { }
column(SellToCustomerNo; "Sell-to Customer No.") { }
}
}
}
Report Extension
Já o Report Extension deve ser sua primeira escolha quando:
O relatório padrão já existe
Você precisa apenas adicionar campos ou lógica
Quer manter compatibilidade com upgrades da Microsoft
Em ambientes SaaS, Report Extension é a abordagem recomendada.
Exemplo de extensão do relatório Sales – Invoice:
reportextension 50101 "Sales Invoice Ext" extends "Sales - Invoice"
{
dataset
{
add(SalesHeader)
{
column(MyCustomField; SalesHeader."Your Reference") { }
}
}
}
Nesse exemplo:
O relatório original permanece intacto
Um novo campo é adicionado ao dataset
O campo passa a ficar disponível para layout Word, Excel ou RDLC
Nenhuma modificação direta no objeto padrão é necessária.
Adicionando dados de outras tabelas
Em cenários mais avançados, é comum precisar buscar dados que não estão diretamente no dataitem principal.
Exemplo usando variáveis e triggers:
var
Customer: Record Customer;
trigger OnAfterAfterGetRecord()
begin
if Customer.Get("Sell-to Customer No.") then;
end;
E então expor o campo no dataset:
column(CustomerName; Customer.Name) {}
Esse tipo de abordagem é muito comum em relatórios fiscais, comerciais e gerenciais.
Request Page: configurações e comportamento
A Request Page é a interface apresentada ao usuário antes da execução do relatório. É nela que definimos filtros adicionais, opções de processamento e parâmetros que influenciam diretamente o dataset.
requestpage
{
layout
{
area(content)
{
group(Options)
{
field(ShowDetails; ShowDetails)
{
ApplicationArea = All;
Caption = 'Show Details';
}
}
}
}
}
Aqui, o campo ShowDetails controla o comportamento do relatório em tempo de execução.
Triggers da Request Page
As principais triggers são:
OnInit()
Executada quando a request page é inicializada. Ideal para definir valores padrão.OnOpenPage()
Disparada quando a página é aberta. Útil para validações iniciais.OnQueryClosePage(CloseAction)
Executada quando o usuário clica em OK ou Cancel. Muito usada para validações antes da execução do relatório.
Exemplo:
trigger OnQueryClosePage(CloseAction: Action): Boolean
begin
if CloseAction = Action::OK then
if not ShowDetails then
Error('You must select Show Details to continue.');
end;
Estrutura básica da Request Page
Triggers de relatórios: quando cada uma é executada
Entender o ciclo de execução do relatório é fundamental para escrever código correto e performático.
Principais triggers
OnPreReport()
Executada uma única vez, antes do processamento do dataset. Ideal para inicializações globais.OnPostReport()
Executada após o relatório terminar. Usada para limpeza ou logs.OnPreDataItem()
Executada antes do dataitem ser processado.OnAfterGetRecord()
Executada para cada registro do dataitem. Aqui acontece a maior parte da lógica.OnPostDataItem()
Executada após o término do dataitem.
Atenção: lógica pesada dentro de OnAfterGetRecord() pode impactar seriamente a performance.
Labels: textos, traduções e boas práticas
Os labels são utilizados para textos fixos no relatório e permitem fácil tradução e manutenção.
Exemplo:
labels
{
TotalCaption = 'Total Amount';
}
Uso no código:
column(TotalText; TotalCaption) {}
Boas práticas:
Use labels para qualquer texto fixo
Evite strings hardcoded no código
Facilita localização e manutenção
Definindo o formato do relatório (Word ou RDLC)
Ao criar um relatório novo, você define qual formato será utilizado.
report 50110 "Sales Report Word"
{
ApplicationArea = All;
DefaultRenderingLayout = LayoutWord;
...
...
rendering
{
layout(LayoutWord)
}
type = Word;
LayoutFile = 'myDocWord.docx';
}
layout(LayoutRDLC)
}
type = RDLC;
LayoutFile = 'myDocRDLC.rdlc';
}
}
}
O layout deve estar incluído no projeto e referenciado corretamente.
Relatório com layout Word
Boas práticas técnicas
Algumas recomendações importantes:
Prefira Report Extension sempre que possível
Evite lógica pesada em relatórios (impacta performance)
Nomeie corretamente colunas do dataset (facilita manutenção)
Documente campos adicionados ao relatório
Pense sempre em upgrade safety
Relatórios são usados em massa — qualquer erro de performance aparece rápido.
Código e layout trabalham juntos
Um ponto importante para fechar:
Código não substitui layout.
Código habilita o layout.
Depois de adicionar campos via AL, eles passam a ficar disponíveis nos layouts Word, Excel ou RDLC, mantendo a separação correta de responsabilidades.
Conclusão
A customização técnica de relatórios no Business Central é o que separa ajustes simples de soluções realmente robustas.
Entender quando usar Report, quando usar Report Extension e como estruturar corretamente o dataset garante:
Soluções mais limpas
Menos retrabalho em upgrades
Maior controle sobre dados e regras de negócio
Se você já domina layouts, dar esse próximo passo com AL é praticamente obrigatório.


