Februar 27, 2021, 16:47:50

Neuigkeiten:

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


Beziehungen zwischen 3 Tabellen verursachen Fehler beim Requery

Begonnen von yme24, Januar 21, 2021, 07:57:36

⏪ vorheriges - nächstes ⏩

yme24

Hallo zusammen,

ich sitze seit ein paar Tagen nebenbei an einer (kleinen) Postverwaltung und war eigentlich der Meinung das ganz gut hin zu bekommen. Jetzt wollte ich sozusagen die Bausteine zusammenfügen und stoße auf ein Problem bei dem ich auch unter Inanspruchnahme diverser Suchfunktionen nicht so richtig zum Erfolg komme und bitte daher um eure Hilfe.

Ich habe folgende Struktur:

tbl_Kontakt - enthalten sind hier, unter einer Kontakt_ID, alle Firmendaten
tbl_Ansprechpartner - enthalten sind hier, unter einer Ansprechpartner_ID, personenbezogene Daten - also Absender/Empfänger
tbl_Nachricht - Enthalten sind hier, unter einer Nachricht_ID, alle postbezogenen Daten - Eingangsdatum, Betreff, ...

Außerdem habe ich noch 4 "kleine" Tabellen mit ID und je einem Feld. Die 4 Tabellen sind: Anrede (Herr, Frau, Dr.,...), Postrichtung (eingehend, ausgehend), Kategorie (Rechung, Anschreiben, etc.)  und Art (Email, Post, Telefon,...)

In den Beziehungen hatte ich zunächst 1:n von tbl_Nachricht zu tbl_Kontakt (über eine NachrichtID_F) sowie eine 1:n von tbl_Kontakt zu tbl_Ansprechpartner (über eine KontaktID_F) - habe aber gemerkt, dass das nicht sinnvoll ist.

Aktuell ist die Beziehung 1:n von tbl_Ansprechpartner zu tbl_Nachricht (über eine Ansprechpartner ID_F) sowie 1:n von tbl_Kontakt zu tbl_Ansprechpartner (über eine KontaktID_F)


Die Postbearbeitung soll folgende Reihenfolge bei der Eingabe haben:

Postrichtung, Art, Kategorie, Kontakt (sprich Firma), Ansprechpartner (alles Kombifelder bis hierhin) und anschließend alle Postdaten (Eingangsdatum, etc.) in Textfeldern.

Das Kombifeld Ansprechpartner bezieht sich per VBA und Datenherkunft auf das Kombifeld Kontakt (sprich: ich möchte nur die Ansprechpartner angezeigt bekommen, die auch in der jeweiligen Firma arbeiten).

Soweit so gut.

Mein Problem tritt nun auf, nachdem ich festgestellt habe, dass u.U. auch Privatleute Nachrichten senden bzw. erhalten - also das Kombifeld Kontakt ggf. nicht besetzt ist.
Mein erster Ansatz das Kombifeld Kontakt über eine Checkbox "Privat" zu steuern, habe unter Berücksichtigung der schon bestehenden Funktion ich nicht realisiert bekommen, daher wollte ich es mir "leicht" machen und habe in der tbl_Kontakt einen Kontakt "Privatperson" erstellt und in meiner Abfrage qry_Ansprechpartner so sortiert, dass dieser Kontakt immer als erstes im Kombifeld Kontakt meines Formulars erscheint. Auf diese Weise kann ich ohne Probleme auch alle "privaten" Ansprechpartner - sofern bereits in der Tabelle vorhanden, in meinem Kombifeld Ansprechpartner auswählen.

Hieraus resultiert meine o.g. Änderung der Beziehungen. In der "alten" Variante, konnte ich keine neuen Ansprechpartner hinzufügen, da hierfür ein Bezug zu einer Nachricht hergestellt werden musste. Nicht unbedingt zielführend.
Nach der Änderung in die nun aktuellen Beziehungen, kann ich zwar einen neuen Ansprechpartner hinzufügen - auch mit der Auswahl "Privatperson"  - jedoch funktioniert die Eingabe meiner Post nun nicht mehr, da ich bei Auswahl der Firma (Kombifeld-Kontakt) die Fehlermeldung erhalte, dass kein Bezug zur tbl_Ansprechpartner besteht.

Ich vermute, dass kommt vom Requery (nach Aktualisierung) des Kombifelds Kontakt - jedenfalls wird dort im VBA auch der Pointer gesetzt wenn ich "debugge".
Den Requery benötige ich aber, damit im Kombifeld Ansprechpartner auch tatsächlich nur die Personen angezeigt werden, die zum jeweiligen Kontakt gehören.

Ich habe mehrere Lösungsansätze probiert - von neuen Beziehungen (1:n von tbl_Kontakt nach KontaktID_F in tbl_Nachricht) über Zwischentabellen mit Hilfs-IDs und verknüpften UFOs, aber ich komme nicht drauf, wie ich das lösen kann.

Hat jemand von euch eine Idee?

VG,
Martin


MzKlMu

Hallo,
zeige bitte mal ein Bild des Beziehungsfensters.
Die verbale Beschreibung ist mir zu abstrakt.
Gruß
Klaus

yme24

Hallo Klaus, anbei das Bild.
Sie dürfen in diesem Board keine Dateianhänge sehen.

DF6GL

Hallo,


1. Lösung:   Beziehung tbl_Kontakt ---  tbl_Nachricht   entfällt

2. Lösung:   tbl_Kontakt entfällt  und deren Felder werden, sofern nicht doppelt,  in tbl_Ansprechpartner eingebaut.  Zusätzliche Tabelle tbl_KontaktArt  (1-n tbl_ansprechpartner) sorgt für die Unterscheidung, ob Firma , Privatperson oder sonstige Anschrift

(Andere Konstruktionen sind ebenfalls denkbar)

yme24

Hallo Franz, Danke für deine Antwort.

Lösung 1 war quasi der beschriebene Zustand. Die Beziehung wurde mir von Access vorgeschlagen und steht deshalb drin. Eine Änderung bzw. Lösung ist es aber nicht.

Lösung 2 habe ich aus Gründen der Normalität nicht gemacht. Es ist durchaus üblich mehrere Ansprechpartner in einer Firma zu haben. Wenn ich die Felder übertrage, müsste ich die Firmendaten ja immer mit eingeben.

VG,
Martin

Edit: Das "doppelte Feld" Intern in tbl_Kontakt und tbl_Ansprechpartner ist ein Relikt und wird nur in tbl_Ansprechpartner verwendet. Aus tbl_Kontakt schmeiße ich das wieder raus.


DF6GL

Hallo,

ZitatDie Beziehung wurde mir von Access vorgeschlagen und steht deshalb drin. Eine Änderung bzw. Lösung ist es aber nicht.


Ein Vorschlag vom MS muss nicht zwangläufig stimmen.. Wann und wie wurde das denn vorgeschlagen"?


Und warum ist es keine Lösung?  --> Private Ansprechpersonen  werden zu einem Kontakt "Privat"  zugeordnet.

Die angesprochene Beziehung ist trotz allem falsch.

Tabellenmäßig , nicht beziehungsmäßig, könnten tbl_Kontakte und tbl_Ansprechpartner zusammengefasst und mit sich selber in Beziehung gesetzt werden. Mit einem Kennungsfeld ist dann zu unterscheiden, ob es sich um einen Kontakt oder um Ansprechpartner handelt.


yme24

Danke für deine Antwort Franz.

Ich habe die Gewohnheit alle Nase lang mal einen Leistungstest durchzuführen um eventuelle Leichen zu finden. In diesem Zuge wurde mir die Beziehung angeraten und da Sie das angesprochene Problem weder verschlimmert noch verbessert hat, existierte sie noch.

Habe jetzt einfach mal Testweise die Beziehung wieder gelöscht - ohne Effekt auf die Ausgangslage bzw. das beschriebene Problem. Eingangs hatte ich diese Beziehung ja auch gar nicht erwähnt, weil sie - zumindest für mein Problem - belanglos ist/war.

Ich glaube, ich verstehe deinen 2. Lösungsansatz nicht.
Wenn ich Ansprechpartner und Kontakte in einer Tabelle zusammenführe, muss ich bei der Eingabe eines neuen Ansprechpartners sämtliche Kontakt-Informatonen immer wieder eingeben. Bildlich gesprochen also für jeden Mitarbeiter einer Firma - alle Firmendaten immer wieder aufs neue eintippen (Fehlerquote durch fette Finger inbegriffen). Wie kann man den dann im Formular nach Kontakt und Ansprechpartner selektieren?

VG,
Martin

DF6GL

Hallo,


die Beziehung habe ich ohne Bezug zum Problem angesprochen. Sie erscheint mir grundsätzlich falsch, bzw. überflüssig und nicht zielführend.

Lösung 2:  ursprünglich fehlt hierbei der Vorschlag im Sinne des letzten Satzes aus meinem vorherigen Posting.

Datenbeziehungsmäßig entspricht das der Lösung 1, halt nur tblKontakt und tblAnsprechpartner in einer Tabelle zusammengefaßt und dadurch Verhinderung von Redundanzen.

Mit
Zitatursprünglich "Mein erster Ansatz das Kombifeld Kontakt über eine Checkbox "Privat" zu steuern,
warst Du ja schon auf dem richtigen Weg, lediglich sollten zu einem Kontakt wie z. B. "Privat" die Ansprechparter (hier eben die Privatpersonen) zugordnet werden.


Wo ist denn da nun das Problem?

yme24

Nochmals Danke Franz,

ich habe mal die Beziehungen umgebaut so wie ich es nach deinem Post verstanden habe - entspricht das deinem Vorschlag?

Wenn ja, muss ich bei einem Beispiel bei 30 Ansprechpartnern der gleichen Firma auch 30mal sämtliche Firmendaten eingeben. Plus, bei jedem neuen Ansprechpartner dieser Firma ebenfalls. Nicht sehr Datenbank-like, oder?

Was mir noch nicht ganz klar ist: wie filtere ich denn in dieser Konstellation nachher in meinem Formular nach den Ansprechpartnern derselben Firma?

VG,
Martin
 

DF6GL

Januar 22, 2021, 15:23:26 #9 Letzte Bearbeitung: Januar 22, 2021, 19:55:33 von DF6GL
Hallo,

nein, so hab ich es nicht vorgeschlagen..


Entferne einfach die im Bild markierte Beziehung

erfasse in Tbl_Kontakte alle Kontakte (Firmen) und zusätzlich einen Kontakt "Privat" (oder mit einem anderen Namen). In tbl_Ansprechpartner werden alle "geschäftlichen" Personen zu den entspr. Firmen und zusätzlich  alle privaten Personen, die dann dem Kontakt "Privat" zugeordnet werden.


wie filtere ich denn in dieser Konstellation nachher in meinem Formular nach den Ansprechpartnern derselben Firma?


Na, einfach nach Kontakt (in "frmKontakte") filtern..



Erstelle dazu für jede 1-Tabelle ein Endlos-Formular, außer für tbl_Kontakte ("frmKontakte"--> Einzelform). In dieses Form (HFO) wird ein UFO-Steuerelement eingesetzt, das dasForm  "frm_Ansprechpartner" anzeigt und über die Schlüsselfelder verknüpft wird.


PS: Bild noch angehängt...

yme24

Januar 25, 2021, 08:13:35 #10 Letzte Bearbeitung: Januar 25, 2021, 08:18:32 von yme24
Guten Morgen Franz,

vielen Dank für deine Antwort.
Ich hatte dich da offenbar missverstanden.

Was du beschreibst ist m.E. exakt der Stand meiner DB. Einziger Unterschied ist, dass ich in die UFOs nur die für den Sachbearbeiter relevanten Daten übernommen habe.

Ich habe dir mal einen Screenshot meines Postformulars angehängt (ist noch nicht "hübsch" gemacht - da erst die Funktion passen soll).

Wenn ich einen neuen Datensatz anlege, erscheint bei der Auswahl der Firma die ebenfalls sichtbaren Fehlermeldung. Die Fehlermeldung erscheint nicht, wenn ich auf das Requery nach Aktualisierung des Kombifelds "Firma" verzichte, aber dann aktualisiert sich logischer Weise auch nicht das UFO mit den Kundendaten (rechts hinter der Fehlermeldung).
Das Kombifeld "Nachname" ist im Prinzip identisch mit dem Kombifeld Firma, nur habe ich hier eine Rowsource-Funktion verwendet damit auch nur die Ansprechpartner der ausgewählten Firma im Kombifeld erscheinen.


Ich stehe hier, wie du wahrscheinlich schon gemerkt hast, total auf dem sprichwörtlichen Schlauch.  :-\

Edit: Ich habe noch einen Screenschot vom VBA hinzugefügt. Das markierte Requery ist auch markiert wenn ich die Fehlermeldung debugge.

DF6GL

Hallo,

mmhm, was bezweckst Du mit dem Code? 

Ist das Kombi für Suchzwecke vorgesehen?
Warum brauchst Du dazu Requery?

Lad ansonsten die Db hier hoch (gezippt).

yme24

Hallo Franz,

Nein, suchen möchte ich über ein separates Suchformular (noch nicht implementiert).
Das Kombi hat "nur" Autovervollständigung.

Das Requery nutze ich, damit sich nach der Auswahl der Firma das UFO mit den Details aktualisiert + das 2. Kombi mit den Ansprechpartnern. Eine andere Möglichkeit kenne ich nicht  :-[

DB im Anhang.

DF6GL

Hallo,



ich würde erst mal klassisch (und einfacher) an die Sache herangehen. 

Wirf dazu erst mal alle Abfragen und Formulare weg.   :)  8)

Erstelle dann ein Einzelform für tbl_Ansprechpartner ("frmAnsprechpartner" mit Datenherkunft "tbl_Ansprechpartner")  ---> HFO

Für alle anderen Tabellen je ein Endlosform mit Datenherkunft des jeweiligen Tabellennamens.

frmNachricht wird als UFO in frmAnsprechpartner eingebaut und über ASPID_f und Ansprechpartner_ID verknüpft.

ASPID_F wird als gebundenes Kombi ausgeführt und bezieht seine Daten aus tbl_Ansprechpartner über eine Abfrage:

Select Ansprechpartner_ID, Vorname, Nachname, Abteilung , ......... from tbl_Ansprechpartner order by Nachname

Die anderen Fremdschlüssel werden entspr. als Kombi ausgeführt.



In frmAnsprechparnter wird gleichermaßen ein gebundenes Kombi ("ASPKontaktID_F") mit passend eingestellter Spaltenanzahl) verwendet mit Datensatzherkunft:

Select Kontakt_ID, Firma, Firma2, Betriebsstätte, Straße, Hausnummer,.........  from tbl_Kontakt order by Firma


Um die weiteren Kontaktdaten in frmAnsprechpartner anzuzeigen, erstelle für jede Spalte des Kombilistenfeldes  je ein Textfeld mit Steuerelementinhalt:


z. B:


Textfeldname            Steuerelementinhalt

txtFirma2                  =ASPKontaktID_F.Column(1)
txtBetriebstätte           =ASPKontaktID_F.Column(2)
txtStraße                  =ASPKontaktID_F.Column(3)
txtHausnummer              =ASPKontaktID_F.Column(4)

yme24

Januar 25, 2021, 10:22:14 #14 Letzte Bearbeitung: Januar 25, 2021, 12:18:39 von yme24
Danke Franz, versuche ich so.

Aber ich habe trotzdem ein Verständnisproblem. Wenn ich das hier mache:

Zitat von: DF6GL am Januar 25, 2021, 09:59:21frmNachricht wird als UFO in frmAnsprechpartner eingebaut und über ASPID_f und Ansprechpartner_ID verknüpft.

ASPID_F wird als gebundenes Kombi ausgeführt und bezieht seine Daten aus tbl_Ansprechpartner über eine Abfrage:


verschiebe ich das Problem dann nicht weg von tbl_Ansprechpartner hin zu den Tabellen Richtung, Art und Kategorie? Immerhin habe ich doch dann den direkten Bezug zu diesen Tabellen nicht mehr.

Gruß,
Martin

Edit zur Doppelpostvermeidung:

Franz, ich checke es nicht. So wie es jetzt ist (DB anbei), passt die Eingabereihenfolge nicht und ich kann so auch nicht die korrekten (der jeweiligen Firma zugeordneten) Ansprechpartner filtern. Was mache ich denn nur falsch?   :-\