Tipps und Tricks 2/2009

Es sind die kleinen Kniffe, die uns den Alltag beim Programmieren von Access-Anwendungen erleichtern. In dieser Ausgabe von Access im Unternehmen zeigen wir Ihnen zum Beispiel, wie Sie den Datensatzwechsel in Formularen steuern, bei Problemen mit DoCmd.OpenForms reagieren, oder einen kompletten Datensatz im Endlosformular markieren.

DoCmd.Close und seine Tücken

Die Anweisung DoCmd.Close schließt ohne Parameter das aktuelle Objekt, und mit den beiden Parametern ObjectType und ObjectName, für die man den Objekttyp (meist acForm oder acReport) und den Objektnamen (etwa frmBeispiel oder rptBeispiel) eingibt, beendet es die Anzeige des angegebenen Objekts.

Die in der Überschrift erwähnte Tücke bezieht sich ausschließlich auf Formulare, die an eine Datenherkunft, wie eine Tabelle oder eine Abfrage, gebunden sind. Dort sorgt das Schließen eines Formulars per DoCmd.Close für das Speichern des aktuellen Datensatzes.

Aber leider nicht immer, so zum Beispiel bei Datensätzen, denen Sie einen bereits vorhandenen Wert für ein Feld mit eindeutigem Index hinzugefügt haben. Die passende Tabelle sieht im Entwurf samt Indizes wie in Abb. 1 aus. Die Fehlermeldung, die beim zweimaligen Wert des gleichen Datensatzes im eindeutigen Feld Beispielfeld auftaucht, hat die Fehlernummer 3022 und besagt, dass man versucht, einen Wert hinzuzufügen, nachdem ein Index, ein Primärschlüssel oder eine Beziehung doppelte Werte enthalten würde.

pic001.tif

Abb. 1: Eindeutiger Index eines Tabellenfelds

Erstellen Sie nun ein Formular, das die beiden Felder der Beispieltabelle und eine Schaltfläche mit dem Namen cmdOK enthält (s. Abb. 2), und legen Sie die folgende Ereignisprozedur für diese Schaltfläche an:

pic002.tif

Abb. 2: Formular zum Testen des Verhaltens von DoCmd.Close

Private Sub cmdOK_Click()
    DoCmd.Close acForm, Me.Name
    End Sub

Geben Sie in den ersten Datensatz einen Wert für das Feld Beispielfeld ein und klicken Sie auf OK. Wenn Sie in der Tabelle tblBeispiel nachsehen, finden Sie den neu angelegten Datensatz dort vor. Öffnen Sie das Formular erneut, wechseln Sie zum zweiten Datensatz und geben Sie den gleichen Wert wie zuvor in das Feld Beispielfeld ein.

Klicken Sie auf OK, ohne vorher den Datensatz per Klick auf den Datensatzmarkierer oder durch Wechseln zu einem anderen Datensatz zu speichern. Die erste Überraschung: Es erscheint keine Fehlermeldung. Die zweite Überraschung: Ein Blick in die Tabelle tblBeispiel zeigt, dass der Datensatz kommentarlos überhaupt nicht angelegt wurde.

Ein Blick in die Online-Hilfe der Close-Methode zeigt, dass dieses Verhalten zumindest nicht dokumentiert ist: Dort ist lediglich die Rede davon, dass Felder, für die Sie die Required-Eigenschaft auf True eingestellt haben, für einen kommentarlosen Abbruch des Speichervorgangs sorgen können, wenn diese keinen Wert enthalten.

Probleme können hier beispielsweise entstehen, wenn ein Unternehmen seine Mitarbeiter mit Access verwaltet.

Trägt man einen neuen Mitarbeiter, dessen Name bereits vorhanden ist, mit einem Formular wie oben beschrieben in die Mitarbeitertabelle ein, bricht Access den Speichervorgang bei alleiniger Anwendung von DoCmd.Close kommentarlos ab.

Wenn man dann nach dem frisch eingegebenen Mitarbeiter sucht, stößt man vermutlich auf den bereits vorhandenen Mitarbeiter und reibt sich die Augen, da sein Datensatz ganz andere Detailinformationen aufweisen dürfte als der des soeben eingegebenen Mitarbeiters.

Das größte Problem ist, dieses Fehlverhalten zu erkennen. Seine Behebung ist einfach: Sie brauchen den Datensatz einfach nur vor dem Schließen des Formulars zu speichern, und zwar mit der folgenden Anweisung:

Me.Dirty = False

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

Workplace

Jahresabonnement TestzugangOder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar