Neuigkeiten:

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

Mobiles Hauptmenü

Laufzeitfehler 2118 beim Schließen des PopUp Formulars

Begonnen von KonradR, April 30, 2023, 09:01:34

⏪ vorheriges - nächstes ⏩

KonradR

Hallo liebe Accessfreunde,

ich habe ein Unterformular(2), das seine Daten aus einem vorangestellten Unterformular(1) bezieht. Beide sind als Endlosformular ausgeführt. Wenn ich nun in einem Kombinationsfeld des Unterformulars(2) eine Eingabe mache, die nicht in der Liste im Kombi enthalten ist, dann öffnet sich ein PopUp-Formular. Wenn ich das PopUp Formular schließen will, gibt es die Fehlermeldung "Laufzeitfehler 2118". Hier ein Bild von der Fehlermeldung:
Sie dürfen in diesem Board keine Dateianhänge sehen.

Der Code stoppt dann an folgender Stelle (Code des PopUp-Formulars):
Sie dürfen in diesem Board keine Dateianhänge sehen.

Und hier mein Code zum Kombinationsfeld im Unterformular(2):

Private Sub cboeinkaZutatIDRef_Change()

    SucheZutatPerAnschlag Nz(cboeinkaZutatIDRef.Text, "")
 
'Wenn keine Übereinstimmung in der Liste des Kombis, dann Formular öffnen um neuen Datensatz hinzuzufügen 
    If Me.cboeinkaZutatIDRef.ListCount = 0 Then
        DoCmd.OpenForm "frm04BWTZutaten_Unter"
    End If
   
    cboeinkaZutatIDRef.Dropdown
End Sub


Private Sub cmdNeueZutat_Click()
    DoCmd.OpenForm "frm04BWTZutaten_Unter"
End Sub

'Filter wieder entfernen, damit in den anderen Kombinationsfeldern im Formular die urspr. Auswahl sichtbar bleibt
Private Sub Form_Current()
    Dim strSQL2 As String

    strSQL2 = "SELECT ZutatID, ZutatName FROM qryZutatenSortiert"
    strSQL2 = strSQL2 & " ORDER BY ZutatName"

    Me.cboeinkaZutatIDRef.RowSource = strSQL2
End Sub

'Listeneintrag im Kombinationsfeld nach den eingegebenen Buchstaben filtern
Private Sub SucheZutatPerAnschlag(strZutatname As String)
    Dim strSQL As String

    strSQL = "SELECT ZutatID, ZutatName FROM qryZutatenSortiert WHERE ZutatName LIKE '*" & strZutatname & "*' "
    strSQL = strSQL & " ORDER BY ZutatName"

    Me.cboeinkaZutatIDRef.RowSource = strSQL
End Sub

Wie kann ich erreichen, dass das PopUp-Formular geschlossen, die Daten gespeichert und die Liste vom Kombinationsfeld aktualisiert wird ohne, dass die Fehlermeldung auftritt?
Schon im Voraus vielen Dank.

Beaker s.a.

Hallo,

Aus dem Bauch; - vermutlich ist das aufrufende UFo "Dirty". Versuche
vor dem Aufruf des Popup die Zeile
Me.Dirty = False
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

KonradR

Hallo  Beaker s.a.,

Zitat von: Beaker s.a. am April 30, 2023, 10:32:58Versuche
vor dem Aufruf des Popup die Zeile
Code [Auswählen] Erweitern
Me.Dirty = False

Ich habe deinen Codevorschlag vor dem Aufruf des Formulars eingefügt. Jetzt kommt die Fehlermeldung 2237.
Hier mit Bild:

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

Beaker s.a.

O.K., dann lösch die Zeile wieder und verlagere den Code in die
Ereignisprozedur
Private Sub cboeinkaZutatIDRef_NotInList(NewData As String, Response As Integer)
Btw. Code als Bild zu zeigen ist schlecht, da kann man nichts
kopieren; - verwende die Codetags (oben in der Leiste links neben
dem Sprechblasen-Icon).
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

KonradR

Hallo    Beaker s.a.,

Zitat von: Beaker s.a. am April 30, 2023, 12:24:33O.K., dann lösch die Zeile wieder und verlagere den Code in die
Ereignisprozedur
Code [Auswählen] Erweitern
Private Sub cboeinkaZutatIDRef_NotInList(NewData As String, Response As Integer)

Das habe ich gemacht. Bei mir sieht es jetzt so aus:

Private Sub cboeinkaZutatIDRef_NotInList(NewData As String, Response As Integer)
    Me.Dirty = False
    DoCmd.OpenForm "frm04BWTZutaten_Unter"
End Sub

Allerdings erscheint jetzt der Lauftzeitfehler 2473 "Nicht genügend Stapelspeicher" und die Access interne Meldung: "Der von Ihnen eingegebene Text ist kein Element der Liste."

Zitat von: Beaker s.a. am April 30, 2023, 12:24:33Btw. Code als Bild zu zeigen ist schlecht, da kann man nichts
kopieren; - verwende die Codetags (oben in der Leiste links neben
dem Sprechblasen-Icon).

Danke für den Hinweis. Da weis ich jetzt Bescheid und gebe den Code immer über die Codetags ein. Ich hatte ein Bildschirmfoto gemacht um deutlich zu machen, wo der Kompilierer stopt um das Fehlerfinden einfacher zu gestalten.

markusxy

Hallo,
da die Zuordnung der RowSource scheinbar kein Problem ist,
könntest du statt dem Requery aus dem Formular frm04BWTZutaten_Unter heraus einfach die RowSource erneut setzen und dadurch die Daten aktualisieren.

Für das gesamte Konzept kann ich mich allerdings gar nicht begeistern.


Beaker s.a.

Hallo Konrad,

Bitte sorgfältig lesen
Zitatdann lösch die Zeile wieder ...

Über das Ereignis "NotInList" musst du dich aber auf jeden Fall
schlau machen -> OH.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

KonradR

Hallo Beaker s.a.,

Zitat von: Beaker s.a. am Mai 02, 2023, 18:37:30Über das Ereignis "NotInList" musst du dich aber auf jeden Fall
schlau machen -> OH.

Danke für den Tipp. Das werde ich auf jeden Fall tun. Ich habe es jetzt so gelöst, dass ich das über UNDO aus dem Datensatz gehe und dann das Formular öffne. Allerdings verschwindet der Text, der in den Kombinationsfeldern vorher drin stand, wenn ich das Formular schließe. Wenn ich wieder in die Kombinationsfelder im Unterformular klicke, dann erscheint er wieder. Hast du da eine Idee, woran das liegen könnte? Wenn ich das Formular [frm04BWTZutaten_Unter] über die Schaltfläche öffne, dann sind die Textinhalte nach dem Schließen des Formulars sichtbar. Hier mein Code:

       
Private Sub cboeinkaZutatIDRef_NotInList(NewData As String, Response As Integer)       
    Forms![frm00BWT_Haupt]![sfrmBWTEinkaufsliste_Unter].Form![cboeinkaZutatIDRef].Undo
    DoCmd.OpenForm "frm04BWTZutaten_Unter"
    Me.Dirty = False
    Response = acDataErrContinue   
End Sub

KonradR

Hallo  markusxy,

Zitat von: markusxy am Mai 02, 2023, 10:22:33da die Zuordnung der RowSource scheinbar kein Problem ist,
könntest du statt dem Requery aus dem Formular frm04BWTZutaten_Unter heraus einfach die RowSource erneut setzen und dadurch die Daten aktualisieren.

Das heißt, ich würde für das Unterformular, auf dem das Kombinationsfeld angeordnet ist die RowSource neu setzen und dass ich die Datensatzquelle noch mal neu setzen muss? Als erste Idee fällt mir da das Aufrufen eines Recordsets ein, der sich auf die entsprechende Tabelle aus der Datensatzquelle beruft. Wäre das die Vorgehensweise, die du meinst?

Zitat von: markusxy am Mai 02, 2023, 10:22:33Für das gesamte Konzept kann ich mich allerdings gar nicht begeistern.

Warum nicht? Wie sähe deine optimale Lösung aus?

Beaker s.a.

Hallo Konrad,

Hast du dies schon einmal gelesen?

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

markusxy

Zitat von: KonradR am Mai 03, 2023, 09:52:22Das heißt, ich würde für das Unterformular, auf dem das Kombinationsfeld angeordnet ist die RowSource neu setzen und dass ich die Datensatzquelle noch mal neu setzen muss? Als erste Idee fällt mir da das Aufrufen eines Recordsets ein, der sich auf die entsprechende Tabelle aus der Datensatzquelle beruft.

Du kannst ja testen:
RowSource neu setzen geht wie wir sehen problemlos.
Was auch klappen sollte ist ein Requery auf das Recordset des Controls anstatt auf das Control.

Zitat von: KonradR am Mai 03, 2023, 09:52:22Warum nicht? Wie sähe deine optimale Lösung aus?
Es gibt eine ganze Reihe von Punkten die "Böse" sind.
z.B. im Current Event die RowSource neu setzen. Da wird ja beim jedem Zeilenwechsel das Recordset neu geladen und die Liste im Control neu erstellt. Sprich jede Menge sinnloser Traffic im Netzwerk.
Es würde ja reichen im AfterUpdate Event die RowSource neu setzen.

Aber unabhängig davon verstehe ich nicht worum du die Datenbasis mit like filterst.
Sucht man wirklich nach Teilstrings die irgendwo mitten im Text beginnen?
Das menschliche Hirn ist ja nicht so, dass wenn es Müller sucht das man l eingibt.

Weil wenn man keine Teilstrings sucht, kann man ja auf den gesamten Code verzichten.


KonradR

Hallo

Zitat von: Beaker s.a. am Mai 03, 2023, 11:01:08Hallo Konrad,

Hast du dies schon einmal gelesen?

gruss ekkehard

das funktioniert. Danke für den Link.

KonradR

Hallo markusxy,

Zitat von: markusxy am Mai 04, 2023, 14:59:49Es gibt eine ganze Reihe von Punkten die "Böse" sind.
z.B. im Current Event die RowSource neu setzen. Da wird ja beim jedem Zeilenwechsel das Recordset neu geladen und die Liste im Control neu erstellt. Sprich jede Menge sinnloser Traffic im Netzwerk.
Es würde ja reichen im AfterUpdate Event die RowSource neu setzen.

Danke für den Tip. Das war mir gar nicht bewusst. Dann werde ich das Ganze in das Ereignis "AfterUpdate" einfügen.
Zitat von: markusxy am Mai 04, 2023, 14:59:49
Zitat von: KonradR am Mai 03, 2023, 09:52:22Das heißt, ich würde für das Unterformular, auf dem das Kombinationsfeld angeordnet ist die RowSource neu setzen und dass ich die Datensatzquelle noch mal neu setzen muss? Als erste Idee fällt mir da das Aufrufen eines Recordsets ein, der sich auf die entsprechende Tabelle aus der Datensatzquelle beruft.

Du kannst ja testen:
RowSource neu setzen geht wie wir sehen problemlos.
Was auch klappen sollte ist ein Requery auf das Recordset des Controls anstatt auf das Control.

Zitat von: KonradR am Mai 03, 2023, 09:52:22Warum nicht? Wie sähe deine optimale Lösung aus?
Es gibt eine ganze Reihe von Punkten die "Böse" sind.
z.B. im Current Event die RowSource neu setzen. Da wird ja beim jedem Zeilenwechsel das Recordset neu geladen und die Liste im Control neu erstellt. Sprich jede Menge sinnloser Traffic im Netzwerk.
Es würde ja reichen im AfterUpdate Event die RowSource neu setzen.

Aber unabhängig davon verstehe ich nicht worum du die Datenbasis mit like filterst.
Sucht man wirklich nach Teilstrings die irgendwo mitten im Text beginnen?
Das menschliche Hirn ist ja nicht so, dass wenn es Müller sucht das man l eingibt.

Weil wenn man keine Teilstrings sucht, kann man ja auf den gesamten Code verzichten.




Es geht darum, das wenn ich im Kombinationsfeld eine Eingabe mache, sich die Auswahl im Listenfeld des Kombinationsfeldes auf den eingegebenen Text reduziert. Wenn die Liste verschwindet, weis ich, dass es diesen Eintrag noch nicht gibt und ich füge einen neuen hinzu. So habe ich schon beim Eingeben den vollen Durchblick. Ich finde das sehr nützlich.