Neuigkeiten:

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

Mobiles Hauptmenü

Fokus auf Unterformular verschieben ist nicht möglich

Begonnen von Eisman333, Februar 07, 2022, 14:13:20

⏪ vorheriges - nächstes ⏩

Eisman333

Hallo Liebe Community,

ich bin gerade auf ein sehr eigenartiges Problem gestoßen. Mein VBA Code für eine bestimmte Aktion ist in zwei verschiedenen Formularen eingebaut, einmal in einem Click-Event und einmal in einem AfterUpdate-Event. Der Code selbst und die Umgebung ist soweit ich mit meiner dreifachen Kontrolle feststellen konnte ansonsten identisch.

In einem der Formulare (Click) funktioniert alles ohne Probleme aber im zweiten meldet Access ein Problem beim Fokussieren des Unterformulars. Folgend einmal der Code, genauere Beschreibung folgt danach:

strSQL = "SELECT * FROM tblEigenschaften WHERE lngArtikel = " & Me.lngVater
Set eigenschaften = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)

If eigenschaften.EOF Then
    MsgBox ("Dieser Vaterartikel hat keine Eigenschaften.")
    Exit Sub
End If

intI = 1
With eigenschaften
    Do Until .EOF
        .Edit
        If intI > 1 Then
            Me.ufrmEigenschaften.SetFocus
            DoCmd.GoToRecord , , acNext
            Me.Form.SetFocus
        End If

        Me.ufrmEigenschaften!lngLegierung = ![lngLegierung]
        Me.ufrmEigenschaften!txtMaterial = ![txtMaterial]
        Me.ufrmEigenschaften!txtPlattierung = ![txtPlattierung]
        Me.ufrmEigenschaften!txtFarbe = ![txtFarbe]
        Me.ufrmEigenschaften!lngGröße = ![lngGröße]
        Me.ufrmEigenschaften!txtLänge = ![txtLänge]
        Me.ufrmEigenschaften!txtZusätzlich = ![txtZusätzlich]
        Me.ufrmEigenschaften!txtPerlen = ![txtPerlen]
        Me.ufrmEigenschaften!txtSteine = ![txtSteine]

        .Update
        .MoveNext
        intI = intI + 1
    Loop
End With
   
eigenschaften.Close
Set eigenschaften = Nothing

Insgesamt ist das ganze aufgebaut auf einem Vorschlag den ich online gefunden hatte um ein Unterformular auszufüllen. Das Unterformular bezieht sich in diesem Fall auf eine Tabelle die "Eigenschaften Datensätze" für die einzelnen Artikel enthält, und manchmal eben mehr als nur einen Datensatz.

In dem Formular wo der Code durch ein Click-Event ausgeführt wird, werden die Eigenschaften wie erwartet alle übernommen, so dass das Unterformular dann mit einem oder mehreren solcher Datensätze gefüllt ist. In dem neuen Formular wo das ganze mit einem AfterUpdate-Event ausgelöst wird, funktioniert es aber nur für den ersten Datensatz. Sobald das "If" am Anfang betreten wird, erhalte ich einen Laufzeitfehler mit der Info, dass der Fokus nicht auf das Unterformular verschoben werden kann.

Wenn ich den Befehl zum setzen des Fokus aber entferne, meldet Access, dass der darauf folgende Befehl nicht ausgeführt werden kann. Das ist soweit zu erwarten da das Hauptformular im Eingabemodus ist und somit ja nicht zwischen Datensätzen wechseln kann.

Beide Hauptformulare sind Eingabeformulare mit dem selben Unterformular und einem identischen Code, lediglich ein paar Variablen sind anders benannt aber funktional identisch.

Ich habe auch einmal versucht statt ".SetFokus" "DoCmd.GoToCommand.ufrmEigenschaften" zu verwenden, allerdings ohne Änderung am verhalten.
Ein Versuch war auch per Abgleich mit "Me.ActiveControl" zu prüfen ob der Fokus schon richtig gesetzt ist, das hat aber ergeben, dass das Unterformular scheinbar nicht fokussiert ist aber trotzdem der Fokus nicht gesetzt werden kann.

Woran genau kann es liegen wenn Access den Fokus nicht setzen kann bzw. wie finde ich den genauen Grund heraus um ihn beheben zu können?

Vielen Dank im Voraus für eure Antworten!

Viele Grüße
Kevin

DF6GL

Hallo,


was willst Du mit dem ganzen Konstrukt überhaupt erreichen?

Zeige immer den kompletten Code und wo läuft der Code ab (HF oder UF)?

An welche Tabelle(n) sind die Formulare gebunden, wenn überhaupt?

Zeige den Screenshot des Beziehungsfensters.

Eisman333

Zitat von: DF6GL am Februar 07, 2022, 15:58:22was willst Du mit dem ganzen Konstrukt überhaupt erreichen?
In diesem speziellen Fall geht es um Artikel mit mehreren Variationen. In unserem Fall hat dabei ein "Vater"-Artikel mehrere "Kind"-Artikel wobei die Eigenschaften für gewöhnlich entweder identisch sind, oder nur leicht abweichen. Deshalb sollen diese vom Vater übernommen werden um nicht extra manuell nochmal hinterlegt zu werden. Das Formular in diesem Fall ist dafür gedacht, um neue Kinder, also Variationen, einem bereits bestehenden Vaterartikel hinzuzufügen.

Zitat von: DF6GL am Februar 07, 2022, 15:58:22Zeige immer den kompletten Code und wo läuft der Code ab (HF oder UF)?
Im HF gibt es ein Kombi-Feld mit dem der Vaterartikel ausgewählt wird, in diesem ist der Code im AfterUpdate-Event hinterlegt. Es sollte nach Auswahl des Artikels alles relevante erst einmal übernommen werden damit die nötigen Details dann nur noch angepasst werden müssen.
Folgend de vollständige Code:

Private Sub lngVater_AfterUpdate()
'Nach Auswahl des Vaters übernimm alle relevanten Daten und entsperre die Eingabefelder

    Dim eanNotwendig As Boolean
    Dim herstellerNr As String
    Dim artikelNr As String
    Dim herstellerId As Long
    Dim identifikatorId As Long
    Dim eigenschaften As DAO.Recordset
    Dim strSQL As String 'Der SQL Befehl um die gewünschten Datensätze abzurufen
    Dim intI As Integer 'Eine Zählervariable um durch das Recordset zu iterrieren
    Dim vater As Long

    vater = Me.lngVater
       
    'Prüfe ob ein Vater ausgewählt ist
    If Me.lngVater = 0 Or Me.lngVater = Empty Or IsNull(Me.lngVater) Or Len(Me.lngVater) < 1 Then
        MsgBox ("Bitte einen gültigen Vaterartikel auswählen.")
        Exit Sub
    End If
   
    'Beziehe Daten von Vater
    eanNotwendig = DLookup("[blnEanOverride]", "tblArtikel", "[IDArtikel] = " & vater)
    herstellerNr = DLookup("[txtHerstellerNr]", "tblArtikel", "[IDArtikel] = " & vater)
    artikelNr = DLookup("[txtArtikelNr]", "tblArtikel", "[IDArtikel] = " & vater)
    herstellerId = DLookup("[lngHersteller]", "tblArtikel", "[IDArtikel] = " & vater)
    identifikatorId = DLookup("[lngIdentifikator]", "tblArtikel", "[IDArtikel] = " & vater)
       
    'Aktiviere Kontrollkästchen "Ist Kind"
    Me.blnIstKind = True

    'Eingabefelder entsperren
    Me.blnEanOverride.Locked = False
    Me.txtHerstellerNr.Locked = False
    Me.EAN.Locked = False
    Me.lngHersteller.Locked = False
    Me.lngIdentifikator.Locked = False
    Me.txtArtikelNr.Locked = False
   
    'Setze Werte ein
    Me.blnEanOverride = eanNotwendig
    Me.txtHerstellerNr = herstellerNr
    Me.lngHersteller = herstellerId
    Me.lngIdentifikator = identifikatorId
    Me.txtArtikelNr = artikelNr

    'Setze Eigenschaften
    strSQL = "SELECT * FROM tblEigenschaften WHERE lngArtikel = " & Me.lngVater
    Set eigenschaften = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)

    If eigenschaften.EOF Then
        MsgBox ("Dieser Vaterartikel hat keine Eigenschaften.")
        Exit Sub
    End If

    intI = 1
    With eigenschaften
        Do Until .EOF
            .Edit
            If intI > 1 Then
                Me.ufrmEigenschaften.SetFocus
                DoCmd.GoToRecord , , acNext
                Me.Form.SetFocus
            End If

            Me.ufrmEigenschaften!lngLegierung = ![lngLegierung]
            Me.ufrmEigenschaften!txtMaterial = ![txtMaterial]
            Me.ufrmEigenschaften!txtPlattierung = ![txtPlattierung]
            Me.ufrmEigenschaften!txtFarbe = ![txtFarbe]
            Me.ufrmEigenschaften!lngGröße = ![lngGröße]
            Me.ufrmEigenschaften!txtLänge = ![txtLänge]
            Me.ufrmEigenschaften!txtZusätzlich = ![txtZusätzlich]
            Me.ufrmEigenschaften!txtPerlen = ![txtPerlen]
            Me.ufrmEigenschaften!txtSteine = ![txtSteine]

            .Update
            .MoveNext
            intI = intI + 1
        Loop
    End With
   
    eigenschaften.Close
    Set eigenschaften = Nothing

End Sub

Zitat von: DF6GL am Februar 07, 2022, 15:58:22An welche Tabelle(n) sind die Formulare gebunden, wenn überhaupt?
Das HF ist an die Tabelle tblArtikel gebunden, während das UF an tblEigenschaften gebunden ist.

Zitat von: DF6GL am Februar 07, 2022, 15:58:22Zeige den Screenshot des Beziehungsfensters.
Anbei der Screenshot.

In einem anderen Formular ist wie erwähnt genau der selbe Aufbau, der einzige Unterschied abgesehen von leicht abweichender Namensgebund ist dabei, dass der Code in dem Click-Ebent eines Button hinterlegt ist. Es handelt sich bei dem ganzen um ein allgemeines Formular das mehrere verschiedene Funktionen abdeckt und hauptsächlich zum testen angelegt wurde. Nun bin ich gerade dabei für die jeweiligen Funktionsgruppen (so nenn ich das jetzt einfach mal) jeweils ein eigenes Formular anzulegen um zu vermeiden, das die Benutzer später versehentlich etwas anpassen oder verändern das gar nicht gewollt war (einer der Hauptgründe wieso ich mich entschieden habe unsere bisherige Excel Tabelle in eine Datenbank umzufunktionieren um die leider häufigen, versehentlichen, Fehler zu vermeiden).

DF6GL

Hallo,


ZitatIm HF gibt es ein Kombi-Feld mit dem der Vaterartikel ausgewählt wird, in diesem ist der Code im AfterUpdate-Event hinterlegt. Es sollte nach Auswahl des Artikels alles relevante erst einmal übernommen werden damit die nötigen Details dann nur noch angepasst werden müssen.

Nimm statt des ausgedehnten Codes eine Anfügeabfrage, die die Eigenschafts-Daten des Vaters und die ID des Kindes in tblEigenschaften (bei der Auswahl des Vaters)  anfügt.
Als Formularkonstruktion ist denkbar, ein HFO1 mit Datenherkunft tblArtikel und einem UFO1 mit Datenherkunft tblEigenschaften zu entwickeln.


Dieses HFO1 wird zu einem HFO2 kopiert und wird als zweites UFO  in HFO1 platziert.

Nach Ausführen der Anfrage ist evtl. ein Requery der UFOs erforderlich.


Danach ist die Pflege der Eigenschaften der Kindartikel möglich.


Btw:   die Tabelle tblFortlaufendeNum...   ist überflüssig. Das Feld lngFortlaufendeNummer kann gleich in tblHersteller mit aufgenommen werden, welche Bedeutung ein solches Feld auch haben mag.



Eisman333

Zitat von: DF6GL am Februar 08, 2022, 20:37:28Nimm statt des ausgedehnten Codes eine Anfügeabfrage, die die Eigenschafts-Daten des Vaters und die ID des Kindes in tblEigenschaften (bei der Auswahl des Vaters)  anfügt.
Als Formularkonstruktion ist denkbar, ein HFO1 mit Datenherkunft tblArtikel und einem UFO1 mit Datenherkunft tblEigenschaften zu entwickeln.


Dieses HFO1 wird zu einem HFO2 kopiert und wird als zweites UFO  in HFO1 platziert.
Vielen Dank für die ausführliche Hilfe, allerdings bin ich mir unsicher wie ich das ganze umsetzen kann. Es gibt ja verschiedene Arten bei Abfragen, in dem Fall sollte es ja eine Anfügeabfrage sein, die dann einfach direkt in tblEigenschaften anfügt?
Neben den Eigenschaften werden aber auch einige Daten aus tblArtikel vom Vater auf das Kind übernommen (z.B. txtHerstellerNr), einige davon sind Pflichtfelder und manche sind nur bei bestimmten Kombinationen (Hersteller, Identifikator) Pflichtfelder.
Da eine Anfügeabfrage aber anscheinend nur an eine Tabelle anfügen kann, müsste ich vermutlich trotzdem noch per VBA oder zweite Anfügeabfrage erst die "regulären" Daten die nicht in tblEigenschaften stehen einfügen, oder? Kann ich die Anfügeabfrage für tblEigenschaften per VBA überhaupt einleiten?

Zitat von: DF6GL am Februar 08, 2022, 20:37:28Btw:  die Tabelle tblFortlaufendeNum...  ist überflüssig. Das Feld lngFortlaufendeNummer kann gleich in tblHersteller mit aufgenommen werden, welche Bedeutung ein solches Feld auch haben mag.
Da hast du natürlich recht, im derzeitigen Umfang ist die Tabelle überflüssig und ich werde die Nummern noch in tblHersteller integrieren. Ursprünglich war geplant das mehr als eine fortlaufende Nummer pro Hersteller existiert aufgrund eines Denkfehlers meinerseits bei der Planung, daher wurde das ganze zu einer eigenen Tabelle.