manuel-r
Goto Top

Access 2003: In Unterabfrage Ergebnisse filtern mit Wert aus aktuellem Datensatz

In Datensatzherkunft (SELECT...FROM...WHERE) auf einen Wert im aktuellen Datensatz verweisen

Ich erstelle gerade eine Access Datenbank. Darin gibt es eine Tabelle PERSONAL, eine Tabelle FIRMEN und eine Tabelle STUNDEN.
PERSONAL hat den (vereinfachten) Aufbau PersNr,Firma,Name,Vorname
FIRMEN hat den (vereinfachten) Aufbau Firma, Anschrift, Kontakt
STUNDEN hat den (vereinfachten) Aufbau Datum,Firma,PersNr,Tätigkeit,Stunden

Soweit so gut. In STUNDEN kann im Datensatz über eine Unterabfrage also die betreffende Firma ausgewählt werden. Für die Auswahl der Personalnummer soll jetzt eine Unterabfrage auf die Tabelle PERSONAL so gefiltert werden, dass als Rückgabewerte aus der Gesamtmenge nur diejenigen vorkommen, die ebenfalls den Wert von Firma beinhalten.
Hintergrund ist der, dass es in den zu erfassenden Firmen und Mitarbeitern durchaus identische Personalnummern geben kann.

Wenn ich die Abfrage fest verdrahtet als SELECT Personal.Personalnummer, Personal.Name, Personal.Vorname FROM Personal WHERE Firma="FIRMENNAME" ORDER BY [Name], [Vorname], [Personalnummer] eingebe, dann funktioniert dass einwandfrei. Aber anstelle von FIRMENNAME soll dort ja der Wert gesetzt werden, den ich (beim erfassen einen Satzes) ein Feld vorher unter Firma eingesetzt habe.

Kann mir da jemand vielleicht auf die Sprünge helfen? Danke.

Content-Key: 41522

Url: https://administrator.de/contentid/41522

Ausgedruckt am: 28.03.2024 um 16:03 Uhr

Mitglied: AndreasHoster
AndreasHoster 05.10.2006 um 16:13:55 Uhr
Goto Top
Äh, schwierig, weil mir nicht klar ist, wie Du was machen willst.
Was ist bei Dir eine Unterabfrage? Ein Unterformular in einem Formular?
Und Dein SQL Beispiel geht nur auf eine Tabelle. Was meinst Du mit Feld vorher?

Also wenn Du in einer Abfrage die zwei Tabellen verknüpft haben willst, kann man das so machen:
SELECT Personal.PersNr, Personal.Firma, Personal.Name, Stunden.Datum, Stunden.Stunden
FROM Personal INNER JOIN Stunden ON (Personal.PersNr = Stunden.Persnr) AND (Personal.Firma = Stunden.Firma)
Damit wird so verknüpft, daß sowohl die Firma als auch die Personalnummer übereinstimmen muß.
Falls Du was anderes wissen willst, versuchs nochmals zu beschreiben.
Mitglied: manuel-r
manuel-r 07.10.2006 um 17:59:12 Uhr
Goto Top
Ok, ich versuche mal etwas genauer/ausführlicher zu werden (sorry, dass ich erst jetzt poste)

Ich habe also die drei Tabellen FIRMEN, PERSONAL und STUNDEN in dem oben genannten Aufbau. Beispieldaten könnten jeweils so aussehen:

Tab FIRMEN:
ABC,ABC GmbH,12345,Dumsbach
DEF,DEF OhG,23456 Dödelsdorf
GHI,GHI GbR,34567 Irgendwo

Tab PERSONAL
1000,ABC,Müller,I.
1001,ABC,Schmidt,H.
1000,DEF,Meier,C.
1000,GHI,Mayer,X.
1001,GHI,Mueller,M.
1002,GHI,Schmitz,A.

Jetzt kommt die komplizierte Tabelle STUNDEN. Dort soll also ein Datensatz erfasst werden. Es wird also im ersten Feld das Datum eingegeben (bspw. 07-10-2006) und dann im zweiten Feld die jeweilige Firma ausgewählt. Die geschieht mit einer Verknüpfung/Beziehung zur Tabelle FIRMEN (im Entwurf unter <Nachschlagen>). Als Beispiel soll GHI eingegeben werden. Bis hierhin alles kein Problem. Aber:
Im nächsten Feld (PersNr) sollen nur noch diejenigen Personen eingegeben bzw. vorgeschlagen werden, die in der PERSONAL-Tabelle mit Firma GHI gekennzeichnet sind. Im Beispiel also 1000,Mayer,X. 1001,Mueller,M. und 1002,Schmitz,A. Nicht auftauchen darf bspw. 1000,Müller,I.
Auch hierzu habe ich diverse Versuche mittels Entwurfsansicht und unter Nachschlagen dann diverse SQL-Abfragen unternommen.
Inzwischen bin ich dahinter gekommen, dass es so ohne weiteres nicht funktioniert, da der eben eingegebene Wert GHI noch nicht in der DB verewigt wurde. Ergo müsste der Sprung aus dem Feld Firma heraus in das Feld PersNr hinein zum automatischen Aktualisieren der DB führen.

Ich hoffe, dass war jetzt etwas eindeutiger.
Manuel
Mitglied: Biber
Biber 07.10.2006 um 19:06:06 Uhr
Goto Top
Moin manuel-r,

dass es so ohne weiteres nicht funktioniert, da der eben eingegebene Wert GHI noch nicht in der DB verewigt wurde.
Das ist aber ein hausgemachtes Problem. Nichts spricht dagegen, den FIRMA-Datensatz mit "GHI" zu speichern, bevor Du das STUNDEN-Eingeben erlaubst bzw. beginnst.

Warum sollte keine Firma in der Datenbank existieren dürfen ohne Mitarbeiter oder kein Mitarbeiter ohne bereits erfasste Stunden?
Natürlich sollte der übergeordnete DS schon gespeichert sein.

Eine Integritätsbedingung "es darf kein DS in MA existieren, wenn keine dazugehörigen STUNDEN-Datensätze existieren" wäre doch DB-technisch und auch rein vom gesunden Menschenverstand her Unsinn.

Gruß
Biber
Mitglied: manuel-r
manuel-r 07.10.2006 um 20:52:27 Uhr
Goto Top
Wir missverstehen uns.
In den Tabellen PERSONAL und FIRMEN ändert sich ja eigentlich nur sehr wenig. Nämlich nur dann, wenn es neues Personal oder neue Firmen gibt. Regelmäßige Erfassungen passieren nur in STUNDEN.
dass es so ohne weiteres nicht funktioniert, da der eben eingegebene Wert GHI noch nicht in der DB verewigt wurde
Dieser Satz bezog sich auf den aktuell in Bearbeitung befindlichen Datensatz in der Tabelle Stunden. Es geht einfach darum, dass ich in dem DS in einem Feld eine Angabe mache, die im nächsten Feld Filterbedingung für die möglichen Werte sein soll, wobei die möglichen Werte über Nachschlagen (also per SQL) aus einer Tabelle (PERSONAL) kommen.

Manuel
Mitglied: Biber
Biber 07.10.2006 um 22:07:35 Uhr
Goto Top
Hm, manuel,
dann lass uns nochmal auf AndreasHosters Fragen zurückkommen: Wird das ganze denn in einem Formular mit Unterformular und Unter-Unterformular auf den Bildschirm gebracht oder versuchst Du, die Anzeige (und Neuerfassung) in einer Tabellenansicht, die auf einem SELECT-Statement basiert, abzufackeln?

Wenn Unterformulare und wenn dann in einigen Feldern "eingeschränkte Wertebereiche" (wie im Feld PERSNR in Abhängigkeit von FIRMA), dann:
wie sieht denn dann die ListBox aus? Irgendwas muss doch da schon vorhanden sein?

Gruß
Biber
Mitglied: manuel-r
manuel-r 08.10.2006 um 13:52:59 Uhr
Goto Top
So, getreu dem Motto 'Ein Bild sagt mehr als 1000 Worte' habe ich jetzt mal einige Screenshots gemacht. Vielleicht wird jetzt klarer, wo ich hin will.

Hier die Entwurfsansicht von STUNDEN mit Details für Feld Firma...
http://www.fam-reindorf.de/misc/access-problem/acs-prob-2.jpg

...und hier mit Details für Feld Personalnummer
http://www.fam-reindorf.de/misc/access-problem/acs-prob-3.jpg

Bei der Eingabe von Datensätzen sieht das dann so aus für Firma...
http://www.fam-reindorf.de/misc/access-problem/acs-prob-4.jpg

...und so für Personalnummer
http://www.fam-reindorf.de/misc/access-problem/acs-prob-5.jpg

Beim Blick auf das letzte Bild wird jetzt vielleicht deutlich, was ich will. Es sollen hier nämlich nur die Personen aufgeführt werden, die als Merkmal die im Feld vorher gewählte Firma haben, dh. es dürfen nur die mit GHI möglich sein.

Manuel
Mitglied: AndreasHoster
AndreasHoster 09.10.2006 um 09:43:14 Uhr
Goto Top
So wird das nicht gehen.
In der Tabellenansicht kannst Du nicht auf noch nicht gespeicherte Werte zugreifen.
In einem Formular mit etwas Programmierung ist es machbar, da kann man auf den Wert im Formular, selbst wenn er noch nicht gespeichert ist, zugreifen.
Im Moment habe ich nur nicht die Zeit es genauer auszuführen, wie man es in einem Formular macht. Poste ich später noch.