Neuigkeiten:

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

Mobiles Hauptmenü

Wert aus 2. Formular wird nicht in kombinationsfeld des 1. formulars übernommen

Begonnen von Atuatuca, Juni 26, 2019, 22:21:19

⏪ vorheriges - nächstes ⏩

Atuatuca

Hallo Access-O-Maniacs,

ich habe ein "kleines" Problem, bei dem ich nicht weiter komme.

Ich habe ein Formular (frm_BA) mit Daten aus einer Tabelle (tab_BA). In dieses Formular gibt es ein Kombinationsfeld (cbo_MA), welches Namen aus der Tabelle "tab_MA" enthält. Beim Ereignis "Bei Nicht in Liste" habe ich folgende Ereignisprozedur eingeben


Private Sub cbo_MA_NotInList(NewData As String, Response As Integer)
    DoCmd.SetWarnings False
        If MsgBox("'" & NewData & "' ist nicht in der Liste. Möchten Sie '" & NewData & "' als neuer NAme anlegen?", vbYesNo) = vbYes Then
            Response = acDataErrContinue
            DoCmd.OpenForm "frm_MA"
            DoCmd.GoToRecord , , acNewRec
            Forms!frm_MA!txtf_NamePruefer = NewData
 
        Else  'z.B. bei Tippfehler
            Response = acDataErrContinue
            Me!cbo_MA.Undo
        End If
    DoCmd.SetWarnings True
End Sub


Es wird das Formular frm_MA geöffnet um weitere Daten zu ergänzen. Im Formular frm_MA gibt es eine  Schaltfläche btn_SaveClose mit folgenden Code


Private Sub btn_SaveClose_Click()

    DoCmd.Close acForm, "frm_MA", acSaveYes
    Forms!frm_BA!cbo_MA.Requery
   
End Sub


Und jetzt kommt die Fehlermeldung "Laufzeitfehler '2118': Sie müssen das aktuelle Feld speichern, bevor Sie die AktualisierenDaten-Aktion ausführen können."

Die Daten wurden zwar in der Tabelle tab_MA übernommen, sind aber nicht in das ausgangs-Kombinationsfeld zu sehen. Es gibt nur o.g. Fehlermeldung. Wenn ich alles schliesse und dann wieder öffne, ist alles da.

Wer kann mir da helfen.

Vielen Dank im Voraus.

MfG
Atuatuca

DF6GL

Hallo,


versuch es so:



Private Sub cbo_MA_NotInList(NewData As String, Response As Integer)

        If MsgBox("'" & NewData & "' ist nicht in der Liste. Möchten Sie '" & NewData & "' als neuer Name anlegen?", vbYesNo) = vbYes Then
            Response = acDataErrAdded
            DoCmd.OpenForm "frm_MA", , , , acFormAdd, acDialog, NewData

        Else  'z.B. bei Tippfehler
            Response = acDataErrContinue
            Me!cbo_MA.Undo
        End If

End Sub



' und im Form frm_MA:

Sub Form_Load()
  If Not IsNull(Me.Openargs) Then Me!txtf_NamePruefer.DefaultValue = Me.Openargs
End Sub


Es ist zu vermuten, dass hier keine Primär- oder Fremdschlüssel in Verwendung sind, was dringend empfohlen wird.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Beaker s.a.

Hallo Atuatuca,
Wie du das MA-Formular besser öffnest hat Franz dir gezeigt.
IMO löst das aber nicht das geschilderte Problem.
Ergänze den Code des Buttons
Private Sub btn_SaveClose_Click()

    Me.Dirty = False
'speichert explizit
    DoCmd.Close acForm, "frm_MA"
', acSaveYes - kannst du vergessen, macht nur Sinn wenn das Form zur
                     'Laufzeit im Entwurfsmodus geöffnet wird
    Forms!frm_BA!cbo_MA.Requery
   
End Sub


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)

DF6GL

Hallo,

das "frm_MA"  wird als Dialog geöffnet und kann nur durch Verlassen" beendet werden, so dass der Code weiterlaufen kann.

Die Zuweisung an den Defaultwert lässt einen Abbruch zu, wenn doch kein neuer Eintrag gemacht werden soll.
Beim Verlassen des Forms wird der neue DS gespeichert, wenn Eingaben erfolgt sind und mit acDataErrAdded das Kombifeld aktualisiert.

Den zusätzlichen Code braucht es nicht...
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Atuatuca

Hallo Ekkehard und Franz,

erst einmal vielen Dank für die Antworten und Hilfestellungen.

Mein Problemchen ist fast gelöst mit u.g. codes.

In Frm_BA im cbo_MA, beim Ereignis nicht in Liste:

Private Sub cbo_MA_NotInList(NewData As String, Response As Integer)
    DoCmd.SetWarnings False
        If MsgBox("'" & NewData & "' ist nicht in der Liste. Möchten Sie '" & NewData & "' als neuer Name anlegen?", vbYesNo) = vbYes Then
            Response = acDataErrAdded
            DoCmd.OpenForm "frm_MA", , , , acFormAdd, acDialog, NewData

        Else  'z.B. bei Tippfehler
            Response = acDataErrContinue
            Me!cbo_MA.Undo
        End If
    DoCmd.SetWarnings True
End Sub


und in frm_MA beim btn_SaveClose beim Ereignis beim Klicken mit folgenden Code:

Private Sub btn_SaveClose_Click()

    DoCmd.Close acForm, "frm_MA"
   
End Sub


Beim öffnen des frm_MA übernimmt den o.g. code nicht den Name, welcher mann im frm_BA in der cbo_MA eingegeben hat, sondern #Name?

Nach den Eingaben in frm_MA wird der Name in der cbo_MA sofort gelistet und auch aufgerufen.

In der tab_BA, werden nur die Fremdschlüsseln (ID's = Autowert)  der anderen verbunden Tabellen gespeichert.

DF6GL

Hallo,

Deine Tabellen- und Formalarstruktur ist ja unbekannt. 

ZitatSub Form_Load()
  If Not IsNull(Me.Openargs) Then Me!txtf_NamePruefer.DefaultValue = Me.Openargs
End Sub

Setze einen Haltepubkt an die "If Not.. " Stelle  und prüfe den Inhalt von Me.Openargs
Gibt es ein Textfeld mit Namen "txtf_NamePruefer"  im Formular?
Kann in dieses Textfeld der Wert von Openargs sinnvoll eingetragen werden?


Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Atuatuca

Hallo Franz,

ja, in frm_MA gibt es ein Textfeld namens txtf_NamePruefer.
Habe mal meine Tabellenstruktur, frm_BA und frm_MA als Bild angehängt.

Setze einen Haltepubkt an die "If Not.. " Stelle  und prüfe den Inhalt von Me.Openargs

Wie mache ich das ?

Gruss
Rudi


DF6GL

Hallo,

im VBE gibt es neben den links Codezeilen einen gräulichen Bereich. Dort bei einer Codezeile klicken erzeugt einen braunen Punkt --> Haltepunkt.

Entspr. dem Beziehungsfenster heißt das zugehörige Tabellenfeld "NamePrüfer".  Nichtsdestotrotz muss aber nicht ein Prüfername, sondern die ID des MA (MA_ID  ---> Newdata) übergeben werden.  Dazu ist auch das Kombifeld passend aufzubauen.

Select MA_ID,Nameprüfer from tab_MA
Spaltenanzahl: 2
Spaltenbreiten: 0cm;4cm

Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Atuatuca


Atuatuca

Hallo Franz,

in frm_MA, Ereignis Form_Load sagt


Sub Form_Load()
  If Not IsNull(Me.OpenArgs) Then Me!txtf_NamePruefer.DefaultValue = Me.OpenArgs
End Sub


wenn ich auf Me.OpenArgs gehe: Me.OpenArgs = "Otto" (das ist der Name den ich im cbo_MA im frm_BA eingegeben haben.

Atuatuca

Hallo Franz,

Bei Datensatzherkunft frm_BA, cbo_MA steht:

SELECT tab_MA.ID_MA, tab_MA.NamePruefer, tab_MA.FS_Abteilung, tab_MA.Aktiv
FROM tab_MA
WHERE (((tab_MA.FS_Abteilung)=7 Or (tab_MA.FS_Abteilung)=8) AND ((tab_MA.Aktiv)=True))
ORDER BY tab_MA.NamePruefer;


Gruss
Rudi

DF6GL

Hallo,

die Beispieldatei zeigt nicht das Problem....


Es wird eine neue Abteilung mittels Insert-SQL eingefügt und nicht über ein Formular.

Dies funktioniert auch korrekt. Einige Codezeilen sind überflüssig:

ZitatPrivate Sub cbo_Abteilung_NotInList(NewData As String, Response As Integer)
  Dim lngID_Art As Long
    Dim db As DAO.Database
    Set db = CurrentDb
    Dim strMeldung As String
   Dim bolAnlegen As Boolean
   
    strMeldung = "'" & NewData & "' als neue Abteilung anlegen ?"
    If MsgBox(strMeldung, vbYesNo + vbQuestion, " Bitte bestätigen.") = vbYes  Then
         
     db.Execute "INSERT INTO tab_Abteilung (Abteilung) VALUES('" & NewData & "')", dbFailOnError
     Response = acDataErrAdded
    End If

    'lngID = db.OpenRecordset("SELECT @@IDENTITY").Fields(0)
     'Me!cbo_Abteilung.Undo
     'Me!cbo_Abteilung.Requery
     'Me!cbo_Abteilung = lngArt

     Set db = Nothing
End Sub


Einige Verweise sind überflüssig/falsch. Weiteren Code habe ich nicht analysiert.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Atuatuca

Hallo Franz,

es geht nicht um die cbo_Abteilung in frm_MA, sondern um die Übergabe des Wertes aus frm_BA in cbo_MA an das frm_MA in txtf_MA.

Gruss
Rudi

DF6GL

Hallo,

ok..

Weil es sich bei der Übergabe mit Openargs um einen Text handelt, muss die Zuweisung an den Defaultwert so lauten:

ZitatSub Form_Load()
  If Not IsNull(Me.OpenArgs) Then Me!NamePruefer.DefaultValue = """" & Me.OpenArgs & """"
End Sub


Zudem muss die Abfrage für das Kombi nur passsende Kriterien enthalten, die einen eingetragenen neuen MA auch filtern kann.
("Abteilung = 7 oder 8" schlägt fehl, wenn der neue MA nicht zu diesen Abteilungen gehört.)
Oder es muss die ID der zugelassenen Abteilungen schon bei der Erfassung fest mit vorgegeben werden.


SELECT tab_MA.ID_MA, tab_MA.NamePruefer, tab_MA.FS_Abteilung, tab_MA.Aktiv
FROM tab_MA;



PS: habe den Steuerelementnamen des Textfeldes, das an das Tabellenfeld "NamePruefer" gebunden ist. gleichlautend benannt.  Entgegen anderweitiger Meinungen/Vorschläge benenne ich gebundene Steuerelemente durchweg genau so wie das entspr. Tabellenfeld.  Das erspart mir dauerndes Nachsehen, Nachdenken und Kontrolle im Falle von unterschiedlicher Benamsung. Steuerelemente , die ungebunden sind, erhalten einen passenden Prefix ("txt" bei einem Textfeld) als Kennzeichung dieser Situation.


Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Atuatuca

Hallo Franz,

Jetzt funktioniert es so wie ich es wollte, bis auf die "Kleinigkeit", dass der Anwender eine andere Abteilung als 7 oder 8 wählen könnte.

vielen Dank für den Hinweis "Oder es muss die ID der zugelassenen Abteilungen schon bei der Erfassung fest mit vorgegeben werden."

Wie geht das ?

Gruss
Rudi.

PS. gleiches natürlich auch für das cbo_QM_MA in frm_BA.