![]() |
Datenbank: ADS • Version: 10.10 • Zugriff über: RB Builder
SQL Anpassung
Moin zusammen!
Code:
Dieser SQL zeigt mit folgende Daten an
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 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. |
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 ;) |
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. |
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 |
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. |
AW: SQL Anpassung
Code:
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.
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 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. |
AW: SQL Anpassung
Code:
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.
select name,
datum, Max(Sollzeit) as SollZeit, Sum (EndeZeit-AnfangsZeit) as ArbeitsZeit from Buchungen group by name,datum |
AW: SQL Anpassung
Zitat:
|
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 23:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz