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