Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Abfragen so korrekt?

Begonnen von Xoar, Februar 15, 2018, 14:37:12

⏪ vorheriges - nächstes ⏩

Xoar

Hallo,
ich habe mir ein paar Abfragen zusammen gebastelt, weiß aber nicht ob die so 100% korrekt sind.
Könnt ihr das evtl. mal überprüfen?

Ziel der Abfragen soll folgendes sein:
In einer Datenbank werden geplante und durchgeführte Reparaturen/Wartungen eingetragen.
Bei einer Reparatur/Wartung wird das Datum, der Kilometerstand und die Art der Reparatur/Wartung (über ein Kombinationsfeld auswählbar) eingetragen.
Es gibt es ein Ufo in dem Fahrzeugspezifische Intervalle eingetragen werden können, z.B. TÜV alle 2 Jahe, Wartung alle 50.000km etc.
Jetzt soll es eine Übersicht geben, wann die nächsten Reparaturen/Wartungen fällig sind. Sprich es muss geschaut werden, wann war die Letzte Reparatur/Wartung die zu einem Intervall passt und dann einfach den Intervall dazu addieren.
Ich habe das Beziehungsfenster als Bilder im Anhang.

Hier mal der SQL Syntax:
Abfrage 1 ,,qryLetzteWartung":
Soll darstellen wann die letzte Reparatur/Wartung durchgeführt wurde, die zu einem DS aus dem Intervall passt.
SELECT R.FahrzeugeID_F,
                     Max(R.RepDatum) AS MaxvonRepDatum,
                     R.ArtDerReparatur_F,
                     Max(R.Kilometerstand) AS MaxvonKilometerstand,
                     I.Einheit, I.Wartungsintervall
FROM tblReparaturen AS R INNER JOIN qryFzgWartungsIntervalleMitEinheit AS I ON (R.FahrzeugeID_F = I.FahrzeugID_F) AND (R.ArtDerReparatur_F = I.ArtDerReparaturID_F)
WHERE R.GeplantOderDurchgefuehrt=True
GROUP BY R.FahrzeugeID_F,
                R.ArtDerReparatur_F,
                I.Einheit,
                I.Wartungsintervall;


Abfrage 2 ,,NaechsteWartung:
Soll berechnen wann die nächste Wartung/Reparatur fällig ist, und entweder die Kilometer addieren, oder den Zeitintervall
SELECT qryLetzteWartung.MaxvonRepDatum,
                     qryLetzteWartung.FahrzeugeID_F,
                     IIf([qryLetzteWartung].[Einheit]="Jahre",DateAdd("yyyy",[Wartungsintervall],[MaxvonRepdatum])) AS NaechstesDatum,
                     IIf([qryLetzteWartung].[Einheit]="KM",[MaxvonKilometerstand]+[Wartungsintervall]) AS NaechsterKilometerstand,     
                     qryLetzteWartung.ArtDerReparatur_F,
                     F.OPTA,
                     F.Kennzeichen,
                     ArtR.NameDerReparatur
FROM (qryLetzteWartungDatum AS qryLetzteWartung INNER JOIN tblFahrzeuge AS F ON qryLetzteWartung.FahrzeugeID_F = F.FahrzeugeID)
         INNER JOIN tblArtDerReparatur AS ArtR ON qryLetzteWartung.ArtDerReparatur_F = ArtR.ArtDerReparaturID
ORDER BY qryLetzteWartung.ArtDerReparatur_F;


Nach den ersten Tests klappt das soweit alles, aber irgendwie hab ich da noch ein komisches Gefühl bei, ob das auch alles so richtig ist.
PS: Es sollen nur DURCHGEFÜHRTE Reparaturen/Wartungen berücksichtigt werden, aber das ist ja im WHERE Teil der ersten Abfrage.
Außerdem sollen nur die Werte zur Intervallberechnung berücksichtigt werden, die passen.
Beispiel:
Wartung durchgeführt:     01.01.2018 – 1000km
Zahnriemen gewechselt: 18.01.2018 – 1500km
Dann soll der Intervallwert für Wartung benutzt werden, in dem Fall 50.000km und nicht der von Zahnriemen gewechselt. Das hab ich hoffentlich mit der Abfrage1 ,,qryLetztWartung" geschafft.
Es müssen also 1000km + 50.000km gerechnet werden.

Hoffe das ist irgendwie verständlich.


PhilS

Zitat von: Xoar am Februar 15, 2018, 14:37:12[...]
WHERE R.GeplantOderDurchgefuehrt=True
[...]

PS: Es sollen nur DURCHGEFÜHRTE Reparaturen/Wartungen berücksichtigt werden, aber das ist ja im WHERE Teil der ersten Abfrage.
Dies habe ich einige Male lesen müssen, um zu verstehen, wie du das (vermutlich) meinst.
Bei jedem Lesen hatte ich da einen deutlichen WTF-Moment!
GeplantOderDurchgefuehrt=True
Was denn nun?! - Das ist ein Musterbeispiel für die extrem ungünstige Benennung eines Feldes.
So wäre es doch viel klarer:
Durchgefuehrt=True
Noch besser würde ich es finden, ein DurchgefuehrtAm-Datum zu speichern. Korrespondierend dazu ein GeplantAm-Datum, anstelle des scheinbar mehrdeutigen RepDatums. Durchgefuehrt=Ja/Nein ergibt sich dann aus dem entsprechenden Datum.

ZitatAußerdem sollen nur die Werte zur Intervallberechnung berücksichtigt werden, die passen.
Hier kann ich dir nicht mehr folgen. Technisch ist das wohl in dem
qryLetzteWartung.ArtDerReparatur_F = ArtR.ArtDerReparaturID implementiert. Aber die (fachliche) Logik dahinter ist für mich nicht nachvollziehbar.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Xoar

Hallo PhilS,

Ja ich geb dir vollkommen recht, die Benennung ist sehr unvorteilhaft. Aufjedenfall hast du es richtig interpretiert, nach den Wtf Momenten ;)

Zum zweiten Punkt,
Es gibt x beliebige Reparaturen und Wartungen die in tblReparaturen gespeichert werden.
Einige davon sind in einer extra Tabelle hinterlegt und mit einem Wartungsintervall berücksichtigt.

Jetzt soll der Intervall nur auf die Reparatur, oder Wartung angerechnet werden, die in dieser zweiten Tabelle auch erfasst sind, und nicht automatisch auf die neuste aus TblReparaturen, da hier ja auch Reparaturen  erfasst werden, die nicht relevant für die Intervalle sind.

Wie kann man das leicht erklären, mhhh


ebs17

Zitatich habe mir ein paar Abfragen zusammen gebastelt, weiß aber nicht ob die so 100% korrekt sind
Ob diese ohne Syntaxfehler durchlaufen, kannst Du alleine und schneller prüfen => Ausführen. Ob diese die gewünschten richtigen Ergebnisse an Hand der vorliegenden Daten bringen, kannst Du derzeit nur selber testen.
Bei den anderen hier könnte es sein, dass deren Zauberstab nicht lang genug ist.

Ansonsten: Ich persönlich tue mich schwer, Abfragen zu beurteilen, die selber unbekannte Abfragen enthalten, gerade bei solchen von Autoren, die "basteln". Zudem bräuchte ich die Kenntnis des Beziehungsbildes, wenn mehrere Tabellen verknüpft werden, da ich durchaus geneigt wäre, die Reihenfolge von Verknüpfen und Gruppieren zu tauschen. Davor mache ich mir wegen konkreter Logik keine Gedanken.
Das Letztgenannte hat aber etwas mit direkter und performanter Ausführung der Abfragen zu tun und damit nur im weit entfernten Sinne von 100% Korrektnes.

Der eine sagt, wenn etwas deutlich vom Optimum abweicht, kann man das Fehler nennen. Der andere sagt, wenn etwas funktioniert, kann es kein Fehler sein.
Mit freundlichem Glück Auf!

Eberhard

PhilS

Zitat von: Xoar am Februar 16, 2018, 10:08:13Es gibt x beliebige Reparaturen und Wartungen die in tblReparaturen gespeichert werden.
Einige davon sind in einer extra Tabelle hinterlegt und mit einem Wartungsintervall berücksichtigt.
OK, Ich denke damit ist es verständlich. Diese Anforderungen sollte durch den INNER JOIN aus meiner Sicht korrekt erfüllt sein.

Wenn deine Abfrage qryLetzteWartung nur dem Zweck dienen soll, das nächste Wartungsdatum zu ermitteln, könnte man dort bereits die Datenmenge über den o.g. Join reduzieren und evtl. beide Abfragen in einer zusammenfassen.

Wenn qryLetzteWartung auch für sich alleine genutzt wird, ist der Aufbau IMO korrekt, so wie er ist.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Xoar

Hallo PhilS
.
qryLetzteWartung wird nur zur Ermittlung  des nächsten Wartungstermin gebraucht, also wie du sagt könnte man die als Unterabfrage einbinden.

Welchen Vorteil bringt das? Hat man dann einfach alles nur übersichtlicher in einer Abfrage, oder ist das auch performanter?

Hallo Eberhard
Ich mache mal ein Bild vom kompletten Beziehungsfenster am Sonntag. Evtl gibt es aus der Sicht ja auch noch Verbesserungen.

Grüße




PhilS

Zitat von: Xoar am Februar 16, 2018, 12:51:21
Welchen Vorteil bringt das? Hat man dann einfach alles nur übersichtlicher in einer Abfrage, oder ist das auch performanter?
Wenn du nicht benötige Daten (ArtDerReparatur) vor der Gruppierung aus der Ergebnismenge ausfilterst, ist das wahrscheinlich schon performanter. - Ob der Unterschied effektiv spürbar ist, ist eine andere Frage.



Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor