Sehr geehrte Forumsmitgliederinnen und Forumsmitglieder,
ich bin ein Neuzugang hier und in ACCESS stehe ich auch am Anfang. Ich hoffe, relativ am Anfang. Ich hoffe, ich werde den Forumsregeln und den Ansprüchen der Personen hier gerecht. Falls nicht, freue ich mich über Tipps.
Es gibt ein Problem, welches ich auch nach intensivem Googlen und Durchforsten von Foren nicht gelöst bekomme.
Wahrscheinlich ist es einfach und ich sehe den Wald vor lauter Bäumen nicht.
Ich habe mich aus verschiedenen Gründen für ungebundene Formulare und Steuerelemente entschieden.
Es existieren ein ungebundenes Hauptformular ("frm_Personen" - inhaltlich bezogen auf die Tabelle tbl1_Personen) und ein ungebundenes Unterformular ("subfrm_qry21_c" - inhaltlich bezogen auf die Tabelle tbl1_Telefonnummern - subfrm_qry21_c beruht nicht auf einer Query, ist nur der historische Name), welche ich mittels VBA/zweier Recordset befülle und in dem Formular navigiere (möchte). Beim Hauptformular funktioniert dies auch ohne Probleme. Beim Unterformular hapert es.
Es existiert eine m:n Beziehung zwischen diesen beiden Tabellen/beiden Formularen, dargestellt in der
Junction-Tabelle tbl3_Personen_Telefonnummern mit den gemeinsamen Schlüssel-Feldern
1. tbl1_Personen_ID_FK ---> mit der Tabelle tbl1_Personen und
2. tbl1_Telefonnummern_ID_FK ---> mit der Tabelle tbl1_Telefonnummern.
Felder in Hauptformular:
1. txt_tbl1_Personen_ID ---> PK tbl1_Personen
2. txt_Anrede_ID_FK ---> FK zu Tabelle mit Anreden, (1:n)
3. txt_Vorname
4. txt_Nachname
Felder in Unterformular (Standardsansicht Datenblatt):
1. txt_tbl1_Personen_ID_FK ---> FK zu Junction-Tabelle tbl3_Personen_Telefonnummern (nur zur Kontrolle gedacht, später zu entfernen, wird aber seltsamerweise in der Formularansicht gar nicht angezeigt, sondern nur in der Entwurfsansicht)
2. txt_TelefonArt_ID_FK ---> FK zu Tabelle mit Anschlussart des Telefons (Office, Home, Fax ...), (1:n)
3. txt_TelefonNummer
Anbei der VBA-Code für das HF und das UF.
1 Form Load HF.txt
Private Sub Form_Load()
'Vorbereitung zweier Recordsets zur Füllung des ungebundenen Hauptformulars und des ungebundenen Unterformulars deren Daten am Ende über Call get_DataForForm aufgerufen werden
Set m_db = CurrentDb
'<----- First Recordset for Hauptformular ----->
Dim sSQL As String
sSQL = "SELECT * FROM tbl1_Personen WHERE InActive = " & 0
Set m_rs = m_db.OpenRecordset(sSQL, dbOpenDynaset, dbSeeChanges)
'<----- /First Recordset for Hauptformular ----->
'<----- Preprocedure for RecordCount ----->
If Not (m_rs.BOF And m_rs.EOF) Then
With m_rs
.MoveLast
.MoveFirst
End With
Call get_RecordCount
End If
If m_rs.BOF Then
Call get_RecordCount
'<----- optional Buttons' Format----->
Call get_btnFormat
'<----- /optional Buttons' Format----->
Exit Sub
End If
'<----- /Preprocedure for RecordCount ----->
'<----- Second Recordset for Unterformular ----->
Dim sSQLUnter As String
sSQLUnter = "SELECT tbl1_Personen.tbl1_Personen_ID, tbl3_Personen_Telefonnummern.tbl1_Personen_ID_FK, tbl1_Telefonnummern.TelefonArt_ID_FK, tbl1_Telefonnummern.TelefonNummer " _
& "FROM tbl1_Telefonnummern " _
& "INNER JOIN (tbl1_Personen " _
& "INNER JOIN tbl3_Personen_Telefonnummern " _
& "ON tbl1_Personen.tbl1_Personen_ID = tbl3_Personen_Telefonnummern.tbl1_Personen_ID_FK) " _
& "ON tbl1_Telefonnummern.tbl1_Telefonnummern_ID = tbl3_Personen_Telefonnummern.tbl1_Telefonnummern_ID_FK " _
& "WHERE tbl3_Personen_Telefonnummern.tbl1_Personen_ID_FK = " & m_rs.Fields("tbl1_Personen_ID")
Set m_rsUnter = m_db.OpenRecordset(sSQLUnter, dbOpenDynaset, dbSeeChanges)
m_rsUnter.MoveFirst
'<----- /Second Recordset for Unterformular ----->
'<----- Aufruf zur Abbildung der Daten aus den beiden Recordset in Hauptformular und Unterformular ----->
Call get_DataForForm
'<----- /Aufruf zur Abbildung der Daten aus den beiden Recordset in Hauptformular und Unterformular ----->
End Sub2 Get Data for HF und UF.txt
Private Sub get_DataForForm()
'<----- Load Data into Hauptformular from First Recordset ----->
If Not (m_rs.BOF And m_rs.EOF) Then
With Me
.txt_tbl1_Personen_ID = m_rs.Fields("tbl1_Personen_ID")
.txt_Anrede_ID_FK = m_rs.Fields("Anrede_ID_FK")
.txt_Vorname = m_rs.Fields("Vorname")
.txt_Nachname = m_rs.Fields("Nachname")
.txt_InActive = m_rs.Fields("InActive")
End With
End If
'<----- /Load Data into Hauptformular from First Recordset ----->
'<----- Load Data into Unterformular from Second Recordset incl. Iteration through Second Recordset ----->
If Not (m_rsUnter.BOF And m_rsUnter.EOF) Then
'<----- Iteration through Second Recordset and loading to Unterformular ----->
Do While Not m_rsUnter.EOF ===> Fehler, wird nur eine Nummer angezeigt, obwohl 2x durchläuft
With Me.subfrm_qry21_c.Form
.txt_tbl1_Personen_ID_FK = m_rsUnter.Fields("tbl1_Personen_ID_FK")
.txt_TelefonArt_ID_FK = m_rsUnter.Fields("TelefonArt_ID_FK")
.txt_TelefonNummer = m_rsUnter.Fields("TelefonNummer")
m_rsUnter.MoveNext
End With
Loop
'<----- /Iteration through Second Recordset and loading to Unterformular ----->
End If
'<----- /Load Data into Unterformular from Second Recordset incl. Iteration through Second Recordset ----->
'<----- optional Buttons' Format ----->
Call get_btnFormat
'<----- /optional Buttons' Format ----->
End SubIch freue mich über jeden Hinweis und Tipp.
Gleichzeitig bedanke mich im Voraus für Eure Bemühungen und Geduld.
Mit schönen Grüßen[/pre]
Hallo,
Ich freue mich über jeden Hinweis und Tipp.Verwende gebundene Formulare. Es gibt keinen Grund auf diese komfortable Funktionalität bei Access zu verzichten. Für die gezeigte einfache Anwendung schon mal gar nicht.
Was sind denn das für Gründe die Dich zu den ungebundenen Formularen verleiten ließen ?
Wahrscheinlich kommst Du für das geschilderte Problem ohne eine Zeile Code aus wenn Du geb. Formulare verwendest.
Außerdem sind meiner Meingung nach die Beziehungen falsch.
Kannst Du mal ein Bild des Beziehungsfensters posten, aber so, dass man alle Tabellen mit allen Feldern sieht.
Hallo Klaus,
danke Dir sehr für Deine prompte Antwort.
Es tut mir leid, dass die Formatierung meines ersten Posts so unschön ist.
Ich habe, wie gewünscht, eine Abbildung der Beziehungen beigefügt.
Ich muss für eine berufliche Aufgabe VBA lernen, habe also somit auch keinen Einfluss darauf. Das von Dir gesagte ist mir bewusst.
Abbildung m-n Beziehung.png
Wie kann bitte ich ein Bild hier direkt einfügen?
Mit schönen Grüßen
Robert
Hallo,
Tabelle 3 ist überflüssig. Siehe Bild.
Ich würde auch keinen zusammengesetzten Primärschlüssel verwenden. Und immer referentielle Integrität einstellen.
Was ist eigentlich mit der EMailadresse und ggf. Homepage, wird das nicht erfasst ?
Zum Code kann ich im Moment nichts sagen, aber den musst Du nach Änderung der Beziehungen ohnehin umgestalten.
Außerdem kann ich Dir da auch nicht so viel helfen, ich habe noch niemals VBA verwendet um Formulare zu füllen.
ZitatIch muss für eine berufliche Aufgabe VBA lernen
Da gäbe es geeignetere Betätigungsfelder.
So lernst Du jedenfalls nicht das VBA das man sinnvollerweise bei Access einsetzt.
zu spät