März 03, 2021, 06:42:00

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


Listenfeld Einträge von Fremdschlüssel anzeigen lassen

Begonnen von Paddy24, Februar 03, 2021, 18:37:21

⏪ vorheriges - nächstes ⏩

Paddy24

Februar 03, 2021, 18:37:21 Letzte Bearbeitung: Februar 03, 2021, 19:12:20 von Paddy24
Hallo,

stehe gerade vor folgendem Problem:

Ich habe eine Tabelle in der mit 2 Fremdschlüsseln auf die gleiche Tabelle und Feld verwiesen werden soll.

Es gibt also eine Person, die hat in der gleichen Tabelle einen Eintrag mit der sie verbunden ist.
Ich möchte dafür ein Listenelement haben, das alle Personen anzeigt, die was mit der Person zu tun haben.

Ich habe jetzt schon etwas mit SQL und den Abfragen umher probiert, aber bisher gibt es noch kein Erfolgt.
Sie dürfen in diesem Board keine Dateianhänge sehen.

Mein Problem ist jetzt, das er nicht die Kontaktpersonen anzeigt in der Liste, sondern die "Hauptperson" selber. Er geht nach dem Datenfeld per_id_f, er soll mir aber die Person anzeigen mit der ID von KontPer_KontaktPersID.

Wie kann man das bewerkstelligen in Access?

Edit: Mein SQL Versuch war folgender, aber klappt so nicht (WHERE Abfrage):

SELECT tblPerson.per_name, tblPerson.per_vorname, tblAdressen.adr_plz, tblAdressen.adr_ort, tblKontaktdaten.kon_wert
FROM ((tblAdressen INNER JOIN tblPerson ON tblAdressen.adr_id = tblPerson.adr_id_f) INNER JOIN tblKontaktdaten ON tblPerson.per_id = tblKontaktdaten.per_id_f) INNER JOIN tblKontaktpersonen ON tblPerson.per_id = tblKontaktpersonen.per_id_f
WHERE (((tblPerson.per_id)=[tblKontaktpersonen].[KontPer_KontaktPersID]));


Edit2: OK das SQL oben ist quatsch. Ich war mir nun ziemlich sicher, das dies funktioniert, aber die Liste bleibt leer, obwohl ein Eintrag zugeordnet ist (per Tabelle)

Er muss in den INNER JOIN auf die tblKontaktpersonen.KontPer_KontaktPersID aber das klappt leider auch nicht.

SELECT tblPerson.per_name, tblPerson.per_vorname, tblAdressen.adr_plz, tblAdressen.adr_ort, tblKontaktdaten.kon_wert
FROM ((tblAdressen INNER JOIN tblPerson ON tblAdressen.adr_id = tblPerson.adr_id_f) INNER JOIN tblKontaktdaten ON tblPerson.per_id = tblKontaktdaten.per_id_f) INNER JOIN tblKontaktpersonen ON tblPerson.per_id = tblKontaktpersonen.KontPer_KontaktPersID

Vielen Dank im Voraus

MzKlMu

Hallo,
Du musst die Personentabelle 2x in das Beziehungsbild aufnehmen und 2 unabhängie 1:n Beziehungen erstellen.
Wenn die 2. Tabelle aufgenommen wird heißt die Tabelle "tblPerson_1", die _1 wird automatisch angehängt. Das muss auch so in der Abfrage gemacht werden. Wenn Du die 2. Peronentabell in die Abfrage aufnimmst, ist das zunächst falsch. Das musst Du dann händisch verbessern und 2 unabhängige Verknüpfungen erstellen, wie die Beziehungen. Das Feld "KontPer_KontaktPersID" bezieht sich dann auf die virtuelle Tabelle "tblPerson_1".

Erst dann klappt das wie gewünscht.
Gruß
Klaus

Paddy24

OK danke erstmal, hatte das mit der virtuellen Tabelle durch Zufall mal gemacht, aber nicht weiter ausprobiert.

ZitatDu musst die Personentabelle 2x in das Beziehungsbild aufnehmen und 2 unabhängie 1:n Beziehungen erstellen.

Das habe ich getan: Sie dürfen in diesem Board keine Dateianhänge sehen.

ZitatWenn Du die 2. Peronentabell in die Abfrage aufnimmst, ist das zunächst falsch. Das musst Du dann händisch verbessern und 2 unabhängige Verknüpfungen erstellen, wie die Beziehungen. Das Feld "KontPer_KontaktPersID" bezieht sich dann auf die virtuelle Tabelle "tblPerson_1".

Das hatte ich probiert, im SQL Editor, aber dann kommt eine Meldung, das die tblPerson_1 nicht gefunden werden kann. Die 2te Tabelle wird mir auch nirgends angezeigt. Ich stehe da gerade aufm Schlauch.


MzKlMu

Hallo,
Du musst auch in die Abfrage die 2. Tabelle aufnehmen, das geht nicht automatisch.
Dann musst Du aber händisch korrigieren, das macht Access zunächst falsch.
Du hast zunächst eine Doppelbeziehung von den Personen zur Kontaktperson. Eine davon musst Du löschen (Linie markieren => Entf). Dann eine neue Linie von der virtuellen Tabelle zu dem anderen Fremdschlüssel.
In der Abfrage wird die RI nicht angezeigt.

Siehe Bild, nur mit den 2 (bzw. 3) Tabellen.
Das Bild ist die Abfrage.
Gruß
Klaus

Paddy24

Ahhhhhh, jetzt habe ich es verstanden, danke.

Ich war vorher komplett auf dem falschen Pfad und habe in der Datenbankbeziehung eine Person_1 Tabelle erstellt. Aber nicht in der Abfrage selber, was man dadurch machen kann indem man die Tabelle 2mal in die Abfrage zieht.

Jetzt klappt es auch :)

Sie dürfen in diesem Board keine Dateianhänge sehen.

MzKlMu

Hallo,
das sollte natürlich auch in den Beziehungen gemacht werden.
Du musst auch unterscheiden, im Beziehungsfenster sind die Linien Beziehungen in Abfragen sind das Verknüpfungen. Das sind zwei verschiedene Dinge. Die können durchaus anders sein, müssen aber nicht.
Gruß
Klaus

Paddy24

Februar 03, 2021, 20:34:30 #6 Letzte Bearbeitung: Februar 03, 2021, 21:36:09 von Paddy24
Ah ok, das ist gut zu wissen, wieder viel gelernt heute :)

Aber eine Frage zu diesem Listenelement habe ich jetzt doch noch. Wenn ich nun über die Personensuche gehe und eine andere Person anzeige, bleibt der gleiche Eintrag in dem Listenelement stehen, der aber eigentlich gar nicht für diese neue Person richtig ist.

Die Liste war als ungebundenes Steuerelement hinzugefügt. Ich habe in der Steuerelementinhalt Eigenschaft jetzt die per_id hinterlegt, weil ich annahm, das dies dann an die Personen ID gebunden ist, was wohl aber nicht der Fall ist.

Ich habe in dem Ereignis "Nach Aktualisierung" der TxtSuche ein Requery auf das Listenelement hinterlegt, aber updaten möchte er es nicht.

Me!lstKontaktpersonen.Requery

Edit: Habe gerade gesehen, das die Datensätze nicht korrekt angezeigt werden. Es gibt insgesamt 3 Testdatensätze in der Tabelle tblKontaktpersonen und 3 Personen. Jede Person hat eine Kontaktperson (Testzwecke). Aber die Liste zeigt mir immer 2 an und ändert keinen von diesen, wenn ich die Person des HAFo's ändere.

Die Abfrage sieht aber soweit sauber aus.

SELECT tblPerson_1.per_id, tblPerson_1.per_name, tblPerson_1.per_vorname, tblAdressen.adr_plz, tblAdressen.adr_ort, tblKontaktdaten.kon_wert
FROM tblPerson INNER JOIN (tblKontaktdaten INNER JOIN ((tblKontaktpersonen INNER JOIN tblPerson AS tblPerson_1 ON tblKontaktpersonen.KontPer_KontaktPersID = tblPerson_1.per_id) INNER JOIN tblAdressen ON tblPerson_1.adr_id_f = tblAdressen.adr_id) ON tblKontaktdaten.per_id_f = tblPerson_1.per_id) ON tblPerson.per_id = tblKontaktpersonen.per_id_f
ORDER BY tblPerson_1.per_name;

MzKlMu

Hallo,
Zitatbleibt der gleiche Eintrag in dem Listenelement stehen,
Wie das geht, kannst Du in meinem Beispiel zur Personensuche sehen. Das Kombi ist auch ungebunden. Im Ereignis "Beim Anzeigen" wird dem Kombi die ID des angezeigten Datensatzes zugewiesen. Das geht auch so mit dem Listenfeld. Voraussetzung ist, dass die Suche mit dem Listenfeld auch über die ID erfolgt.

ZitatAber die Liste zeigt mir immer 2 an und ändert keinen von diesen, wenn ich die Person des HAFo's ändere.
Das Ufo muss über die richtigen Schlüsselfelder verknüpft werden, per_id und KontPer_KontaktPersID.
Gruß
Klaus

Paddy24

Februar 04, 2021, 09:45:37 #8 Letzte Bearbeitung: Februar 04, 2021, 10:47:44 von Paddy24
Wie das geht, kannst Du in meinem Beispiel zur Personensuche sehen. Das Kombi ist auch ungebunden. Im Ereignis "Beim Anzeigen" wird dem Kombi die ID des angezeigten Datensatzes zugewiesen. Das geht auch so mit dem Listenfeld. Voraussetzung ist, dass die Suche mit dem Listenfeld auch über die ID erfolgt.

Daran hatte ich mich orientiert, aber leider klappt es damit nicht. Lt. SQL Abfrage wird auch per richter ID gesucht.

...ON tblPerson.per_id = tblKontaktpersonen.per_id_f
Auch habe in VBA unter deiner Zeile die Zeile für die Liste hinzugefügt:

Private Sub Form_Current()
    Me.txtSuche = Me.per_id
    Me.lstKontaktpersonen = Me.per_id
End Sub

Zitat von: undefinedDas Ufo muss über die richtigen Schlüsselfelder verknüpft werden, per_id und KontPer_KontaktPersID.

Die Liste ist nicht per Ufo in dem Formular hinterlegt, sondern direkt auf der jeweiligen Registerseite. Ich wüsste jetzt nicht, wo ich noch eine Verbindung aufbauen muss bzw. korrigieren. Es sieht soweit sauber aus, was es wohl aber nicht ist, aber finden tue ich den Fehler nicht.


EDIT 2: OK habe es jetzt hinbekommen und verstanden was du meintest mit verknüpfen.

Also sieht Access es so, das wenn ich in der Abfrage unten die Felder hinzufüge, ansteuerbar ist. Und die Reihenfolge scheint auch wichtig zu sein.

Habe nun, damit es funktioniert, als erstes Feld die KontPer_KontaktPersID und danach die per_id_f wobei ich hier als Kriterien noch was hinterlegt habe, damit er mir auch immer den passenden Datensatz in der Liste anzeigt: [Formulare]![frmPerson]![per_id]

Damit dann die Liste nach einem Doppelklick auf einen Eintrag auch auf die Person wechselt, habe ich deinen Code von der Suche verwendet und noch in Form_Current ein Requery auf das Listenfeld gesetzt:

Private Sub Form_Current()
    'MsgBox ("Ereignis Form_Current aufrufen")
    Me.txtSuche = Me.per_id
    Me.lstKontaktpersonen = Me.per_id
    Me.lstKontaktpersonen.Requery
End Sub


Private Sub lstKontaktpersonen_DblClick(Cancel As Integer)
    ' Den mit dem Steuerelement übereinstimmenden Datensatz suchen.
    Dim rs As Object

    Set rs = Me.Recordset.Clone
    rs.FindFirst "[Per_id] = " & Me.lstKontaktpersonen
    If Not rs.EOF Then Me.Bookmark = rs.Bookmark
End Sub


Eine Verständnisfrage nur noch: Warum wird mir ein Datensatz nicht angezeigt, wenn ich zb. keine Adresse dort hinterlegt habe? Ich möchte zwar die Spalten zur Telefonnummer, PLZ und Ort auch mit anzeigen lassen aber es sollten eigentlich keine Pflichtfelder in dem Moment sein.

Muss ich dazu den Umweg gehen, einen Dummy Eintrag zu erzeugen, beim anlegen einer neuen Person oder wie kann man Access mitteilen, das man den Datensatz auch ohne Kontaktdaten oder Adresse in den Personendaten angezeigt bekommen möchte?

Vielen Dank im Voraus.

MzKlMu

Hallo,
lade die DB wieder hoch, mit der Beschreibung kommen wir nicht weiter.


Gruß
Klaus

Paddy24

Februar 04, 2021, 15:47:12 #10 Letzte Bearbeitung: Februar 06, 2021, 13:14:40 von Paddy24
Hallo,

anbei die DB im aktuellen Stand: