Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: omron2003 am Juli 17, 2025, 10:04:08

Titel: was bewirkt dieser VBA Code
Beitrag von: omron2003 am Juli 17, 2025, 10:04:08
Hallo Forum,

was genau macht dieser VBA Code?

Besten Dank im Voraus
omron2003

Private Sub Auftrag_BeforeUpdate(Cancel As Integer)
Dim strSQL As String

    strSQL = "SELECT Count(*) FROM qyr_01_Auftraege " & _
             "WHERE Fert='" & Me!Auftrag & "'"
    If DBEngine(0)(0).OpenRecordset(strSQL, dbOpenForwardOnly)(0) = 0 Then
        MsgBox ("Fehler bei der Eingabe? Prüfen Sie Bitte den Eintrag!!!" & vbCrLf & "wenden Sie sich ggf. an das IT-Team! ")
        Cancel = True
    End If
End Sub
Titel: Re: was bewirkt dieser VBA Code
Beitrag von: Debus am Juli 17, 2025, 10:13:24
Hey,

Die Prozedur prüft, ob es in der Abfrage/Tabelle qyr_01_Auftraege einen Datensatz mit dem Wert aus ,,Me!Auftrag" im Feld ,,Fert" gibt. Wenn nicht, wird eine Fehlermeldung gezeigt und das Speichern verhindert.

Gruß
Holger
Titel: Re: was bewirkt dieser VBA Code
Beitrag von: omron2003 am Juli 17, 2025, 10:25:48
Super Danke Holger,
wäre es Möglich den Code so anzupassen das man trotz dieser Meldung was eintragen könnte.

Besten Dank im Voraus
omron2003
Titel: Re: was bewirkt dieser VBA Code
Beitrag von: Debus am Juli 17, 2025, 10:55:48
Cancel = True einfach weglassen
Titel: Re: was bewirkt dieser VBA Code
Beitrag von: Knobbi38 am Juli 17, 2025, 11:09:51
Na ja, die Prüfung im Before_Update Event wird schon seinen Grund haben, oder? Im Übertragenen Sinne wird damit nur die Bearbeitung erlaubt, aber keine Neuanlage.

Im Übrigen ist das ein gutes Beispiel dafür, wie man es nicht machen sollte: Das mit OpenRecordset geöffnete Recordset wird nicht richtig mit Close geschlossen, sondern das Objekt wird einfach bei Verlassen des Kontexts zerstört. Kurzer Code ist ja manchmal ganz schön, aber hier war jemand einfach nur zu faul, das richtig auszuprogrammieren.

Knobbi38
Titel: Re: was bewirkt dieser VBA Code
Beitrag von: Bitsqueezer am Juli 17, 2025, 11:41:49
Hallo,

zumal es gar kein Recordset gibt, was man wieder schließen könnte, da es direkt über DBEngine geöffnet wird.

Man könnte auch einfach DCount verwenden, was den Code kürzer macht und man muß sich nicht um das Zusammenbasteln von SQL Strings kümmern, mögliche Probleme damit, Recordsets usw. Macht alles DCount.

Fragt sich dann auch, wenn man "Auftrag_BeforeUpdate" hat und "qyr_01_Auftraege", ob hier gar versucht wird, etwas abzufragen, was noch gar nicht gespeichert wurde... ?
Wie "BeforeUpdate" ja aussagt, wurde der aktuell bearbeitete Datensatz (egal ob ein neuer oder ein schon vorhandener) noch gar nicht gespeichert, und das Speichern kann man hier noch mit "Cancel = True" unterbinden.

Also die Abfrage geht so viel einfacher:

If DCount("*","qyr_01_Auftraege", _
             "Fert='" & Me!Auftrag & "'") = 0 Then
...

Gruß

Christian


Titel: Re: was bewirkt dieser VBA Code
Beitrag von: omron2003 am Juli 17, 2025, 12:15:50
Super Danke für die schnelle Hilfe.

Gruß
omron2003