Ich habe ein Statistik Tool, in dem die Ist-Daten von etwa 100 Mitarbeitern für etwa 50 Kennzahlen ausgewertet werden.
Jetzt sollen wöchentliche Vorgabewerte pro Mitarbeiter und Kennzahl hinzukommen.
Die Vorgabewerte sollen nach dem Schema „ID_Mitarbeiter, ID_Kennzahl, [wöchentlicher Vorgabewert], GültigAb“ definiert werden. So brauchen die Vorgabewerte nicht wöchentlich eingegeben werden, sondern nur wenn sich was ändert. In Schnitt kommen dort nur 2000 - 2500 Datensätze pro Jahr zusammen.
Für die wöchentliche Gegenüberstellung von Ist- und Sollwerten muss ich die Vorgaben für alle Mitarbeiter und Kennzahlen aus den "lose definierten" Vorgaben aufbereiten.
Dabei stehe ich auf dem Schlauch und bekomme langsam einen Knoten im Kopf …
Mein erster Ansatz war:
Delphi-Quellcode:
procedure TVorgabenGenerator.setze_Vorgaben(
const startDatum: TDate);
var
D: TDate;
const SQL:
String =
'
SELECT ID_Mitarbeiter,ID_Kennzahl,Vorgabewert,max(VorgabeDatum) as VorgabeDatum FROM '+
'
Vorgaben WHERE VorgabeDatum <= :Stichtag GROUP BY ID_Mitarbeiter,ID_Kennzahl,Vorgabewert';
begin
// vorhandene Vorgaben aus temoprärer Statikstik-Tabelle löschen
// Kalenderwochen ab Startdatum durchlaufen
D := StartOfTheWeek(startDatum);
while not(D >= StartOfTheWeek(IncWeek(now,1)))
do
begin
// Vorgabewerte aller Mitarbeiter und Kennzahlen am Wochenbeginn holen
// Query Parameter :Stichtag auf das Datum D setzen
// Query ausführen
// Datensätze durchlaufen und wöchentliche Vorgabewerte pro Mitarbeiter und Kennzahl in die temporäre
// Statistiktabelle inserten
// zur nächsten KW
D := IncWeek(D, 1);
end;
end;
Dumm ist, dass ich pro Jahr 52 Abfragen gegen die "Datenbank" machen muss.
Zur Zeit sind Vorgabedaten für 5 Jahre vorhanden. Die 260 Abfragen dauern knapp 20 Sekunden.
So richtig flott ist ist das nicht und hochgerechnet wird die Lösung spätestens in 5 -10 Jahren so langsam sein, dass sie niemand mehr benutzen möchte.
Ich hatte auch schon versucht, die kompletten Vorgaben in ein Array einzulesen und die wöchentlichen Werte daraus zu generieren. Das habe ich nachher verworfen.
Dabei müsste ich pro Mitarbeiter und Kennzahl prüfen, ob zum Zeitpunkt "D" ein Vorgabewert existierte und dass Array weiter durchlaufen, falls neuere Vorgaben vorhanden sind. Hochgerechnet müsste das Array 260.000 mal pro "Daten-Jahr" durchsucht werden (100 Mitarbeiter x 50 Kennzahlen x 52 Wochen).
Dann kann unmöglich schneller sein.
Hat jemand von euch eine Idee, wie ich das Problem performant lösen kann?