Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi wöchentliche Werte mit LocalSQL aus SQLLite holen (https://www.delphipraxis.net/170309-woechentliche-werte-mit-localsql-aus-sqllite-holen.html)

jensw_2000 10. Sep 2012 22:14

Datenbank: AnyDac LocalSQL (ähnlich SQLLite) • Version: 6.0 • Zugriff über: AnyDac

wöchentliche Werte mit LocalSQL aus SQLLite holen
 
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. :roll:

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?

Bernhard Geyer 10. Sep 2012 23:04

AW: wöchentliche Werte mit LocalSQL aus SQLLite holen
 
Kannst du diese Auswertungen nicht Vorausgewertet in eigene Tabellen ablegen?

jensw_2000 11. Sep 2012 05:20

AW: wöchentliche Werte mit LocalSQL aus SQLLite holen
 
Bei den Ist-Daten mache ich das so, dass ich sie wochenweise kumuliert in einer Zwischentabelle ablege.
Dort gibt es pro Jahr über 500.000 Datensätze.

Die Vorgaben auch nächtlich aufzubereiten ist sicher mal ein Versuch wert.
Hätte ich nie erwartet, dass ein paar tausend echte Datensätze am Ende so einen "Stress machen" ....

Danke

sx2008 11. Sep 2012 06:29

AW: wöchentliche Werte mit LocalSQL aus SQLLite holen
 
Zitat:

Die Vorgabewerte sollen nach dem Schema „ID_Mitarbeiter, ID_Kennzahl, [wöchentlicher Vorgabewert], GültigAb“ definiert werden.
Vielleicht solltest du das Feld GültigBis noch mitaufnehmen.
Dies kann deine Abfrage stark vereinfachen, da du nun die Vorgabewerte mit den Istwert einfach verjoinen kannst.
Bei Einfügen eines neuen Vorgabedatensatz wird das GültigBis-Datum z.B. auf den 31.12.2099 gesetzt.
Sobald eine neue Vorgabe mit gleicher ID_Mitarbeiter und ID_Kennzahl geschrieben wird, muss man per Code dafür sorgen, dass das GültigBis-Datum des Vorgänger automatisch korrigiert wird.
Aber das ist sehr einfach im Vergleich zu den Problemen die du jetzt hast.
Es wäre ausserdem sinnvoll, eine Funktion zu schreiben, die prüft ob es Lücken und/oder Überschneidungen der Datumsbereiche gibt (aber das ist auch einfach zu programmieren).

jensw_2000 11. Sep 2012 18:06

AW: wöchentliche Werte mit LocalSQL aus SQLLite holen
 
Hi,

das Joinen der Ist- und Vorgabewerte funktioniert leider nicht.

AnyDac LocalSQL steht noch etwas in den Kinderschuhen.
Es unterstützt derzeit noch kein "right outer join" oder "cross join (full join)".
Bedeutet, dass ich per "left outer join" immer nur Vorgabewerte für die Wochen holen könnte, für die auch ein Wert in der Ist-Daten Tabelle steht.
Wenn jemand keine Ist-Werte liefert, kann mein Tool die Vorgabewerte nicht anzeigen.


[Edit 01:53]
Mit der vorbereiteten Zwischentabelle läuft das Tool nun wieder flott.
Danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz