Como configurar o OLAP no Delphi e utilizar cortes de dados para resolver tarefas analíticas

2026-10-21

Como configurar OLAP em Delphi e usar fatias de dados para resolver tarefas analíticas

Todo desenvolvedor de sistemas de contabilidade enfrenta a tarefa de analisar grandes volumes de dados. A transformação de «papa informacional» em relatórios estruturados é fundamental para a tomada de decisões de gestão. Isso se aplica, por exemplo, a:

  • contabilidade de estoque e gestão de saldos;
  • análise de produção e cálculo de custo;
  • análise de vendas e séries temporais.

Por exemplo, os OLAP cubes (FastCube) permitem resolver essas tarefas de forma rápida, visual e sem escrever consultas SQL complexas. Ao contrário das tabelas bidimensionais, as tabelas dinâmicas multidimensionais possibilitam examinar os dados sob diferentes ângulos (fatias) em tempo real.

Neste artigo, descreveremos passo a passo a criação de um aplicativo analítico em Delphi usando os componentes TfrGrid (para os dados de origem) e TfcxSliceGrid (para construir a tabela dinâmica). 

 


 


Passo 1. Visualização dos dados brutos com TfrGrid

Antes de construir a analítica, precisamos ver a amostra de dados de origem. Como exemplo, tomaremos os dados de uma empresa de engenharia mecânica referentes ao ano de 2025.

Precisaremos do componente TfrGrid, ele faz parte do FastReport VCL e está disponível gratuitamente na versão demo.

  1. Localize o componente TfrGrid na paleta de ferramentas do Delphi.
  2. Coloque-o no formulário e defina a propriedade Align = alBottom (para fixá-lo na parte inferior do formulário).
  3.  

Adição do componente TfrGrid ao formulário

  1. Vincule o grid à fonte de dados (TDataSource) pelo menu de contexto frGrid1TableView1.

Vinculação do grid à fonte de dados pelo menu de contexto


 

Passo 2. Configuração da exibição e edição do componente

O principal recurso do componente de grid — a edição direta das células (alteração dos dados de origem no campo do banco de dados). No FastGrid isso é implementado por meio da inserção automática de editores conforme o tipo de campo. Por exemplo:

  • para campos de data – um calendário suspenso.
  • para valores numéricos – um SpinEdit.

Como configurar as colunas

  1. Localização. Clique no cabeçalho da coluna para renomear os campos dos nomes técnicos para o português (por exemplo, Product → Nome da peça).

Adição da localização para a coluna «Data»

  1. Largura. Ajuste manualmente a largura das colunas (modo Design-Time).

Ajuste manual da largura das colunas no componente

  1. Estilo. Para melhorar a legibilidade, defina cores diferentes para as linhas pares e ímpares (BackgroundColorEven / BackgroundColorOdd).

Seleção dos estilos para alternância de cores das linhas

  1. Configuração detalhada dos editores. Se necessário, configure pontualmente as propriedades de cada coluna, escolhendo uma das variantes de editor na propriedade chamada «Properties».

Configuração detalhada dos editores pela propriedade «Properties»

Importante: neste ponto temos uma interface para visualizar e corrigir manualmente os dados de origem. Isso ainda não é o resultado final da analítica.

 


 

Passo 3. Construção do cubo multidimensional (OLAP) com FastCube

Agora vamos ao instrumento principal — a tabela dinâmica. Para isso, usaremos o componente TfcxSliceGrid e o vincularemos à mesma fonte de dados do TfrGrid.

  1. Coloque no formulário TfcxSliceGrid e defina Align = alClient (esticar o componente por toda a área restante).
  2. Adicione o divisor TSplitter entre TfrGrid e TfcxSliceGrid. Isso permitirá ao usuário alterar o tamanho dos componentes. O tamanho de um objeto aumentará à custa do tamanho do outro.

Adição do divisor TSplitter

  1. Para a conexão com a fonte de dados, coloque no formulário uma cadeia de componentes:
  • TfcxDBDataSet → indicamos o DataSet (nossa tabela principal).
  • TfcxDataSource → vinculamos ao TfcxDBDataSet. Pelo clique direito, escolhemos «Add all fields» (criar todos os campos).
  • TfcxCube → indicamos o DataSource e definimos CubeSource = fccs_DataSource. Ativamos a propriedade Active = True.
  • TfcxSlice → vinculamos a propriedade Cube ao TfcxCube, e o TfcxSliceGrid.Slice ao TfcxSlice.

 

Passo 4. Configuração detalhada das dimensões (DateSplitPaths)

Para trabalhar confortavelmente com períodos de tempo, é necessário configurar o fracionamento da data:

  1.    Na coleção fcxDataSource.Fields, selecione o campo Date.

Lista de campos na coleção fcxDataSource.Fields

  1. Na propriedade SourceFieldProperties.SplitProperty.DateSplitPaths, ative as opções: Year, Month, Day. Isso permitirá usar a data para agrupamento hierárquico (ano → mês → dia).

 


 

Passo 5. Inicialização programática da estrutura do relatório

A seguir, escreveremos um manipulador do evento OnShow do formulário, para não ter de arrastar os campos com o mouse a cada inicialização.

Código de inicialização:

uses …, fcxTypes;
procedure TForm1.FormShow(Sender: TObject);
var
  LIndex: Integer;
begin
  fcxSlice1.BeginUpdate;
  try
// Adding fields to the Filters area
    fcxSlice1.PageContainer.AddFilterField(fcxSlice1.SliceFields.ItemByName['Machine'], 'Machine', 'Machine');
    fcxSlice1.PageContainer.AddFilterField(fcxSlice1.SliceFields.ItemByName['Date'], 'Date', 'Date');
    fcxSlice1.PageContainer.AddFilterField(fcxSlice1.SliceFields.ItemByName['Department'], 'Department', 'Work Area');
    fcxSlice1.PageContainer.AddFilterField(fcxSlice1.SliceFields.ItemByName['Shift'], 'Shift', 'Shift');
    fcxSlice1.PageContainer.AddFilterField(fcxSlice1.SliceFields.ItemByName['Operator'], 'Operator', 'Operator');
    fcxSlice1.PageContainer.AddFilterField(fcxSlice1.SliceFields.ItemByName['Product'], 'Product', 'Product');
    fcxSlice1.PageContainer.AddFilterField(fcxSlice1.SliceFields.ItemByName['Product_Category'], 'Product_Category', 'Product Category');
    fcxSlice1.PageContainer.AddFilterField(fcxSlice1.SliceFields.ItemByName['Work_Order'], 'Work_Order', 'Product Order');
    fcxSlice1.PageContainer.AddFilterField(fcxSlice1.SliceFields.ItemByName['Downtime_Reason'], 'Downtime_Reason', 'Downtime Reason');
    fcxSlice1.PageContainer.AddFilterField(fcxSlice1.SliceFields.ItemByName['Plant'], 'Plant', 'Workshop');
 
// Adding fields to the Rows area
    fcxSlice1.YAxisContainer.AddDimension(fcxSlice1.SliceFields.ItemByName['Supervisor'], 'Supervisor', 'Foreman');
 
// Setting up data fields
    LIndex := fcxSlice1.MeasuresContainer.AddMeasure(fcxSlice1.SliceFields.ItemByName['Planned_Qty'], 'Planned_Qty', 'Plan, pcs', af_Sum);
    fcxSlice1.MeasuresContainer.Measures[LIndex].Visible := False;
    fcxSlice1.MeasuresContainer.AddMeasure(fcxSlice1.SliceFields.ItemByName['Produced_Qty'], 'Produced_Qty', 'Produced, pcs', af_Sum);
    fcxSlice1.MeasuresContainer.AddMeasure(fcxSlice1.SliceFields.ItemByName['Defective_Qty'], 'Defective_Qty', 'Defects, pcs', af_Sum);
    LIndex := fcxSlice1.MeasuresContainer.AddMeasure(fcxSlice1.SliceFields.ItemByName['Operating_Hours'], 'Operating_Hours', 'Operating Time, h', af_Sum);
    fcxSlice1.MeasuresContainer.Measures[LIndex].Visible := False;
    LIndex := fcxSlice1.MeasuresContainer.AddMeasure(fcxSlice1.SliceFields.ItemByName['Downtime_min'], 'Downtime_min', 'Downtime, min', af_Sum);
    fcxSlice1.MeasuresContainer.Measures[LIndex].Visible := False;
    LIndex := fcxSlice1.MeasuresContainer.AddMeasure(fcxSlice1.SliceFields.ItemByName['Unit_Cost'], 'Unit_Cost', 'Unit Cost', af_Sum);
    fcxSlice1.MeasuresContainer.Measures[LIndex].Visible := False;
 
// Adding fields to the Data area
    fcxSlice1.XAxisContainer.AddMeasuresField;
  finally
// The table is rebuilt only here
    fcxSlice1.EndUpdate;
  end;
end;

O uso de BeginUpdate e EndUpdate é fundamental para o desempenho, pois evita múltiplos redesenhos da interface ao adicionar cada campo.

 


 

Passo 6. Conclusões de negócio com base nas fatias obtidas

Depois de gerar o relatório, podemos encontrar anomalias instantaneamente, simplesmente arrastando os campos com o mouse (Drag-and-Drop). Vamos examinar 3 exemplos de como o OLAP ajuda em tarefas reais.

Exemplo 1. Identificação dos melhores funcionários

No grid obtido, definimos os seguintes agrupamentos: «Mestre» no eixo Y, «Refugo» no eixo X.

Exemplo 1. Identificação dos melhores funcionários

Tiramos a conclusão. Se o nível de refugo do mestre Smirnov é suspeitamente baixo, esse é um sinal para estudar seus métodos de trabalho ou um motivo para premiá-lo. Os dados indicam onde procurar as melhores práticas.

 

Exemplo 2. Avaliação da eficiência dos turnos

Alteramos as regras de agrupamento. Agora «Turno» — no eixo Y; «Plano, Produção, Refugo» — no eixo X.

Exemplo 2. Avaliação da eficiência dos turnos

Com base nesses dados, concluímos que o terceiro turno apresenta um plano baixo, mas um nível alto de refugo. Isso pode indicar ineficiência na organização do trabalho no período noturno.

 

Exemplo 3. Análise dos equipamentos (taxa de refugo)

Novamente alteramos os parâmetros de agrupamento. Desta vez «Tipo de máquina» no eixo Y, «Refugo» no eixo X.

Exemplo 3. Análise dos equipamentos (taxa de refugo)

Resumindo. Se o valor de refugo de um determinado tipo de máquina excede substancialmente o indicador médio, é necessária a troca do ferramental ou um reparo.

 


 

Possibilidades para análises aprofundadas

Demonstração do uso do FastCube para análise aprofundada de dados

Com o FastCube, é possível construir muitas fatias de complexidade variada:

  • o custo por categorias e denominações dos produtos;
  • a dinâmica das paradas (por exemplo, o crescimento das paradas no verão devido às férias);
  • a análise fatorial (o custo da engrenagem acabou sendo o mais alto).

Funções importantes:

  • Detalhamento (Drill-down). Um duplo clique em uma célula da tabela dinâmica mostra a lista das linhas de origem que compõem o agregado.
  • Agregação no FastGrid. O TfrGrid também consegue exibir somas e valores médios, mas o FastCube torna isso mais flexível.

 


 

Conclusão

A combinação FastGrid + FastCube no ambiente Delphi/Lazarus — é uma solução pronta para a introdução de BI analítico em aplicativos corporativos. Você recebe:

  1. Edição dos dados brutos por meio do FastGrid.
  2. Analítica multidimensional instantânea por meio do FastCube, sem complicações com SQL.
  3. Visualização de padrões ocultos para a tomada de decisões.

Experimente todas as funções mencionadas na versão demo do FastReport VCL em nosso site.

VCL FastCube OLAP FastReport Delphi
26 de outubro de 2026

Barra de progresso no Delphi: os componentes TfrProgressBar e TfrxProgressBar do FastReport VCL

Vamos examinar mais de perto os componentes TfrProgressBar e TfrxProgressBar do FastReport VCL: configuração da escala de progresso, limites e marcadores, vinculação a dados e um exemplo em Delphi.
26 de outubro de 2026

TfrImageComboBox: Uma lista suspensa com imagens e legendas de texto no FastReport VCL

TfrImageComboBox do FastEditors VCL: uma lista suspensa com ícones e rótulos para o FastReport VCL. Propriedades, eventos e exemplos de uso no Delphi.
23 de outubro de 2026

FastGrid por dentro: o objeto View, colunas e eventos do componente de grade do Delphi

Estrutura interna do FastGrid: objeto View, propriedade Appearance, colunas, eventos e modos de trabalho com dados DB e Unbound no Delphi. Análise com base no exemplo do projeto de demonstração GridDemo.dpr.

© 1998-2026 Fast Reports Inc.