AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi wöchentliche Werte mit LocalSQL aus SQLLite holen
Thema durchsuchen
Ansicht
Themen-Optionen

wöchentliche Werte mit LocalSQL aus SQLLite holen

Ein Thema von jensw_2000 · begonnen am 10. Sep 2012 · letzter Beitrag vom 11. Sep 2012
Antwort Antwort
jensw_2000
(Gast)

n/a Beiträge
 
#1

wöchentliche Werte mit LocalSQL aus SQLLite holen

  Alt 10. Sep 2012, 22:14
Datenbank: AnyDac LocalSQL (ähnlich SQLLite) • Version: 6.0 • Zugriff über: AnyDac
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?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: wöchentliche Werte mit LocalSQL aus SQLLite holen

  Alt 10. Sep 2012, 23:04
Kannst du diese Auswertungen nicht Vorausgewertet in eigene Tabellen ablegen?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#3

AW: wöchentliche Werte mit LocalSQL aus SQLLite holen

  Alt 11. Sep 2012, 05:20
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
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

AW: wöchentliche Werte mit LocalSQL aus SQLLite holen

  Alt 11. Sep 2012, 06:29
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).
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#5

AW: wöchentliche Werte mit LocalSQL aus SQLLite holen

  Alt 11. Sep 2012, 18:06
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

Geändert von jensw_2000 (12. Sep 2012 um 00:57 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:55 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