Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Befehl "DoCmd.Close" wird ab und zu ignoriert!?

Begonnen von trebuh, Juni 18, 2015, 23:56:13

⏪ vorheriges - nächstes ⏩

trebuh

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

Nadeshiko

Versuch mal:

DoCmd.Close acForm, "frmFormularName"

Hondo

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

trebuh

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

Hondo

#4
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


MaggieMay

Hi,

geht das einfach so, muss sich die Abfrage dann nicht auf den Workspace beziehen?

Und: Eine Auswahlabfrage ("Select...") ist so nicht ausführbar.
Freundliche Grüße
MaggieMay

Hondo

#6
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

MaggieMay

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.
Freundliche Grüße
MaggieMay

Hondo

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

MaggieMay

Hier irrst du wohl Andreas, Execute wirft ohne dbFailOnError keinen Fehler, also wird die Fehlerbehandlung auch nicht angesprungen und das Commit ausgeführt.
Freundliche Grüße
MaggieMay

Hondo

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