Hallo,
folgendes Problem beschäftigt mich.
Es handelt sich um Personen die sich regelmäßig einer ärztlichen Untersuchung unterziehen müssen um ihre Tauglichkeit nachzuweisen.
d.h. es gibt die Felder Name, letzte Untersuchng, nächste Untersuchung in der Tabelle.
Um auch alle Untersuchungen aller Personen in der Vergangenheit auflisten zu können, muß also jede Untersuchung einen Datensatz bekommen.
Jetzt habe ich ein Formular erstellt, in dem ich die Daten eingeben kann und das mir gleichzeitig zeigt ob die Untersuchung noch aktuell ist.
Das habe ich über ne Abfrage problemlos hingekriegt.
Jetzt brauche ich ein weiteres Formular bzw. einen Bericht mit den gleichen Feldern, das mir in einer Liste anzeigt, alle letzten Untersuchungen (aber wirklich nur die letzte) aller Personen um zu wissen wann sie das nächste mal zur Untersuchung müssen, bzw. im zu wissen ob die Gültigkeit der Untersuchung schon abgelaufen ist oder nicht. (ähnlich wie beim TÜV am Auto) - davon brauche ich die Abfrage
Vielleicht kann mir ja jemand helfen, würde mich freuen...
Ciao Rico
Hallo,
folgende Abfrage listet alle auf deren Untersuchung abgelaufen ist:
SELECT ID, Name, lastUntersuchung, nextUntersuchung
FROM Tabelle1
WHERE nextUntersuchung<Now()
Du solltest deine Felder ohne Umlaute und ohne Sonderzeichen wie Leerzeichen o.ä. benennen.
Außerdem sollte deine Tabelle eine ID-Spalte haben mit FeldTyp Autowert der Primärschlüssel ist.
Gruß Andreas
Hallo Andreas,
ich brauche aber von jedem die letzte Untersuchung, egal ob abgelaufen oder nicht in einer Liste...
Hallo Rico,
möglich wäre:
SELECT Nachname, Vorname Last(lastUntersuchung) AS LetzterTermin FROM DeineTabelle
GROUP BY Nachname, Vorname
Gruß Oma
Hallo,
SELECT Nachname, Vorname, Last(lastUntersuchung) AS LetzterTermin FROM DeineTabelle
... sonst Fehler... ::)
mmmhh,
das funktioniert nicht mit "letzter Wert", aber dafür mit "max" auf das Datumsfeld "letze Untersuchung"...
nun tut sich ein neues Problem auf, wenn ich weitere Felder (wie z.B. nächste Untersuchung, tauglich, Bemerkungen) dazu nehme, bringt mir das wieder mehrere Datensätze pro Person...
Was muss ich da machen???...
Hallo,
wenn du weitere Felder zufügst, werden diese gruppiert was du sicher nicht möchtest.
Du musst also bei den weiteren Feldern überlegen, was du aus der Gruppe (Person) haben willst: Letzter Wert, Max...
Gruß Oma
@Peter: dir entgeht auch nichts 8)
also es sieht so aus, als würde das funktionieren...
Was mich nur stutzig macht, wenn ich das richtig verstehe, dann werden so keine zusammenhängenden eingegebenen Datensätze abgefragt, sondern Felder aus verschiedenen Datensätzen zu einem neuen Datenatz zusammengefügt?!..
Stimmt das?
Wenn ja, dann kann es doch sein, das dieser Datensatz im Zusammenhang falsch ist, oder nicht?
Hallo,
es werdens schon zusammenhängende Datensätze abgefragt, nur im Ergebnis stehen Werte in einer Gruppe aus verschiedenen DS
wenn z.B. nach einen Namen gruppiert wird, kannst du aus allen Datensätzen der Gruppe (nämlich der Person) verschiedene Werte herauslesen wie zb. LetzterWert: Max, Min usw.
Die Werte "gehören" dann immer zur Person, sind aber aus verschiedene DS ausgelesen.
Hoffe, dass das so verständlich ist.
Gruß Oma
das hab ich verstanden.
Gibt es denn keine Möglichkeit einen kompletten DS (oder augewählte Felder aus "einem" Datensatz) so wiederzugeben wie ich es brauche?!.. Denn so könnten die Daten doch völlig falsch zusammengefasst werden.
Ciao Rico
Hallo,
ZitatDenn so könnten die Daten doch völlig falsch zusammengefasst werden.
Nein, sie sind nicht niemals falsch zusammengefasst; Zu einer Gruppe kannst du verschiedene Werte auswählen, die sind dann immer "richtig"!! Allerdings kann es sein, dass du andere Werte wie ausgewählt, benötigst.
Dann ist aber das Ergebnis der Abfrage nicht falsch, sondern entspricht evt. nicht deinen Wünschen.
Sage doch einmal, welche Werte du aus einer Tabelle dargestellt haben möchtest??
Gruß Oma
Also es gibt viele Personen und verschiedene Untersuchungen (z.B. U1, U2, U3, U4, U5, usw.)
manche Personen müssen eine untersuchung jährlich machen, manche alle 2..., es gibt also kein Muster.
Ich brauche:
Name, Vorname, Untersuchung, letzte Untersuchung, nächste Untersuchung, Tauglichkeit, Bemerkungen, Aktualität.
Name u. Vorname sind in einer Tabelle abgelegt.
Untersuchung, letzte Untersuchung, nächste Untersuchung, Tauglichkeit, Bemerkungen ebenfalls in einer Tabelle (wird dann über PersonalNr verknüpft)
Aktualität wird in der Abfrage ermittelt, wo die Daten dann zusammengesetzt werden. Aktuell ist eine Untersuchung, wenn das aktuelle Datum zwischen letzter und nächster Untersuchung liegt.(das hilft mir bei der Filterung im Eingabeformular, da alle Untersuchungen neu eingegeben werden müssen, und nicht überschriebenwerden.)
So und ich brauche also eine Liste für U1 auf der jede Person mit den Daten der letzten Untersuchung aufgeführt ist, um zu erkennen, ist die Untersuchung abgelaufen oder nicht. (z.B. kann man dort auch erkennen, das ich die betreffende Person wieder zur neuen Untersuchung rechtzeitig anmelden muß.)
Genauso für U2, U3.....usw...
Ich hoffe es ist einigermaßen verständlich.
Ciao Rico
Hallo,
na dann win neuer Versuch:
SELECT tblPersonen.Vorname, tblPersonen.Nachname, tblUntersuchungen.naechsteU, tblUntersuchungen.letzteU,
tblUntersuchungen.Tauglichkeit, tblUntersuchungen.Bemerkung, IIf([naechsteU]<Now(),"abgelaufen","aktuell") AS Aktualitaet
FROM tblPersonen INNER JOIN tblUntersuchungen ON tblPersonen.PersonalID = tblUntersuchungen.Personal_FK
WHERE tblUntersuchungen.ID In (SELECT Last(tblUntersuchungen.ID) AS LetzterWertvonID
FROM tblUntersuchungen
GROUP BY tblUntersuchungen.Untersuchung, tblUntersuchungen.Personal_FK
HAVING tblUntersuchungen.Untersuchung="U1";);
....liefert das in der Abbildung im Anhang befindliche Beispielergebnis.
In der Herkunftstabelle sind mehere U1-Daten mit aufsteigendem Datum ab 01.01.2009 enthalten.
Zum Ablauf der Abfrage:
Es werden in der SubQuery die IDs der Datensätze ermittelt, welche das nach Personalnummer gruppierte höchste Untersuchungsdatum (im gegenständlichen Fall für U1) - enthalten.
Diese ID-Liste wird dann in der Query als Auswahlkriterium auf die ID-Spalte angewendet. In der Query werden die gewünschten Felder angezeigt.
HTH
p.s. Ergebnisse für U2 bis Un erhältst du indemdu im HAVING-Filter die Untersuchung änderst.
[Anhang gelöscht durch Administrator]
hab ich jetzt eingegeben und angepasst.
es gibt ein problem mit personal_FK - was soll das sein?
Hi,
mit Personal_FK habe ich den Fremdschlüssel (FK = ForeignKey) zur tblPersonal in meinem Testbeispiel bezeichnet - wird in deiner Tabelle vllt. gleich heißen wie der Primärschlüssel der Tabelle Personal.
Zitat(wird dann über PersonalNr verknüpft)
das wäre wohl bei mir die Personal-Nr..
also sieht fast gut aus - kann es sein, das es dann Probleme gibt wenn man die Untersuchungen nicht in chronologischer Reihenfolge eingegeben hat
also ich hab bei einer Person dreimal die U1 eingegeben als erstes die von 2007, dann die von 2010 und nachtäglich noch eine von 2004...???
Hi,
ich fürchte fast, dass das so sein wird.
Die Unterabfrage zieht den höchsten (letzten) ID Wert heran, der eingegeben wurde.
das ist so!...
und das ist nicht gut...
Trotzdem vielen Dank
OK, noch ein Versuch, bevor meine Batterien für heute leer sind:
@oma = die Fitness läßt nach ... ;D
Du brauchst 2 Abfragen
nenne die eine qryHelp und verpasse der die folgende SQL:
SELECT Max(tblUntersuchungen.letzteU) AS MaxvonletzteU, tblUntersuchungen.Personal_FK
FROM tblUntersuchungen
GROUP BY tblUntersuchungen.Personal_FK;
Dann erstellst du noch eine Abfrage, die dann die Ergebnisse für dich liefern soll - mit folgender SQL:
SELECT tblPersonen.Vorname, tblPersonen.Nachname, tblUntersuchungen.Untersuchung, tblUntersuchungen.letzteU,
tblUntersuchungen.Tauglichkeit, tblUntersuchungen.Bemerkung, IIf([naechsteU]<Now(),"abgelaufen","aktuell") AS Aktualitaet
FROM tblPersonen INNER JOIN (tblUntersuchungen INNER JOIN qryHelp ON (tblUntersuchungen.Personal_FK = qryHelp.Personal_FK)
AND (tblUntersuchungen.letzteU = qryHelp.MaxvonletzteU)) ON tblPersonen.PersonalID = tblUntersuchungen.Personal_FK
WHERE tblUntersuchungen.Untersuchung="U1";
... und das Ding sollte jetzt den letzten Untersuchungstermin berücksichtigen, egal in welcher Reihenfolge die Daten eingegeben wurden.
sieht eigentlich ganz gut aus, aber aus irgendeinem Grund fehlen ein paar Datensätze
kann ich mir aber nicht erklären woran das liegt...
Tja, das kannst nur du feststellen ::)
Eine Möglichkeit wären fehlerhafte Einträge in den Schlüsselspalten - kann ich aber nicht definitiv feststellen, da ich dein Tabellenkonstrukt nicht kenne.
Eine weitere Möglichkeit wäre das FEhlen der Untersuchungsbezeichnung bei den fehlenden Datensätzen oder eine fehlerhafte Angabe derselben (Leerzeichen? Punkte ...)
Hast du ÜBERALL (bei ALLEN Beziehungen in der Datenbank) referentielle Integrität eingestellt?
upps, du stellst Fragen...
da muss ich erst mal nachforschen, aber heute nicht mehr...
ich melde mich wieder.
Vielen Dank nochmal
Ciao Rico
jaja, schon OK - ich stelle keine Fragen, ich wollte nur auf die Möglcihkeiten hinweisen ... ;) :D ;D