Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Anpassung (https://www.delphipraxis.net/178029-sql-anpassung.html)

Metallicwar 12. Dez 2013 10:14

Datenbank: ADS • Version: 10.10 • Zugriff über: RB Builder

SQL Anpassung
 
Moin zusammen!
Code:
SELECT
mas.ID, 'Mustermann, Max' as Name,      
bd.Datum,                
be.Sollzeit,
b.Me1, b.Me2
FROM MA_Stammdaten mas                   
LEFT OUTER JOIN Buchungsdatei bd ON mas.ID = bd.ID_MA_Stammdaten          
LEFT OUTER JOIN Buchungen b ON (bd.ID_MA_Stammdaten = b.ID_MA_Stammdaten AND bd.Datum = b.Datum)          
LEFT OUTER JOIN B_Ergebnisse be ON bd.ID = be.ID_Buchungsdatei
WHERE mas.ID = 2 and (b.BuchungsArt = 'A' or b.BuchungsArt is null) and Month(bd.Datum) = 9 and Year(bd.Datum) = 2013
Dieser SQL zeigt mit folgende Daten an
ID,Name,Datum,Sollzeit, Me1, Me2
2;Mustermann, Max;01.09.2013;480;08:00;17:00
2;Mustermann, Max;02.09.2013;480;08:00;12:00
2;Mustermann, Max;02.09.2013;480;12:00;15:00
...
An Tagen an denen der Mitarbeiter mehrmals gearbeitet hat, hier am 02.09 soll er nur im ersten Datensatz die Sollzeit anzeigen, im zweiten Datensatz 0.
Hintergrund: Ich bilde mir aus den Werten eine Summe am Ende des Monats und in diesem Beispiel hätte er 480 Minuten zu viel.

Hoffe mir kann jemand weiterhelfen, Danke.

Sir Rufo 12. Dez 2013 10:25

AW: SQL Anpassung
 
Der Fehler liegt doch schon mal darin, dass du hier Birnen und Äpfel anzeigst und zur Berechnung beides gleichsetzt. Die Verwunderung, dass der Apfelmus nach Birne schmeckt ... geschenkt.

Die Sollzeit bezieht sich auf den Tag und du vermengst das mit der Buchung.

Setze mal Einheiten dahinter, dann verstehst du das auch

Sollzeit = Minuten/Tag
Anfang = Uhrzeit/Buchung
Ende = Uhrzeit/Buchung

Aus Anfang und Ende bekommt man Istzeit in Minuten/Buchung

Du brauchst aber zum Vergleichen die Istzeit in Minuten/Tag um vernünftig mit der Sollzeit arbeiten zu können ;)

5€ - 3kg ist auch nicht zu lösen ;)

Metallicwar 12. Dez 2013 10:42

AW: SQL Anpassung
 
Moin
danke für die Antwort :lol: :lol:
Ich habe den SQL wo ich hier gepostet hab schon auf das minimalste gekürzt.
In meinem vollständingen SQL, lasse ich mir auch die Istzeit und Mehrarbeit anzeigen und noch einiges mehr.

Sir Rufo 12. Dez 2013 10:50

AW: SQL Anpassung
 
Auch wenn die Komplexität steigt, bleibt 5€-3kg immer noch nicht lösbar ;)

Bilde doch zunächst aus den Buchungen die Summen pro Tag, dann hast du doch auch die Werte in Minuten/Tag

jobo 12. Dez 2013 10:53

AW: SQL Anpassung
 
Die Istzeit müsste ja aus den angegebenen Zeiten zu berechnen sein. Hat aber glaub ich
nichts mit dem "Darstellungs"-Problem zu tun.
Generell gilt erstmal, SQL arbeitet Mengenbasiert und nicht wie ein Excelsheet.
Dinge wie: "wenn ein Satz vorher x steht, dann schreib hier nicht y sondern 0" funktionieren so direkt nur mit proprietären SQL Erweiterungen.
Andersrum: das Problem taucht z.B. immer auf, wenn Du Aggregat Funktionen auf nicht normalisierten Mengen durchführst. Hier der Herr Mustermann, der mehrfach gelistet ist mit seiner "Sollzeit", die nur einmal summiert werden darf.
Um aus der Nummer rauszukommen (ohne Analytic Functions, Spezialkrams) kannst Du die Menge zerlegen und für die Istzeit je Mitarbeiter eine fortlaufende, aufsteigende Nummer generieren (auch nicht unbedingt Standard SQL). Die Nummer kannst Du in der Ausgabemenge decodieren und nur, wenn der Wert 1 ist, den gültigen Istwert ausspucken.

Metallicwar 12. Dez 2013 10:56

AW: SQL Anpassung
 
Code:
SELECT
mas.ID, 'Mustermann, Max' as Name,    
bd.Datum,              
be.Sollzeit,
b.Me1, b.Me2
FROM MA_Stammdaten mas                  
LEFT OUTER JOIN Buchungsdatei bd ON mas.ID = bd.ID_MA_Stammdaten        
LEFT OUTER JOIN Buchungen b ON (bd.ID_MA_Stammdaten = b.ID_MA_Stammdaten AND bd.Datum = b.Datum)        
LEFT OUTER JOIN B_Ergebnisse be ON bd.ID = be.ID_Buchungsdatei
WHERE mas.ID = 2 and (b.BuchungsArt = 'A' or b.BuchungsArt is null) and Month(bd.Datum) = 9 and Year(bd.Datum) = 2013
Tabelle Buchungsdatei: Enthält pro Mitarbeiter für jeden Tag GENAU EINEN EINTRAG, in demu.a. gesagt wird wie lang der MA zu arbeiten hat.
Tabelle Buchungen: Kann mehrere Einträge pro Tag enthalten. In dieser Tabelle werden Informationen gespeichert von wann bis wann ein Mitarbeiter gearbeitet hat (Me1 = Kommen , Me2 = Gehen).
Tabelle B_Ergebnis: Ist über die ID der Tabelle Buchungsdatei verknüpft, enthält also pro Tag/ Mitarbeiter nur einen Datensatz. Die Tabelle enthält errechnete Tageswerte, wie z.B. Sollzeit, Istzeit, Mehrzeit. Die Tabellen werden über eines unserer Programme gefüllt.

Beide Tabellen sind über Mitarbeiter ID und dem Datum verknüpft.

In meiner Where Bedingung sage ich, dass ich für einen Mitarbeiter alle Buchungen vom Monat 9, 2013 angezeigt bekommen möchte, aber nur die Buchungen, bei denen er gearbeitet hat (BuchungsArt = 'A'). Pausebuchungen 'P' sollen nicht angezeigt werden.

Furtbichler 12. Dez 2013 13:49

AW: SQL Anpassung
 
Code:
select name,
       datum,
       Max(Sollzeit) as SollZeit,
       Sum (EndeZeit-AnfangsZeit) as ArbeitsZeit
  from Buchungen
 group by name,datum
wäre jetzt mein Ansatz. Alles drin, was man braucht. Allerdings müsste man 'EndeZeit-AnfangsZeit' noch anpassen, da ich nicht weiß, wie ADS mit Zeitangaben rechnet. Rauskommen soll natürlich die Differenz der beiten Zeitpunkte in Minuten.

jobo 12. Dez 2013 14:23

AW: SQL Anpassung
 
Zitat:

Zitat von Metallicwar (Beitrag 1239507)
An Tagen an denen der Mitarbeiter mehrmals gearbeitet hat, hier am 02.09 soll er nur im ersten Datensatz die Sollzeit anzeigen, im zweiten Datensatz 0.
Hintergrund: Ich bilde mir aus den Werten eine Summe am Ende des Monats und in diesem Beispiel hätte er 480 Minuten zu viel.

Ist die Frage, worum es eigentlich wirklich geht. Summenbildung sollte kein Problem sein, schon gar nicht Summe von Minuten. Vielleicht weiß es der TE.

baumina 12. Dez 2013 14:47

AW: SQL Anpassung
 
Mein Vorschlag wäre, wenn du sowieso mit dem ReportBuilder da dran gehst, folgender:

Registerkarte Daten / Neu / AbfrageEditor / Tabelle mit den Sollzeiten der Mitarbeiter wählen.
Danach diese dann mit der anderen Abfrage über die Persolnalnummer verlinken.
Beim Druck der Sollzeit kannst du dann das Feld aus dieser Abfrage nehmen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:26 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