Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: ricog am Januar 14, 2011, 23:40:52

Titel: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: ricog am Januar 14, 2011, 23:40:52
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
Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: Hondo am Januar 15, 2011, 08:50:19
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
Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: ricog am Januar 15, 2011, 09:38:04
Hallo Andreas,

ich brauche aber von jedem die letzte Untersuchung, egal ob abgelaufen oder nicht in einer Liste...
Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: oma am Januar 15, 2011, 10:31:57
Hallo Rico,

möglich wäre:

SELECT Nachname, Vorname Last(lastUntersuchung) AS LetzterTermin FROM DeineTabelle
GROUP BY Nachname, Vorname



Gruß Oma
Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: database am Januar 15, 2011, 10:38:51
Hallo,

SELECT Nachname, Vorname, Last(lastUntersuchung) AS LetzterTermin FROM DeineTabelle

... sonst Fehler...  ::)

Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: ricog am Januar 15, 2011, 11:50:59
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???...
Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: oma am Januar 15, 2011, 13:53:49
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)
Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: ricog am Januar 15, 2011, 14:21:11
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?
Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: oma am Januar 15, 2011, 14:32:44
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
Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: ricog am Januar 15, 2011, 14:40:37
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
Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: oma am Januar 15, 2011, 14:47:49
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
Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: ricog am Januar 15, 2011, 15:22:13
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
Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: database am Januar 15, 2011, 16:32:45
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]
Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: ricog am Januar 15, 2011, 16:54:17
hab ich jetzt eingegeben und angepasst.

es gibt ein problem mit personal_FK  - was soll das sein?
Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: database am Januar 15, 2011, 17:16:57
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)
Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: ricog am Januar 15, 2011, 17:33:42
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...???
Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: database am Januar 15, 2011, 18:21:39
Hi,

ich fürchte fast, dass das so sein wird.
Die Unterabfrage zieht den höchsten (letzten) ID Wert heran, der eingegeben wurde.
Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: ricog am Januar 15, 2011, 18:43:34
das ist so!...

und das ist nicht gut...

Trotzdem vielen Dank
Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: database am Januar 15, 2011, 20:32:26
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.

Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: ricog am Januar 15, 2011, 21:32:41
sieht eigentlich ganz gut aus, aber aus irgendeinem Grund fehlen ein paar Datensätze
kann ich mir aber nicht erklären woran das liegt...
Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: database am Januar 15, 2011, 21:49:58
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?
Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: ricog am Januar 15, 2011, 22:24:04
upps, du stellst Fragen...
da muss ich erst mal nachforschen, aber heute nicht mehr...

ich melde mich wieder.

Vielen Dank nochmal

Ciao Rico
Titel: Re: aus vielen Datensätzen den aktuellsten auswählen mit ner Abfrage
Beitrag von: database am Januar 15, 2011, 22:25:13
jaja, schon OK - ich stelle keine Fragen, ich wollte nur auf die Möglcihkeiten hinweisen ...   ;) :D ;D