So richten Sie OLAP in Delphi ein und nutzen Datenschnitte zur Lösung analytischer Aufgaben

2026-10-21

So richten Sie OLAP in Delphi ein und nutzen Datenslices zur Lösung von Analyseaufgaben

Jeder Entwickler von Buchhaltungssystemen steht vor der Aufgabe, große Datenmengen zu analysieren. Die Verwandlung von «Informationsbrei» in strukturierte Berichte ist für Managemententscheidungen entscheidend wichtig. Das betrifft zum Beispiel:

  • Lagerbuchhaltung und Bestandsverwaltung;
  • Produktionsanalyse und Kalkulation der Selbstkosten;
  • Vertriebsanalyse und Zeitreihen.

Zum Beispiel ermöglichen OLAP-Cubes (FastCube) es, diese Aufgaben schnell, anschaulich und ohne komplizierte SQL-Abfragen zu lösen. Im Unterschied zu zweidimensionalen Tabellen ermöglichen mehrdimensionale Pivot-Tabellen, die Daten aus verschiedenen Perspektiven (Slices) in Echtzeit zu betrachten.

In diesem Artikel beschreiben wir Schritt für Schritt die Erstellung einer Analyseanwendung in Delphi unter Verwendung der Komponenten TfrGrid (für die Quelldaten) und TfcxSliceGrid (für den Aufbau der Pivot-Tabelle). 

 


 


Schritt 1. Visualisierung der Rohdaten mit TfrGrid

Bevor wir die Analytik aufbauen, müssen wir die Ausgangsstichprobe sehen. Als Beispiel nehmen wir die Daten eines Maschinenbauunternehmens für das Jahr 2025.

Wir benötigen die Komponente TfrGrid, sie ist Bestandteil von FastReport VCL und ist kostenlos in der Demoversion verfügbar.

  1. Suchen Sie die Komponente TfrGrid in der Werkzeugpalette von Delphi.
  2. Platzieren Sie sie auf dem Formular und setzen Sie die Eigenschaft Align = alBottom (zur Verankerung am unteren Rand des Formulars).
  3.  

Hinzufügen der Komponente TfrGrid zum Formular

  1. Verknüpfen Sie das Grid mit der Datenquelle (TDataSource) über das Kontextmenü frGrid1TableView1.

Verknüpfung des Grids mit der Datenquelle über das Kontextmenü


 

Schritt 2. Konfiguration der Anzeige und Bearbeitung der Komponente

Das Hauptmerkmal der Grid-Komponente — direkte Bearbeitung der Zellen (Änderung der Ausgangsdaten im DB-Feld). In FastGrid wird dies durch das automatische Einsetzen von Editoren je nach Feldtyp realisiert. Zum Beispiel:

  • für Datumsfelder – ein Dropdown-Kalender.
  • für Zahlenwerte – ein SpinEdit.

Wie man Spalten konfiguriert

  1. Lokalisierung. Klicken Sie auf den Spaltenkopf, um die Felder von den technischen Bezeichnungen auf Deutsch umzubenennen (z. B. Product → Teilbezeichnung).

Hinzufügen der Lokalisierung für die Spalte «Datum»

  1. Breite. Passen Sie die Spaltenbreite manuell an (Designzeit-Modus).

Manuelle Anpassung der Spaltenbreite in der Komponente

  1. Stil. Zur besseren Lesbarkeit legen Sie unterschiedliche Farben für gerade und ungerade Zeilen fest (BackgroundColorEven / BackgroundColorOdd).

Auswahl der Stile für den Farbwechsel der Zeilen

  1. Detaillierte Konfiguration der Editoren. Bei Bedarf konfigurieren Sie gezielt die Eigenschaften jeder Spalte, indem Sie eine der Editorvarianten in der Eigenschaft mit dem Namen wählen «Properties».

Detaillierte Konfiguration der Editoren über die Eigenschaft «Properties»

Wichtig: An diesem Punkt verfügen wir über eine Oberfläche zum Ansehen und zum manuellen Korrigieren der Ausgangsdaten. Das ist noch nicht das Endergebnis der Analytik.

 


 

Schritt 3. Aufbau des multidimensionalen Cubes (OLAP) mit FastCube

Jetzt kommen wir zum wichtigsten Werkzeug — der Pivot-Tabelle. Dazu verwenden wir die Komponente TfcxSliceGrid und verknüpfen sie mit derselben Datenquelle wie TfrGrid.

  1. Platzieren Sie auf dem Formular TfcxSliceGrid und setzen Sie Align = alClient (ziehen Sie die Komponente über den gesamten verbleibenden Bereich).
  2. Fügen Sie den Trenner TSplitter zwischen TfrGrid und TfcxSliceGrid ein. Dies ermöglicht es dem Benutzer, die Größe der Komponenten zu ändern. Die Größe des einen Objekts vergrößert sich auf Kosten der Größe des anderen.

Hinzufügen des Trenners TSplitter

  1. Zur Anbindung an die Datenquelle platzieren Sie auf dem Formular eine Kette von Komponenten:
  • TfcxDBDataSet → wir geben DataSet an (unseren Hauptdatensatz).
  • TfcxDataSource → wir verknüpfen ihn mit TfcxDBDataSet. Per Rechtsklick wählen wir «Add all fields» (alle Felder erstellen).
  • TfcxCube → wir geben DataSource an und setzen CubeSource = fccs_DataSource. Wir aktivieren die Eigenschaft Active = True.
  • TfcxSlice → wir verknüpfen die Eigenschaft Cube mit TfcxCube und TfcxSliceGrid.Slice mit TfcxSlice.

 

Schritt 4. Detaillierte Konfiguration der Dimensionen (DateSplitPaths)

Für die bequeme Arbeit mit Zeitperioden muss die Aufteilung des Datums konfiguriert werden:

  1.    In der Sammlung fcxDataSource.Fields wählen Sie das Feld Date.

Liste der Felder in der Sammlung fcxDataSource.Fields

  1. Aktivieren Sie in der Eigenschaft SourceFieldProperties.SplitProperty.DateSplitPaths die Optionen: Year, Month, Day. Dies erlaubt die Verwendung des Datums für eine hierarchische Gruppierung (Jahr → Monat → Tag).

 


 

Schritt 5. Programmgesteuerte Initialisierung der Berichtsstruktur

Als Nächstes schreiben wir einen Handler für das OnShow-Ereignis des Formulars, damit wir nicht bei jedem Start die Felder mit der Maus verschieben müssen.

Initialisierungscode:

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;

Die Verwendung von BeginUpdate und EndUpdate ist für die Leistung von entscheidender Bedeutung, da sie mehrfaches Neuzeichnen der Oberfläche beim Hinzufügen jedes Feldes verhindert.

 


 

Schritt 6. Geschäftliche Schlussfolgerungen auf Grundlage der erhaltenen Slices

Nachdem wir den Bericht erzeugt haben, können wir Anomalien sofort finden, indem wir einfach die Felder mit der Maus verschieben (Drag-and-Drop). Betrachten wir 3 Beispiele dafür, wie OLAP bei realen Aufgaben hilft.

Beispiel 1. Ermittlung der besten Mitarbeiter

In dem erhaltenen Grid legen wir folgende Gruppierungen fest: «Meister» auf der Y-Achse, «Ausschuss» auf der X-Achse.

Beispiel 1. Ermittlung der besten Mitarbeiter

Wir ziehen die Schlussfolgerung. Wenn der Ausschussanteil beim Meister Smirnow verdächtig niedrig ist, ist das ein Signal, seine Arbeitsmethoden zu untersuchen, oder ein Anlass für eine Prämierung. Die Daten zeigen, wo man nach den besten Praktiken suchen sollte.

 

Beispiel 2. Bewertung der Effizienz der Schichten

Wir ändern die Gruppierungsregeln. Jetzt steht «Schicht» — auf der Y-Achse; «Plan, Ausstoß, Ausschuss» — auf der X-Achse.

Beispiel 2. Bewertung der Effizienz der Schichten

Aufgrund dieser Daten kommen wir zu dem Schluss, dass die dritte Schicht einen niedrigen Plan, aber einen hohen Ausschussanteil aufweist. Das kann auf eine ineffiziente Organisation der Arbeit in der Nacht hindeuten.

 

Beispiel 3. Analyse der Ausrüstung (Ausschussquote)

Erneut ändern wir die Gruppierungsparameter. Diesmal «Maschinentyp» auf der Y-Achse, «Ausschuss» auf der X-Achse.

Beispiel 3. Analyse der Ausrüstung (Ausschussquote)

Fazit: Wenn der Ausschusswert eines bestimmten Maschinentyps den Durchschnittswert erheblich überschreitet, ist ein Austausch der Vorrichtung oder eine Reparatur erforderlich.

 


 

Möglichkeiten für vertiefte Analysen

Demonstration der Nutzung von FastCube für die tiefgehende Datenanalyse

Mit FastCube lassen sich viele Slices unterschiedlicher Komplexität erstellen:

  • die Selbstkosten nach Kategorien und Bezeichnungen der Erzeugnisse;
  • die Dynamik der Stillstände (zum Beispiel der Anstieg der Stillstände im Sommer wegen Urlaubs);
  • die Faktorenanalyse (die Selbstkosten des Zahnrads erwiesen sich als die höchsten).

Wichtige Funktionen:

  • Detailtiefe (Drill-down). Ein Doppelklick auf eine Zelle der Pivot-Tabelle zeigt die Liste der Ausgangszeilen, aus denen sich der Aggregatwert zusammensetzt.
  • Aggregation in FastGrid. TfrGrid kann ebenfalls Summen und Mittelwerte anzeigen, aber FastCube macht dies flexibler.

 


 

Fazit

Die Kombination FastGrid + FastCube in der Umgebung Delphi/Lazarus — ist eine fertige Lösung für die Einführung von BI-Analysen in Unternehmensanwendungen. Sie erhalten:

  1. Bearbeitung der Rohdaten über FastGrid.
  2. Sofortige multidimensionale Analytik über FastCube ohne Aufwand mit SQL.
  3. Visualisierung verborgener Muster für Entscheidungen.

Probieren Sie alle genannten Funktionen in der Demoversion von FastReport VCL auf unserer Website aus.

VCL FastCube OLAP FastReport Delphi
26. Oktober 2026

TfrImageComboBox: Eine Dropdown-Liste mit Bildern und Textbeschriftungen in FastReport VCL

TfrImageComboBox aus der FastEditors VCL: eine Dropdown-Liste mit Symbolen und Beschriftungen für die FastReport VCL. Eigenschaften, Ereignisse und Anwendungsbeispiele in Delphi.
26. Oktober 2026

Fortschrittsbalken in Delphi: Die Komponenten „TfrProgressBar“ und „TfrxProgressBar“ aus FastReport VCL

Schauen wir uns die Komponenten TfrProgressBar und TfrxProgressBar aus FastReport VCL einmal genauer an: Konfiguration der Fortschrittsskala, Schwellenwerte und Markierungen, Datenbindung sowie ein Delphi-Beispiel.
23. Oktober 2026

FastGrid von innen: Das View-Objekt, Spalten und Ereignisse der Delphi-Grid-Komponente

Interner Aufbau von FastGrid: das View-Objekt, die Eigenschaft „Appearance“, Spalten, Ereignisse sowie die Datenverarbeitungsmodi „DB“ und „Unbound“ in Delphi. Erläuterung am Beispiel des Demo-Projekts „GridDemo.dpr“.

© 1998-2026 Fast Reports Inc.