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
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
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
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.
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.
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
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
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
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?
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
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?
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
.
.
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
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)
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