Report Viewer

TsgcHTMLComponent_ReportViewer mostra um relatório em uma página web, com um painel de parâmetros, uma visualização em PDF, Baixar PDF, Imprimir e Exportar para Excel. O relatório é um TsgcHTMLReport, um motor de relatórios em bandas que imprime grupos, totais, gráficos, códigos de barras e subrelatórios em PDF com o motor de PDF do sgcHTML, sem ferramenta de relatórios externa, driver de impressora nem DLL, em Delphi, C++ Builder e .NET.

TsgcHTMLComponent_ReportViewer e TsgcHTMLReport

Defina o relatório com as suas bandas e Parameters, vincule-o ao visualizador e renderize. O visualizador constrói um formulário a partir dos parâmetros, e a visualização, o download e a impressão são o mesmo PDF, gerado no servidor com os valores que o usuário aplicou, de modo que o que o usuário vê é o que ele imprime. Nada é guardado no servidor entre requisições.

Classes do componente

TsgcHTMLComponent_ReportViewer, o visualizador, e TsgcHTMLReport, o motor de relatórios não visual que ele mostra

Renderiza

Um painel de parâmetros, uma visualização desenhada com o pdf.js embutido do visualizador de PDF, e os links Baixar PDF, Imprimir e Exportar para Excel

Linguagens

Delphi, C++ Builder, .NET

Um relatório de vendas com parâmetros, no navegador

O relatório declara um período obrigatório e uma região. O visualizador os transforma em campos, e o relatório filtra os seus dados no seu próprio evento OnBeforeGenerate com os valores que o usuário aplica.

uses
  sgcHTML_Export_PDF, sgcHTML_Report, sgcHTML_Component_ReportViewer;

// the report
oReport := TsgcHTMLReport.Create(Self);
oReport.Title := 'Sales';
oReport.FileName := 'sales';
oReport.DataSet := qrySales;
oParam := oReport.Parameters.Add;
oParam.Name := 'Period';
oParam.Caption := 'Period';
oParam.Kind := rpkDateRange;
oParam.DefaultValue := '2026-01-01;2026-12-31';
oParam.Required := True;
oParam := oReport.Parameters.Add;
oParam.Name := 'Region';
oParam.Caption := 'Region';
oParam.Kind := rpkSelect;
oParam.Options.Add('EU=Europe');
oParam.Options.Add('US=United States');
oReport.OnBeforeGenerate := ReportBeforeGenerate;

// a detail band: one line per row
oBand := oReport.Bands.Add;
oBand.Kind := rbkDetail;
oItem := oBand.Items.Add;
oItem.Text := '[Product]';
oItem.Width := 100;
oItem := oBand.Items.Add;
oItem.Text := '[Amount:#,##0.00]';
oItem.Left := 100;
oItem.Width := 80;
oItem.Align := paRight;

// the viewer
oViewer := TsgcHTMLComponent_ReportViewer.Create(Self);
oViewer.Name := 'SalesViewer';
oViewer.HTMXEngine := sgcHTMXEngine1;
oViewer.Report := oReport;
oViewer.TokenSecret := LoadSecretFromConfig;
oTemplate.BodyContent := oViewer.HTML;

// the report filters its data with the values of the viewer
procedure TForm1.ReportBeforeGenerate(Sender: TObject; aParams: TStrings);
var
  vPeriod: string;
begin
  vPeriod := aParams.Values['Period'];   // from;to
  qrySales.Close;
  qrySales.ParamByName('FromDate').AsString := Copy(vPeriod, 1, Pos(';', vPeriod) - 1);
  qrySales.ParamByName('ToDate').AsString := Copy(vPeriod, Pos(';', vPeriod) + 1, 10);
  qrySales.ParamByName('Region').AsString := aParams.Values['Region'];
  qrySales.Open;
end;
@* Views/Reports/Sales.cshtml: SalesReport is a long-lived TsgcHTMLReport *@
@model ReportsModel

<sgc-report-viewer name="sales" report="@Model.SalesReport"
                   show-export-xlsx="true" zoom="page-width"
                   css-height="720px" token-lifetime="300"
                   on-before-generate="Model.CheckAccess" />
using esegece.sgcWebSockets;

// the report
var report = new TsgcHTMLReport();
report.Title = "Sales";
report.FileName = "sales";
var param = report.Parameters.Add();
param.Name = "Period";
param.Caption = "Period";
param.Kind = TsgcHTMLReportParameterKind.rpkDateRange;
param.DefaultValue = "2026-01-01;2026-12-31";
param.Required = true;
report.OnBeforeGenerate += (sender, values) => LoadSales(values);

// the viewer
var viewer = new TsgcHTMLComponent_ReportViewer();
viewer.Name = "SalesViewer";
viewer.HTMXEngine = engine;
viewer.Report = report;
viewer.TokenSecret = configuration["Reports:Secret"];
template.BodyContent = viewer.HTML;

// the same report, without the viewer: a PDF of the third quarter
var values = new List<string> { "Period=2026-07-01;2026-09-30" };
report.SaveToFile("q3.pdf", values);

O que seus usuários recebem

Escolha os valores, veja o relatório, depois baixe-o, imprima-o ou abra os seus dados no Excel.

Painel de parâmetros

Cada parâmetro do relatório vira um campo com rótulo: texto, número, data, um intervalo de datas com De e Até, um select das Options e uma caixa de seleção. Um parâmetro Required mostra um asterisco e é verificado no navegador antes de Aplicar e de novo no servidor. Redefinir restaura o padrão de cada campo.

Visualização do PDF

A visualização usa o pdf.js embutido do TsgcHTMLComponent_PDFViewer, com a sua barra de ferramentas, navegação de páginas, zoom e pesquisa. Um indicador com o texto Gerando relatório... a cobre até que a primeira página seja desenhada. Com AutoGenerate a visualização carrega de imediato com os valores padrão.

Baixar, imprimir e Excel

Baixar PDF e Imprimir são o mesmo PDF da visualização, e o download recebe o nome de FileName. Exportar para Excel escreve os dados do relatório com ExportToXLSX. ShowDownload, ShowPrint e ShowExportXLSX mostram ou ocultam cada um.

Mensagens claras

Um valor obrigatório ausente marca o campo e move o foco para ele. Quando nenhuma linha é impressa, a visualização mostra Nenhum dado para os parâmetros selecionados em vez de um PDF vazio. Uma geração recusada ou com falha mostra o seu motivo e desativa os links. Os textos vêm da localidade da biblioteca.

Acessibilidade e teclado

O visualizador é uma região rotulada. Todo campo tem um rótulo, um intervalo de datas é um fieldset com uma legenda, os campos obrigatórios levam aria-required e um valor ausente define aria-invalid. Enter em um campo aplica os parâmetros, e uma região live educada anuncia campos obrigatórios, ausência de dados, recusas e erros.

Relatórios em bandas para PDF

O motor por trás do visualizador é um componente não visual por si só. Ele escreve o PDF com TsgcHTMLExportPDF, o motor de PDF do sgcHTML, e o mesmo relatório também pode ser escrito como uma planilha do Excel.

Bandas

Um cabeçalho de relatório, cabeçalhos de página, grupos aninhados com cabeçalhos e rodapés, linhas de detalhe, rodapés de página e um rodapé de relatório. Os cabeçalhos de grupo podem se repetir em cada nova página, KeepTogether mantém um grupo em uma só página, NewPageBefore e NewPageAfter quebram páginas, e um cabeçalho de relatório com NewPageAfter é uma capa.

Itens

As bandas contêm texto, imagens, linhas, retângulos, gráficos, texto rico, códigos de barras, códigos QR e subrelatórios. O texto é cortado na sua caixa, e os itens com AutoHeight aumentam a banda para caber o texto com quebra de linha.

Expressões e PrintIf

Os textos contêm expressões entre [ ]: campos com uma máscara como [Amount:#,##0.00], [Sum(Field)], [Count], [Avg(Field)], [Min(Field)], [Max(Field)], [RunningSum(Field)], [Page] de [Pages], [Param.Name] e [GroupValue]. As bandas e os itens só são impressos quando a sua condição PrintIf é verdadeira, como Amount > 1000.

Fontes de dados

As linhas vêm de um DataSet, de uma Grid, de um array JSON em RowsJSON ou do evento OnGetRow. LoadFromGrid constrói um relatório em tabela a partir das colunas de uma TsgcHTMLComponent_Grid, com as legendas em todas as páginas, linhas zebradas, os totais das colunas numéricas e números de página.

Gráficos, códigos de barras e códigos QR

Um item de gráfico desenha as linhas da sua banda como gráficos vetoriais: barras, barras horizontais, barras empilhadas, linhas, áreas, pizza ou rosca, um gráfico por grupo em uma banda de grupo. ChartSource imprime um TsgcHTMLComponent_Chart como a página web o mostra. Os itens de código de barras desenham Code 128, e os itens de código QR usam o nível de correção de erros M.

Subrelatórios e texto rico

Um item de subrelatório imprime outro relatório dentro da sua banda, como as linhas de um pedido, vinculado à linha mestre por LinkFields, até 5 níveis de profundidade, e continua nas páginas seguintes. Um item de texto rico imprime HTML, e com AutoHeight ele flui por várias páginas depois dos cabeçalhos de página.

Fontes e idiomas

Os itens são impressos por padrão com as fontes Base-14, que contêm os caracteres do Windows-1252. Registre fontes TrueType em Fonts para imprimir cirílico, grego, árabe, hebraico, chinês, japonês, coreano ou símbolos. Apenas os glifos impressos são embutidos, e FallbackFonts e AutoFallback cobrem os caracteres que uma fonte não tem.

Mesma saída em qualquer lugar

Números e datas são impressos com DecimalSeparator, ThousandSeparator, DateFormat e TimeFormat do relatório, nunca com as configurações regionais da máquina, de modo que um relatório é impresso igual em todos os computadores e no .NET. Com um CreationDate fixo a mesma entrada gera os mesmos bytes de PDF.

Definição como JSON

SaveToJSON escreve a configuração de página, as fontes, as bandas, os itens e os parâmetros, e LoadFromJSON os lê de volta depois de validar toda a definição, com o caminho JSON de qualquer erro. Os usuários projetam relatórios no navegador com o Report Designer, e um clique duplo no relatório abre o mesmo designer na IDE do Delphi.

Um relatório, muitas requisições

Generate, SaveToFile, SaveToStream, GetPDFBytes, ExportToXLSX e HasData constroem cada um a sua própria cópia das linhas e do layout. Um relatório atende várias requisições de um servidor web ao mesmo tempo, cada uma filtrada com os seus próprios parâmetros, sem bloqueio seu.

Principais propriedades, métodos & eventos

Os membros do visualizador que você mais usa.

Report e OnGetReport

Report é o TsgcHTMLReport a mostrar. Um visualizador atende todos os usuários: para mostrar a cada usuário um relatório diferente, por exemplo por tenant ou por função, devolva-o em OnGetReport(Sender, aParams, aReport), que dispara na thread da requisição onde sgcHTMLRequestSession fornece a sessão.

OnBeforeGenerate

OnBeforeGenerate(Sender, aParams, aAccept, aErrorMessage) aceita ou recusa uma geração, quando o visualizador renderiza, a cada Aplicar e a cada GET de um link, de modo que um link copiado também é recusado. Use-o para permissões e para regras entre parâmetros, como um período de no máximo um ano.

Cada link de arquivo leva um token HMAC-SHA256 sobre o componente, o formato, os valores dos parâmetros, a sessão e a expiração, e só funciona na sessão que o renderizou. Os links expiram após TokenLifetime segundos (300 por padrão), e o script assina novos para uma página deixada aberta. Defina o mesmo TokenSecret em todo servidor atrás de um balanceador de carga.

Sem estado no servidor

Os valores viajam no link, e o relatório é gerado no GET, depois que OnGetReport e OnBeforeGenerate executam de novo. Os arquivos são servidos com Cache-Control: private, no-store, e uma requisição inválida, um token inválido ou uma recusa respondem 400 ou 403.

Opções de visualização

ShowParameters, ShowToolbar, ShowPageNav, ShowZoomControls e ShowSearch definem o que o visualizador mostra, Zoom aceita auto, page-width, fit ou uma porcentagem, e Theme e CSSHeight definem o visual da visualização.

Sem um motor

Com ActionURL e sem HTMXEngine, o seu host encaminha o envio de Aplicar para DispatchComponentEvent e os links de arquivos para DispatchComponentFile. GetReportURL assina os mesmos links para o seu próprio código, por exemplo para enviar em uma mensagem um link para o PDF de um período.

ASP.NET Core

Em uma view Razor o Tag Helper <sgc-report-viewer> renderiza o visualizador. report aceita um TsgcHTMLReport de longa duração, ou omita-o e use on-get-report. Aplicar envia ao endpoint de eventos de componentes e os links de PDF e Excel são servidos pela rota de arquivos de componentes de UseSgcHtml, então nada precisa ser mapeado.

A demo

Demos\60.HTML\01.RunTime\31.ReportViewer é o sgc Sales Reports, um servidor na porta 8133 com três relatórios: vendas por região com um gráfico de barras por região e uma rosca da participação de cada região, uma fatura com logotipo, um código QR para pagar e um código de barras Code 128, e a impressão de uma grade. O botão New order adiciona um pedido, e cada visualização aberta, em todos os navegadores, aplica de novo os seus parâmetros pelo WebSocket da página. As versões em design time, Lazarus e .NET a espelham.

Continue explorando

Experimente onlineVeja na demo Visualizador de relatórios, rodando ao vivo no servidor de demos da eSeGeCe.
Ajuda onlineReferência completa da API e guia de uso do visualizador.
Ajuda do TsgcHTMLReportBandas, expressões, gráficos, subrelatórios, fontes e a definição JSON do motor de relatórios.
Componente Report DesignerProjete no navegador as bandas, os itens e os parâmetros de um relatório.
Componente PDF ViewerO visualizador pdf.js que desenha a visualização do relatório.
Todos os Componentes sgcHTMLExplore a matriz completa de recursos com mais de 80 componentes.
Baixar Versão de Avaliação GratuitaA avaliação de 30 dias inclui os projetos de demonstração 60.HTML.
PreçosLicenças Single, Team e Site com código-fonte completo.
Melhor custo-benefício: All-AccessTodos os produtos da eSeGeCe, com Suporte Premium incluído, a partir de €1,059/ano.
Ver preços do All-Access

Pronto para Começar?

Baixe a versão de avaliação gratuita e comece a construir UIs web em Delphi, C++ Builder e .NET.