Neuigkeiten:

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

Mobiles Hauptmenü

Kombinationsfeld abhängig von einem anderen Kombifeld

Begonnen von Maro68, Juni 03, 2019, 17:46:53

⏪ vorheriges - nächstes ⏩

Maro68

Hallo zusammen,
ich baue gerade eine Verwaltung für unseren Kegelverein.
Dazu gibt es u.a. eine Tabelle
Mannschaften mit folgenden Feldern: MaId (=Primärschlüssel), Ma_Kürzel, Ma_Bezeichnung, Ma_Liga
Weiterhin eine Tabelle Mitglieder mit den Feldern:
Mi_ID (=Primärschlüssel), Mi_VName, Mi_NName, Mi_Geschlecht.
Die beiden Tabellen stehen in keinem direkten Zusammenhang.

Mein Formular für die Mannschaftsaufstellung besteht aus Hauptformular und Unterformular. Das HF enthält u.a. das Feld Ma_Kürzel, womit man erkennt ob es eine Herren oder Damenmannschaft ist.
Das UF enthält u.a. das Kombinationsfeld Mi_Nr mit dem ich mir die Mitglieder des Vereins auswählen kann.

Problem:
Ich möchte, dass
wenn im HF im Feld Ma_Kürzel ein H steht für Herrenmannschaft, mir dann auch nur männliche Mitglieder (Mi_Geschlecht = m) zur Auswahl im Kombifeld des UF angeboten werden.
Analog bei Ma_Kürzel = D für Damenmannschaft, mir dann auch nur weibliche Mitglieder (Mi_Geschlecht = m) zur Auswahl im Kombifeld des UF angeboten werden.

Ich komme nicht weiter, weder mit SQL-Anweisung noch mit VBA-Code.
Sollte eigentlich ganz einfach sein, wenn man weiß wie  ::)

Martin Rother

DF6GL

Hallo,

ZitatDie beiden Tabellen stehen in keinem direkten Zusammenhang.


das lässt schon mal die Alarmglocken läuten...


Der Tabellenaufbau ist m. E. unvollständig.  Es fehlt eine Zuordnungstabelle für die Mitglieder zu einer Mannschaft (tblManschaftMitglieder).

Diese Tabellen werden in (relationale) referenzielle Beziehung gesetzt.

Weiterhin wäre in tblMitglieder das Geschlecht mit "D" und "H" anstatt mit "w" und "m" gekennzeichnet sein.

Das Unterformular hat zukünftig als Datenherkunft die Tabelle tblManschaftMitglieder (MaMitID, MaMit_MitID_f ,   etc)  und wird über die entspr. Schlüsselfelder verknüpft.

Das Auswahlkombi im UFO erhält sodann als Datensatzherkunft:

ZitatSelect MitID, Mit_Nachname & ", " & Mit_Vorname From tblMitglieder Where Mit_Geschlecht = Parent!Ma_Kürzel order by Mit_Nachname
Steuerelementinhalt:  MaMit_MitID_f


Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Maro68

Hallo Franz,

ich habe die Situation nochmal im beigefügten Dokument beschrieben mit Screenshots der vorhandenen Beziehungen und dem betroffenen Formular, sowie dem Aufbau der Zuordnungstabelle.

Die Where-Klausel funktioniert nicht so einfach wie vorgesehen.

Ich hoffe, es ist im Dokument verständlich erklärt, was ich meine.

Gruß
Martin

DF6GL

Hallo,

nun, mir ist es nicht verständlich...  Die gezeigten Beziehungen sind nicht nachvollziehbar.



M. E. sollte es so aussehen:


Es gibt viele Mitglieder  (tblMitglieder)

Es gibt mehrere Mannschaften.  (tblMannschaften)

Jede Mannschaft hat bestimmte Mitglieder.  (tblMannschaftsmitglieder). Auswahl eines Mitglieds per Kombifeld.  Mit_Kürzel ist eine Bezeichnung für die Mannschaft und keine Geschlechtsdefinition.

Jedes Mannschaftsmitglied ist an mehreren Kämpfen beteiligt. (tblKämpfe)

Jeder MitgliederKampf hat ein  Ergebnis. Hierfür ist keine separate Tabelle erforderlich. Das Feld "Ergebnis" kommt in tblKämpfe zu liegen.



Beziehungen:
tblMannschaften   1:n  tblMannschaftsmitglieder  n:1  tblMitglieder

tblMannschaftsmitglieder   1:n  tblKämpfe 


Datensatzherkunft für das Mitglied-Auswahlkombi-Kombi (im UFO frmMannschaftsmitglieder, das im Hauptform frmMannschaften platziert und das an MaMit_MiID (neues Feld als Fremdschlüssel) gebunden ist:

ZitatSelect Mi_ID, Mi_NName, VName from tblMitglieder Where Mi_Geschlecht = Parent!MaMit_Geschlecht

Evtl. muss das Kombi separat bei geeignetem Ereignis aktualisiert (Requery) werden.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Maro68

Hallo,

zur Verdeutlichung der Beziehungen:
Es gibt 4 Teams, 3 Herren und 1 Damenteam. Jedes Team spielt in einer eigenen Liga mit 10 Mannschaften hat also 18 Kämpfe (= Kä_KaNr der Tabelle Kämpfe). Die Spieltage der Mannschaften sind an unterschiedlichen Wochentagen. Jede Mannschaft besteht aus 4 Keglern.

Es gibt für die Herren keine festen Zuordnung der Mitglieder zu einer Mannschaft. Jeder Herr darf an einem Spieltag nur einmal eingesetzt werden. Allerdings kann er die gesamte Saison hindurch zwischen den 3 Mannschaften beliebig wechseln.

Bsp.:
Die KaNr der Tabelle Kämpfe entspricht dem entsprechenden Spieltag (KaNr 1 bedeutet Spieltag 1)
Es ist möglich dass Kegler A am 1. Spieltag in Mannschaft H1, am 2. Spieltag in Mannschaft H2, am 3. Spieltag wieder in H1 usw. eingesetzt wird.
Kegler A darf am 1. Spieltag aber dann nicht mehr in der H2 oder H3 eingesetzt werden.


Ich möchte, dass im Formular Aufstellung für einen Kampf der H1, H2 oder H3 (=Feld Ma_Kürzel der Tabelle Mannschaften) in der Mitgliederliste nur die männlichen Mitglieder (Feld Mi_Geschlecht der Tabelle Mitglieder) angezeigt werden.
Analog bei einem Damenkampf nur die Damen.

In der Tabelle Ergebnisse sind alle Ergebnisse von jedem Kegler in jedem seiner Kämpfe abgespeichert. Ein Datensatz pro Kampf und Mitglied.
Um auswerten zu können in welcher Mannschaft er gespielt hat, ist u.a. auch die Ma_ID als Feld mit aufgenommen.


Beaker s.a.

Hallo Marco,
ZitatBeziehungen:
tblMannschaften   1:n  tblMannschaftsmitglieder  n:1  tblMitglieder
Wenn du in diese Tabelle (mittlere) noch einen FK zum Spieltag hinzu
nimmst, sollten alle Wünsche zu erfüllen sein. Mit entsprechender
Indexierung kann ein Spieler an einem Spieltag autom. nur in
einer Mannschaft spielen.
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)

Maro68

Hallo Ekkehard,
genauso ist die Tabelle Ergebnisse aufgebaut.
Es kann kein Spieler am gleichen Spieltag mehrmals aufgestellt werden - das passt alles schon.
Ich denke der Tabellenaufbau und Beziehungen sind soweit ok.

Ich hab ,,nur" Probleme die Mitgliederliste entsprechend anzuzeigen, wie unten bzw im Word Dokument beschrieben (VBA bin ich schwach

Gruss Martin

Beaker s.a.

Hallo Martin,
ZitatVBA bin ich schwach
Hier ist eher SQL gefragt.

Im Prinzip, - zeige alle Mitglieder deren Geschlecht = dem Geschlecht der Mannschaft ist.

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)

Maro68

Das Prinzip ist schon klar. Aber wie packe ich die Bedingung:
Wenn Ma_Kürzel (aus Tbl Mannschaft) = H1 or H2 or H3, dann zeige Mitglieder mit Mi_Geschlecht (aus TBL Mitglieder) = m
In eine SQL Anweisung?

DF6GL

Hallo,

wie schon gesagt, wobei die Namen anzupassen sind.

Und : Ma_Kürzel ist NICHT für eine Bedingung geeignet.


ZitatSelect Mi_ID, Mi_NName, VName from tblMitglieder Where Mi_Geschlecht = Parent!Ma_Geschlecht
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Maro68

Ich glaube ich habe mich undeutlich ausgedrückt.

Je nach Inhalt des Kombifeldes (Mannschaftstyp) im Hauptformular, soll sich die Datensatzherkunft (= Abfrage über die Tabelle Mitglieder) im Kombifeld des Unterformulars ändern.

Lösungsidee:
den sqlstring für die Mitgliederabfrage mit einer Select Case Bedingung anpassen, aber ich krieg es irgendwie nicht hin.
In Worten:
Wenn Herrenmannschaft, dann SQL-Abfrage nur männliche Mitglieder für Datensatzherkunft im Kombifeld des UF,
Wenn Damenmannschaft, dann SQL-Abfrage nur weibliche Mitglieder für Datensatzherkunft im Kombifeld des UF,
Wenn Mixmannschaft, dann SQL-Abfrage alle Mitglieder für Datensatzherkunft im Kombifeld des UF,

Liege ich mit meiner Idee richtig?



DF6GL

Hallo,

mir(uns) ist schon klar, was Du machen willst, und ich habe mich undeutlich ausgedrückt:


Wirf die Db weg und erstelle eine neue, in der die Datenverhältnisse normalisiert sind (siehe u. st. Links 1, 1a, 1b)  und in eine relationale Tabellenkonstruktion überführt sind.

Dann braucht es (fast) weder Code noch Select Case- Tricksereien, um abhängige Kombifelder abzubilden.


.
.
.
Dim strSQL as String
Select Case Me!Ma_Kürzel

Case  "H": strSQL = "select * from Mitglieder where Ma_Kürzel = 'H'"

Case  "D": strSQL = "select * from Mitglieder where Ma_Kürzel = 'D'"

Case Else: strSQL = "select * from Mitglieder

End Select

Me!Ufo_Steuerelementname! Mi_Nr.Rowsource = strSQL
.
.

Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Maro68

Hallo,

ich hab es (endlich) geschafft und so gelöst:
-----------------
Private Sub Form_Load()
    'MsgBox Me.Kä_MaID.Value
   
    Dim sqls As String
    sqls = "SELECT Mitglieder.Mi_ID, [Mi_VName] & "" "" & [Mi_NName] AS Name FROM Mitglieder"
    Select Case Me.Kä_MaID
        Case 1
            sqls = sqls & " Where Mitglieder.Mi_Geschlecht = ""m"";"
        Case 3
            sqls = sqls & " Where Mitglieder.Mi_Geschlecht = ""w"";"
    End Select
    Me.UF_Aufstellung!txt_ErgMiNr.RowSource = sqls
     
    'MsgBox Me.UF_Aufstellung!txt_ErgMiNr.RowSource

End Sub
------------------

Dazu musste ich meine DB nicht ändern. Die Codelogik ist exakt identisch mit deiner Lösung.
@Franz: Du hast von "Tricksereien" gesprochen.
Ist der Code "Trickserei", oder ist es gut, also die DB ganz ok, wenn es mit den paar Codezeilen funktioniert?

Zum Abschluß nur noch ein kleines Problemchen:
An welches Ereignis binde ich die obige Prozedur am besten, wenn sich die Datenherkunft bei jedem Datensatzwechsel im Hauptformular entsprechend anpassen soll?

Besten Dank für Eure Hilfe.
Martin

DF6GL

Hallo,

Der Code an sich ist keine Trickserei, gleichwohl ist er nicht optimal. Es sind feste Werte ("m", "w" , Case 1--> "Magic Numbers") implementiert, die bei  Datenänderungen in den Urwald führen können.
Trickserei ist halt, wenn solche Maßnahmen überhaupt ergriffen werden müssen.

(Die doppelten Gänsefüße kannst Du zudem durch ein Hochkomma ersetzen)

Es führen halt viele Wege nach Rom   ;)

Zitatwenn sich die Datenherkunft bei jedem Datensatzwechsel im Hauptformular

genau daran...

Bei Datensatzwechsel == Beim Anzeigen == OnCurrent (Form_Current)
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Beaker s.a.

Hallo,
ZitatDie doppelten Gänsefüße kannst Du zudem durch ein Hochkomma ersetzen
Und das Semikolon am Ende kannst du dir auch sparen.
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)