AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SQL Anpassung

Ein Thema von Metallicwar · begonnen am 12. Dez 2013 · letzter Beitrag vom 12. Dez 2013
Antwort Antwort
Metallicwar

Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
 
Delphi XE Architect
 
#1

SQL Anpassung

  Alt 12. Dez 2013, 11:14
Datenbank: ADS • Version: 10.10 • Zugriff über: RB Builder
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: SQL Anpassung

  Alt 12. Dez 2013, 11:25
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Metallicwar

Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
 
Delphi XE Architect
 
#3

AW: SQL Anpassung

  Alt 12. Dez 2013, 11:42
Moin
danke für die Antwort
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: SQL Anpassung

  Alt 12. Dez 2013, 11:50
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#5

AW: SQL Anpassung

  Alt 12. Dez 2013, 11:53
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Metallicwar

Registriert seit: 5. Feb 2010
Ort: Bad Kissingen
293 Beiträge
 
Delphi XE Architect
 
#6

AW: SQL Anpassung

  Alt 12. Dez 2013, 11:56
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.

Geändert von Metallicwar (12. Dez 2013 um 12:02 Uhr)
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#7

AW: SQL Anpassung

  Alt 12. Dez 2013, 14:49
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.
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: SQL Anpassung

  Alt 12. Dez 2013, 15:23
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.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: SQL Anpassung

  Alt 12. Dez 2013, 15:47
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.
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  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 12:11 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