Neuigkeiten:

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

Mobiles Hauptmenü

Laufzeitfehler 3134 INSERT TO

Begonnen von beck11, April 06, 2016, 23:56:49

⏪ vorheriges - nächstes ⏩

beck11

Hallo Jungs,

ich habe eine Frage zum Laufzeitfehler 3134 :

ich habe den folgenden Code hinter dem Button : Add gepackt und es funktioniert einwandfrei :

If IsNull(txtID) Then
    MsgBox "Bitte geben Sie die Daten ein!", , "Daten eingeben"
        Cancel = True
        Me.txtID.SetFocus
    Exit Sub
End If

If Me.txtID.Tag & "" = "" Then

CurrentDb.Execute "INSERT INTO tblMitarbeiter(mit_ID, mit_Name, mit_Vorname, mit_Beruf) " & _
                    "VALUES (" & Me.txtID & ", '" & Me.txtName & "', '" & Me.txtVorname & "', ' " & Me.txtBeruf & " ')"
Else

CurrentDb.Execute "UPDATE tblMitarbeiter " & _
                    "SET mit_ID = " & Me.txtID & _
                    ", mit_Name = '" & Me.txtName & "'" & _
                    ", mit_Vorname = '" & Me.txtVorname & "' " & _
                    ", mit_Beruf   = '" & Me.txtBeruf & "'" & _
                    "WHERE mit_ID = " & Me.txtID.Tag
End If

cmdClear_Click

subMitarbeiter_frm.Form.Requery


Mein Problem:

Wenn ich den neuen Datensatz eingefügt habe, dann landet Kursor wieder zum ersten Feld (wo ich anfange die Daten einzugeben) : Me.txtID.SetFocus. Und es ist richtig so. Wenn ich aber nichts eingebe, und dann den Button : Add betätige, dann erscheint die Fehlermeldung: Laufzeitfehler 3134

Wie kann ich abfangen, wenn man nichts eingibt, dass man wieder zum ersten Feld per Methode : SetFocus landet, ohne die Fehlermeldung 3134 zu verursachen.

Vielen Dank
Beck

MzKlMu

Hallo,
bitte zeige die Prozeduren vollständig, mit Kopf und Fuß.
Damit man weiß, welche Ereignisse verwendet wurden.

ZitatHallo Jungs,
damit wäre ich vorsichtig, hier treten auch kompetente Frauen in Erscheinung.   ;D
Gruß Klaus

DF6GL

Hallo,

welche Bedeutung hat die Marke (Tag) beim Feld "txtID" ?

Ansonsten solltest du latente Fehler in der SQL-Syntax (-->Fehlermeldung!)   vermeiden

If Me!txtID.Tag & "" = "" Then    '  ??

CurrentDb.Execute "INSERT INTO tblMitarbeiter(mit_ID, mit_Name, mit_Vorname, mit_Beruf) " & _
                    "VALUES (" & nz(Me!txtID,0) & ", '" & Me!txtName & "', '" & Me!txtVorname & "', '" & Me!txtBeruf & "')", dbFailOnError

Else

CurrentDb.Execute "UPDATE tblMitarbeiter " & _
                    SET mit_ID = " & nz(Me!txtID,0) & _   '  ??
                    "  , mit_Name = '" & Me!txtName & "'" & _
                    "  , mit_Vorname = '" & Me.txtVorname & "'" & _
                    "  , mit_Beruf   = '" & Me!txtBeruf & "'" & _
                    "  WHERE mit_ID = " & Clng(Me!txtID.Tag) , dbFailOnError   ' ??
End If
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

MaggieMay

Hallo,

stelle fest, woran der Insert scheitert und behebe den Fehler, damit du die Kontrolle über den Ablauf behältst.

Und wie sieht es mit der Fehlerbehandlung in der Prozedur aus?!
Freundliche Grüße
MaggieMay

beck11

#4
Hallo Mädels und Jungs  :),

Vielen Dank für Euren Feedback:

Mein Prozedur sieht folgenden Maßen aus:

Private Sub cmdAdd_Click()
If IsNull(txtID) Then
    MsgBox "Bitte geben Sie die Daten ein!", , "Daten eingeben"
        Cancel = True
        Me.txtID.SetFocus
    Exit Sub
End If
If Me.txtID.Tag & "" = "" Then
CurrentDb.Execute "INSERT INTO tblMitarbeiter(mit_ID, mit_Name, mit_Vorname, mit_Beruf) " & _
                    "VALUES (" & Me.txtID & ", '" & Me.txtName & "', '" & Me.txtVorname & "', ' " & Me.txtBeruf & " ')"
Else
CurrentDb.Execute "UPDATE tblMitarbeiter " & _
                    "SET mit_ID = " & Me.txtID & _
                    ", mit_Name = '" & Me.txtName & "'" & _
                    ", mit_Vorname = '" & Me.txtVorname & "' " & _
                    ", mit_Beruf   = '" & Me.txtBeruf & "'" & _
                    "WHERE mit_ID = " & Me.txtID.Tag
End If
cmdClear_Click
subMitarbeiter_frm.Form.Requery
End Sub

Private Sub cmdClear_Click()
    Me.txtID = ""
    Me.txtName = ""
    Me.txtVorname = ""
    Me.txtBeruf = ""
    'Focus auf ID
    Me.txtID.SetFocus
    Me.cmdAdd.Caption = "Add"
    Me.cmdEdit.Enabled = True
    Me.txtID.Tag = ""
End Sub


Private Sub cmdClose_Click()
    DoCmd.Close
End Sub

Private Sub cmdDelete_Click()
    If Not (Me.subMitarbeiter_frm.Form.Recordset.EOF And Me.subMitarbeiter_frm.Form.Recordset.BOF) Then
        If MsgBox("Sind Sie Sicher?", vbYesNo) = vbYes Then
            CurrentDb.Execute "DELETE FROM tblMitarbeiter " & _
                "WHERE mit_ID = " & Me.subMitarbeiter_frm.Form.Recordset.Fields("mit_ID")
            Me.subMitarbeiter_frm.Form.Requery
        End If
    End If
End Sub

Private Sub cmdEdit_Click()
If Not (Me.subMitarbeiter_frm.Form.Recordset.EOF And Me.subMitarbeiter_frm.Form.Recordset.BOF) Then
        With Me.subMitarbeiter_frm.Form.Recordset
            Me.txtID = .Fields("mit_ID")
            Me.txtName = .Fields("mit_Name")
            Me.txtVorname = .Fields("mit_Vorname")
            Me.txtBeruf = .Fields("mit_Beruf")
            Me.txtID.Tag = .Fields("mit_ID")
            Me.cmdAdd.Caption = "Update"
            Me.cmdEdit.Enabled = False
        End With
End If
End Sub

Falls Ihr Ideen habt, bin ich Ihnen sehr dankbar

Vielen Dank
Beck

MzKlMu

Hallo,
bitte verwende für derartige Codedarstellungen immer die Codetags.
Dann wird das übersichtlicher.
Hat oben jemand für Dich gemacht.

Was willst Du mit dem Cancel = True, das ist hier sinnlos, es gibt keinen Cancelparameter in der Prozedur.


Warum verwendest Du nicht einfach ein gebundenes Formular, dann wird das Meiste des Codes ersatzlos überflüssig.

Plausibilitätsprüfungen macht man dann im Formularereignis "Vor Aktualisierung"
und kann nur dann mit Cancel = True das Speichern unvollständiger Datensätze zuverlässig verhindern.
Man hat nach dem Speichern auch automatisch sofort wieder einen leeren Datensatz.
Speichern und Löschen eines Datensatzes sind dann jeweils Einzeiler.
Zum Editieren braucht es keinen Code.
Gruß Klaus

MaggieMay

Hallo,
Zitatstelle fest, woran der Insert scheitert und behebe den Fehler, damit du die Kontrolle über den Ablauf behältst.
damit meinte ich, dass du den Code (notfalls im Unterbrechungsmodus) testen solltest um festzustellen wo der Fehler herkommt.
Das macht nämlich nur in Verbindung mit den Daten Sinn.

Und was das betrifft:
ZitatUnd wie sieht es mit der Fehlerbehandlung in der Prozedur aus?!
Das war ein Wink mit dem Zaunpfahl, soll also heißen: füge in jede Prozedur eine Fehlerbehandlung ein.
Freundliche Grüße
MaggieMay

beck11

Vielen Dank für euren Feedback,

ich werde es ausprobieren, falls ich immer noch das Problem nicht löse, werde mich dann noch mal melden.

Vielen Dank
Beck

MzKlMu

Hallo,
leider bist Du mit keinem Wort auf meine Hinweise in Antwort #5 eingegangen.

Auch in diesem Thema denke ich, dass Du Sachen programmierst, die Access serienmäßig einfacher und besser kann.
Gruß Klaus

beck11

Hallo Klaus,

Doch deine Hinweise sind für mich sehr wichtig, ich probiere grade alles im gebundenen Formular zu machen. Mir fehlt einfach die Erfahrung solche Probleme sofort zu lösen.
Trotzdem Vielen Dank für deinen Feedback

Beck