Hallo Acces-Gemeinde.
In meiner Access-Anwendung habe ich ein Formular mit 2 Schaltflächen. Die eine ist nur zum Schließen des Formulars und die andere führt (siehe Code) Aktionen aus uns schließt das Formular anschließend. Dies funktioniert auf meinem Hauptrechner soweit einwandfrei.
Auf einem meiner Rechner (mit Runtime-Version 2010) wird das Formular manchmal aber nicht geschlossen. Wenn die besagte Schaltfläche dann nochmal betätigt wird, geht es.
Habe dann mal den Befehl "DoEvents" eingefügt weil ich die vermutete, dass wegen anderer Prozesse der Befehl evtl. überlesen wird. Das Phänomen besteht jedoch immer noch.
Was kann die Ursache sein? Muss der Formularname bei dem DoCmd.Close-Befehl nochmal angegeben werden?
Gruß trebuh
Private Sub Befehl13_Click()
10 On Error GoTo Befehl13_Click_Error
20 DoCmd.SetWarnings False
30 DoCmd.Hourglass True
40 DoCmd.OpenQuery "ObjectAFL-Löschen", acViewNormal, acEdit
50 DoCmd.OpenQuery "CodesAFL-Löschen", acViewNormal, acEdit
60 DoCmd.OpenQuery "Object-Löschen", acViewNormal, acEdit
70 DoCmd.OpenQuery "Codes-Löschen", acViewNormal, acEdit
80 Forms![Hintergrund]![Datum_Rundholz_von] = Forms![Grundlage Export Navi]![Datum_Rundholz_von]
90 Forms![Hintergrund]![Datum_Rundholz_bis] = Forms![Grundlage Export Navi]![Datum_Rundholz_bis]
100 DoCmd.OpenQuery "Anfügen-Codes", acViewNormal, acEdit
110 DoCmd.OpenQuery "Anfügen-Codes-Rundholz", acViewNormal, acEdit
'DoCmd.OpenQuery "Anfügen-Codes-Rundholz-arc", acViewNormal, acEdit
120 DoCmd.OpenQuery "Object anfügen", acViewNormal, acEdit
130 DoCmd.OpenQuery "Object anfügen-Rundholz", acViewNormal, acEdit
'DoCmd.OpenQuery "Object anfügen-Rundholz-arc", acViewNormal, acEdit
140 DoCmd.Hourglass False
150 MsgBox "Daten wurden an übertragen. ", 64, "Hinweis!"
170 DoEvents
180 DoCmd.Close
190 On Error GoTo 0
200 Exit Sub
Befehl13_Click_Error:
210 MsgBox "Error " & Err.Number & " in Zeile " & Erl & " (" & Err.Description & ") in procedure Befehl13_Click of VBA Dokument Form_Grundlage Export Navi"
End Sub
Versuch mal:
DoCmd.Close acForm, "frmFormularName"
Hallo,
Was sind das für Abfragen? Aktionsabfragen? acViewNormal und acEdit kannst du weglassen, sind die Default-Konstanten.
Ich geh mal davon aus dass deine Abfragen noch laufen wenn das Close kommt.
Ich führe das Close innerhalb des Formulars immer so aus: DoCmd.Close acForm, Me.Name
Andreas
Hallo Andreas,
hatte auch schon den Verdacht, dass die Abfragen noch laufen. Müssten diese bei dem DoEvents-Befehl dann nicht abgeschlossen sein?
Dieser müsste doch im Prinzip sagen, "Mach erst weiter, wenn alles andere abgeschlossen ist". Oder verstehe ich da diesen Befehl falsch?
Habe Deinen Vorschlag (so wie auch Nadeshiko vorgeschlagen hat) umgesetzt. Muss nur noch ausprobieren.
Gruß und Danke
Hubert
Und was sind das für Abfragen? Aktionsabfragen denk ich mal.
Hast du mal überlegt was passiert wenn 1 Abfrage in Fehler geht? dann sind alle Abfragen davor bereits gelaufen und haben inkonsistente Daten erzeugt.
Imo ist es zwingend geboten das ganze in einer Transaktion laufen zu lassen. Ich hab dir mal ein Beispiel gemacht:
Sub Ausfuehren()
Dim ws As DAO.Workspace
Dim db As DAO.Database
On Error GoTo Ausfuehren_Error
Set ws = DBEngine.Workspaces(0)
Set db = CurrentDb
ws.BeginTrans
db.Execute "Update...", dbFailOnError
db.Execute "Insert...", dbFailOnError
'...
ws.CommitTrans
Aufraeumen:
ws.Close
Set db = Nothing
Set ws = Nothing
Exit Sub
Ausfuehren_Error:
MsgBox Err.Description
ws.Rollback
Resume Aufraeumen
End Sub
Siehe auch meinen Blogbeitrag:
http://www.accessblog.de/Archive/51
Gruß Andreas
Hi,
geht das einfach so, muss sich die Abfrage dann nicht auf den Workspace beziehen?
Und: Eine Auswahlabfrage ("Select...") ist so nicht ausführbar.
Hallo
warum sollte das nicht gehen? db.Execute läuft innerhalb der Transaktion.
Ja Select läuft natürlich nicht, macht auch keinen Sinn.
/edit es demonstriert aber schön das Rollback ;-)
Andreas
Ich dachte nicht, dass es so einfach ist und war der Meinung man müsste einen extra Workspace dafür anlegen.
Aber Ja, es funktioniert prächtig, nur wäre wohl der Einsatz des Parameters dbFailOnError noch sinnvoll.
Hallo,
brauchst du nicht. Auch bei db.Execute läuft ein Fehler auf z.b. bei Schlüsselverletzung, Typverletzung o.Ä., es wird nur keine Fehlermeldung ausgeworfen was man durch die Form-interne Fehlerbearbeitung auch nicht braucht.
Andreas
Hier irrst du wohl Andreas, Execute wirft ohne dbFailOnError keinen Fehler, also wird die Fehlerbehandlung auch nicht angesprungen und das Commit ausgeführt.
Hallo,
ja wo du recht hast hast du recht.
dbFailOnError muss als Parameter hinter das Execute.
Wenn man mit einem Recordset und AddNew / Edit / Update arbeitet benötigt man es nicht.
Andreas