Neuigkeiten:

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

Mobiles Hauptmenü

Beziehung 1:n oder n:m fürs Formular...

Begonnen von Elektroschrott, Dezember 20, 2017, 14:21:53

⏪ vorheriges - nächstes ⏩

Elektroschrott

Liebes Forum, ich komme mit einem Problem nicht weiter  >:( und habe den Eindruck, dass es womöglich in Access gar nicht lösbar ist. Folgende – stark vereinfachte – Situation:

Vorhanden:

  • 1. Tabelle Daten mit den Feldern: Name, Schultyp und Klasse
  • 2. Tabelle Hinweise mit den Feldern: Schultyp, Klasse und Hinweise
Ziel:
Im bereits vorhandenen Formular (Datenquelle: 1. Tabelle) sollen die Hinweise aus der 2. Tabelle schreibgeschützt angezeigt werden, sofern Schultyp und Klasse übereinstimmen. Sollte es keine Hinweise in der 2. Tabelle geben oder anderweitig keine Übereinstimmung, dann bleibt dieses Info-Feld halt leer.

Bisherige ,,Erfolge" über unterschiedliche Versuche mit der Funktion ,,Beziehung":

  • Die Integration des Feldes ,,Hinweise" in das Formular gelingt zwar, nur sind die Felder im Formular anschließend alle schreibgeschützt. (habe gelesen, dass das wohl bei einer Beziehung 1:n oder n:m der Fall sein kann)
  • Die Integration ins Formular gelingt zwar, allerdings werden jetzt nur noch die Datensätze angezeigt, bei denen es einen Eintrag in der 2. Tabelle gibt. Das ist ein no-go, da dies bei vielen Datensätzen der Fall sein wird.

Meine Fragen:

  • Geht das rein technisch überhaupt? Ist das eine 1:n- oder eine n:m-Beziehung? Einen Primärschlüssel kann es in der 2. Tabelle ja nicht geben...
  • Und falls es möglich ist, dann wie?
Vielen Dank für Hinweise!!

DF6GL

Hallo,

es ist vieles lösbar. Leichter wäre es, wenn die Tabellen zunächst entspr. den Regeln der Normalisierung aufgebaut würden.


Warum werden die Tabellen nicht zu einer zusammengefasst?  Dann könnte einfach in einem Formular das Feld "Hinweise"  gesperrt werden.


Andere Tricksereien:

--Ein Feld im Formular einrichten, das als Steuerelementinhalt den Aufruf der Dlookup-Funktion enthält und der als Kriterien die Felder "Schultyp" und  "Klasse" mitgegeben werden.


--Ein Unterformular mit Datenherkunft zur Tabelle "Hinweise" einbauen, das über die beiden Felder "Schultyp" und  "Klasse" verknüpft.

Elektroschrott

Hallo Franz, herzlichen Dank für die ausführliche Antwort und die vielen Vorschläge! Ich werde wohl zwischen den Jahren mal Zeit finden, da weiter dran zu arbeiten.
Den ersten Tipp allerdings verstehe ich nicht ganz. In der ersten Tabelle finden sich die Stammdaten zu Personen und in der zweiten möchte ich davon unabhängig Infos zu bestimmten Klassenstufen hinterlegen, die für alle gleichermaßen gelten. Daher kann ich mir nicht vorstellen, dass das irgendwie in eine Tabelle geht.
Schöne Feiertage, Elektroschrott

DF6GL

Hallo,

das Beispiel trifft nicht diese Beschreibung:
In der ersten Tabelle finden sich die Stammdaten zu Personen und in der zweiten möchte ich davon unabhängig Infos zu bestimmten Klassenstufen hinterlegen, die für alle gleichermaßen gelten

Deshalb nochmal der Vorschlag, die Tabellen einer gründlichen Normalisierung zu unterziehen.

Elektroschrott

Danke, mit DLookup hat es wunderbar geklappt, vielen Dank für die Unterstützung!

Wen es interessiert, hier der für mich relevante Code:

hinweis = DLookup("[beachten]", "[tblHinweise]", "[S-Typ] LIKE [Schultyp] AND [in Klasse] LIKE [Klasse]")

If IsNull(hinweis) then
    Me.txtHinweise.Visible = False
Else
    Me.txtHinweise.Visible = True
    Me.txtHinweise = hinweis
End If

Elektroschrott

Jetzt habe ich doch noch eine Frage...
In einer dynamischen Optionsgruppe möchte ich Datensätze nach Mitarbeiter filtern lassen. Dafür existiert eine tblBerater mit den Namen der Mitarbeiter und einer ID ("Nummer"). Korrekt angezeigt werden mir die Namen der Schaltflächen bereits, es wird auch jeweils die ID korrekt für den Filter zurückgegeben. Nur irgendwie klappt die "Rückübersetzung" ID nach Mitarbeitername nicht:
Private Sub button_Click()
Dim MAFilter As String

Name1 = DLookup("[Mitarbeiter]", "[tblBerater]", "[Nummer]=1")
Me.m1.Caption = Name1
Name2 = DLookup("[Mitarbeiter]", "[tblBerater]", "[Nummer]=2")
Me.m2.Caption = Name2
Name3 = DLookup("[Mitarbeiter]", "[tblBerater]", "[Nummer]=3")
Me.m3.Caption = Name3
' Me.m3.Visible = True
MANummer = Me.optMitarbeiter
MAFilter = DLookup("[Mitarbeiter]", "[tblBerater]", "[Nummer]=MANummer")
MsgBox MAFilter
Me.Filter = "[Berater(in)]=MAFilter AND [Ehemalig]=False"
Me.FilterOn = True

End Sub


Was irgendwie nicht funktioniert, ist die Zeile
MAFilter = DLookup("[Mitarbeiter]", "[tblBerater]", "[Nummer]=MANummer")

Habe schon verschiedene Schreibweisen ausprobiert, was mache ich falsch?

Lachtaube

   Dim Criteria As String
   Dim EinMitarbeiter As String
   
   '...
   
   'das geht hier aber um 3 Ecken
   Criteria = BuildCriteria("Nummer", dbLong, Me.optMitarbeiter)
   EinMitarbeiter = Nz(DLookup("Mitarbeiter", "tblBerater", Criteria))
   Criteria = BuildCriteria("[Berater(in)]", dbText, EinMitarbeiter) & " AND " & _
              "Ehemalig = False"
   Me.Filter = Criteria
   '...
Grüße von der (⌒▽⌒)

Elektroschrott