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:
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).
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.
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:
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.
Jetzt kommen wir zum wichtigsten Werkzeug — der Pivot-Tabelle. Dazu verwenden wir die Komponente TfcxSliceGrid und verknüpfen sie mit derselben Datenquelle wie TfrGrid.
Für die bequeme Arbeit mit Zeitperioden muss die Aufteilung des Datums konfiguriert werden:
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.
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.
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.
In dem erhaltenen Grid legen wir folgende Gruppierungen fest: «Meister» auf der Y-Achse, «Ausschuss» auf der X-Achse.
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.
Wir ändern die Gruppierungsregeln. Jetzt steht «Schicht» — auf der Y-Achse; «Plan, Ausstoß, Ausschuss» — auf der X-Achse.
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.
Erneut ändern wir die Gruppierungsparameter. Diesmal «Maschinentyp» auf der Y-Achse, «Ausschuss» auf der X-Achse.
Fazit: Wenn der Ausschusswert eines bestimmten Maschinentyps den Durchschnittswert erheblich überschreitet, ist ein Austausch der Vorrichtung oder eine Reparatur erforderlich.
Mit FastCube lassen sich viele Slices unterschiedlicher Komplexität erstellen:
Wichtige Funktionen:
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:
Probieren Sie alle genannten Funktionen in der Demoversion von FastReport VCL auf unserer Website aus.