Neuigkeiten:

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

Mobiles Hauptmenü

Doppelte Beziehung

Begonnen von Manu, März 20, 2017, 19:52:11

⏪ vorheriges - nächstes ⏩

Manu

Hallo zusammen. Mein Name ist Manuel, ich bin ein 30 jähriger Maschinenbau-Ingenieur und hatte bislang relativ wenig mit Access am Hut. Nun baue ich für meine Frau eine Datenbank zur Kundenverwaltung auf und habe mir schon einige Tutorials & Co. zu Gemüte geführt. Das grobe Grundgerüst steht auch schon soweit (ohne zu wissen ob alles auch wirklich richtig ist), allerdings habe ich ein Problem mit einer Beziehung. Und zwar:

Ich habe eine tblAnsprechpartner in der unter Anderem das Feld ansprHundeIDRef vorkommt, welches eine Beziehung mit referentieller Integrität zu der tblHunde mit dem Primärschlüssel hundID hat. in der tblHunde gibt es auch noch ein Feld, in dem des Hundes Tierarzt angegeben wird.
Jetzt wollte ich für die Tierärzte nichts extra basteln, sondern diese wiederum als Firmen/Ansprechpartner anlegen. Dafür bräuchte ich dann aber wieder eine Beziehung von dem Tierarztfeld zur tblAnsprechpartner, bzw. ansprID (Primärschlüssel). Funktionieren 2 Beziehungen irgendwie an einer Tabelle, macht das Sinn, oder wie könnte man das lösen?

Ich bedanke mich schon einmal im Voraus für Eure Hilfe!


Gruß
Manuel

MzKlMu

Hallo,
die Tabelle Firmen/Ansprechpartner 2x in das Beziehungsbild aufnehmen. Access ergänzt automatisch mit einer _1 hinten. Zu der 2. (virtuellen) Tabelle ebenfalls eine Beziehung anlegen.
Achtung, Abfragen die auf diesen Tabellen beruhen werden von Access falsch angelegt und müssen manuell gem. dem Beziehungsbild angepasst werden.

Das ist eine normale Vorgehensweise. Die Felder werden unterschieden in dem man dem Feldnamen den Tabellennamen (auch den virtuellen ..._1) getrennt durch einen Punkt voranstellt.

Zeige dann mal ein Bild des Beziehungsfensters auf dem man alle Tabelle mit allen Feldern sieht.
Gruß Klaus

Manu

Das Hinzufügen der 2. (virtuellen) Tabelle mit entsprechender Beziehung hat soweit geklappt.

Zitat von: MzKlMu am März 20, 2017, 19:58:21
Die Felder werden unterschieden in dem man dem Feldnamen den Tabellennamen (auch den virtuellen ..._1) getrennt durch einen Punkt voranstellt.

Meinst Du damit die Unterscheidung im weiteren Verlauf bei Abfragen, Berichten, etc. ?
Ein Beispiel wäre dann für das Feld anspID in tblAnsprechpartner_1:
tblAnsprechpartner.anspID ?

MzKlMu

Hallo,
ja, so meine ich das.
Gruß Klaus

PhilS

Zitat von: Manu am März 20, 2017, 21:28:29Meinst Du damit die Unterscheidung im weiteren Verlauf bei Abfragen, Berichten, etc. ?
Du musst in Abfragen die verschiedenen Beziehungen besonders dann beachten, wenn du beide Ansprechpartner-Relationen in deiner Abfrage verwendest. Die Tabelle existiert nur einmal, aber du fügst sie zweimal zur Abfrage hinzu und unterscheidest die beiden verschiedenen Instanzen über eindeutige Aliase in deinem SQL-Statement bzw. der Abfrage. - In dem verlinkten Artikel behandelt der Absatz Erforderliche Aliase genau deine Situation. - Auch wenn du deine Abfrage nicht in SQL, sondern im grafischen Abfragedesigner erstellst, ist es sicherlich gut zu verstehen, was im Hintergrund passiert.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Manu

Vielen Dank für Eure Hinweise.
Der prinzipielle Aufbau hat auch soweit geklappt (denke ich) -> siehe Bericht-Ansprechpartner.pdf

Allerdings wird die Beziehung zu der virtuellen Tabelle bei jedem Schließen/Öffnen gelöscht und es entsteht eine weitere virtuelle Tabelle mit anderen Beziehungen. -> siehe Bericht-Ansprechpartner-Fehler.pdf

Wenn ich dieses Problem umgehe und für die Tierärzte nicht auf die Ansprechpartner zurück greife, sondern eine eigene Tierarzt-Tabelle erstelle scheint alles zu funktionieren. -> siehe Bericht-extra-TA.pdf

Sehr spannend ...

Beaker s.a.

Hallo Manuel,
Von der tblAerzte ist bei dir nichts zu sehen.
Wenn ich es mit mehreren Personengruppen in einer DB zu tun habe, verwende
ich gerne einen Konstrukt mit 1:1 Beziehungen, da habe ich den Hassle mit
mehrfachen Beziehungen nicht (s. Anlage)
gruss ekkehard

P.S. Das Beispiel habe ich aus einer sehr! frühen DB von mir schnell zusammengestellt.
Deshalb die suboptimale Benamsung der Schlüsselfelder; - aber das hast
du bei dir ja schon richtig gemacht.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Manu

Die Version mit der "Tierarzt-Tabelle" ist in der Datei "Bericht-extra-TA.pdf" unten links zu sehen. Da umgehe ich die doppelte Beziehung indem ich erst die Tierärzte anlege und dann bei den Hunden einfach auswähle.

Dein Beispiel mit den 1:1 Beziehungen verstehe ich nicht ganz.
Ich habe einen Kunden. Dieser Kunde hat einen (oder mehrere) Ansprechpartner und der Ansprechpartner hat einen (oder mehrere) Hund(e). Der Hund hat wiederum einen Tierarzt. Für diesen Tierarzt wollte ich einen Ansprechpartner (den Tierarzt) anlegen.
Also habe ich ja eine Beziehung von tblAnsprechpartner zu tblHund und für das Feld Tierarzt in der tblHund eine Beziehung zurück zu tblAnsprechpartner (das ist dann der Tierarzt).

Was ändert eine 1:1 Beziehung daran, bzw. wie muss ich diese dann richtig anlegen?

MzKlMu

#8
Hallo,
wenn das mit der virtuellen Tabelle richtig gemacht wird, funktioniert das auch, garantiert. Das ist ein ganz normales Vorgehen bei einer Datenbank. Da wird auch nichts gelöscht.
Wie ich weiter oben schon schrieb, müssen Abfragen die mit diesen Tabellen erstellt werden manuell geändert werden und gespeichert.
Zitat von: MzKlMu « am: März 20, 2017, 19:58:21Achtung, Abfragen die auf diesen Tabellen beruhen werden von Access falsch angelegt und müssen manuell gem. dem Beziehungsbild angepasst werden.
Gruß Klaus

Beaker s.a.

Hallo Manuel,
Mir ging es nur darum die einen Weg zu zeigen, die doppelten
Beziehungen bei den Ansprechpartnern zu vermeiden. Wobei
ich Klaus' letzter Anmerkung nicht widersprechen möchte. Mit
dem Rest habe ich mich nicht beschäftigt.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Manu

Hallo Klaus,
das mit den Abfragen und dem gezielten Verweis auf "*_1" habe ich verstanden. Das aktuelle Vorkommnis bezieht sich auch gar nicht auf Abfragen. Ich habe lediglich die Tabellen angelegt und mit Beziehungen verknüpft.
Sicherlich habe ich da an irgendeiner Stelle einen Fehler gemacht, aber ich finde diese Stelle nicht. Nach mehrmaligen Durchführen erscheint stets das gleiche Fehlerbild.
Wie geht man hier bei einer zielführenden Fehlersuche am besten vor?
Kannst Du mir da einen Tipp geben?
Ich weiß, das ist ähnlich wie Ferndiagnosen am Auto, aber vielleicht gibt es ja bewährte Methoden ...

Danke!

MzKlMu

Hallo,
als erstes zeigst Du bitte mal ein aktuelles Beziehungsbild mit der fragwürdigen Beziehung.

Und dann erklärst Du bitte mal genau den Fehler und unter welchen Bedingungen er auftritt. Ich habe das nämlich nicht richtig verstanden.
Gruß Klaus

Manu

Hallo zusammen

Ich habe die Datenbank noch einmal komplett neu aufgebaut und im Zuge dessen etwas umstrukturiert. Es ist noch das selbe Thema enthalten, also ein Kunde (tblKunde) hat einen Hund (tblHund) und bei dem Hund wird ein Tierarzt angegeben. Dieser Tierarzt soll aber keine extra Tabelle sein, sondern aus der tblKunden entnommen werden. In der tblKunden habe ich ein Ja/Nein Feld für IstVet und über eine qry lasse ich mir nun im dem Kombinationsfeld der tblHunde werden so nur die Tierärzte angezeigt. Anscheinend funktioniert jetzt auch die virtuelle Tabelle (tblKunden_1).
Anbei noch das Beziehungsbild. Über Kommentare und Verbesserungsvorschläge diesbezüglich bin ich nach wie vor sehr interessiert, da es die erste Datenbank diesen Umfangs für mich ist...

Gruß
Manuel

Manu

Wie in den Beziehungen zu sehen, habe ich für einen Kunden nicht je eine Spalte für Telefon-/Fax-/Handynummer oder E-Mail erstellt, sondern eine gesonderte tblKontaktdaten. Dort wähle ich den Kontaktdatentyp, z.B. Handynummer, aus und trage den entsprechenden Inhalt ein. Jetzt stehe ich nur vor dem Problem, dass ich im Formular zur Dateneingabe mehrere Kontaktdaten eingeben muss. Muss ich dafür auch virtuelle Tabellen (tblKontaktdaten_1, tblKontaktdaten_2, etc.) anlegen und davon dann je die entsprechenden Felder für Typ und Inhalt?
Wie löst man das am elegantesten?

MzKlMu

Hallo,
nein, da braucht es keine virtuellen Tabellen. Du brauchst im Kundenformular ein Unterformular zur Eingabe der Kontakteinträge.
Hafo und Ufo sind über die Schlüsselfelder zu verknüpfen.
Gruß Klaus