Juni 15, 2021, 21:12:24

Neuigkeiten:

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


Access VBA ,1 Hauptformular 1 Unterformular, 2 Recordset, m:n Beziehung

Begonnen von DocDonald, Juni 09, 2021, 15:31:25

⏪ vorheriges - nächstes ⏩

DocDonald

Juni 09, 2021, 15:31:25 Letzte Bearbeitung: Juni 09, 2021, 16:52:08 von MzKlMu Grund: Fehlender Code

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.

Sie dürfen in diesem Board keine Dateianhänge sehen.
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 Sub

Sie dürfen in diesem Board keine Dateianhänge sehen.
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 Sub



Ich 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]

MzKlMu

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.
Gruß
Klaus

DocDonald


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.

Sie dürfen in diesem Board keine Dateianhänge sehen.


Wie kann bitte ich ein Bild hier direkt einfügen?

Mit schönen Grüßen
Robert

MzKlMu

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.
Gruß
Klaus

Beaker s.a.

--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.