Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 3/2005.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Access-FAQ: Rund um Access

Karl Donaubauer, Wien

In der Access-FAQ von Karl Donaubauer (www.donkarl.com) finden Sie die meistgestellten Fragen und Anworten zum Thema Microsoft Access. In dieser Beitragsreihe stellt Karl Donaubauer die wichtigsten Einträge im Detail vor und zeigt Ihnen entsprechende Lösungen anhand praxisnaher Beispiele. Im achten Teil lernen Sie die Lösungen zu den häufigsten Problemen im Zusammenhang mit dem Finden, Sortieren und Speichern von Daten in Formularen kennen.

Hinweis

Die Beispieldatenbanken zu FAQ8_A97.mdb für Access 97 und FAQ8_A00.mdb für Access 2000 und höher. Sie finden die Datenbanken auf der Heft-CD oder im Internet unter http://www.
access-im-unternehmen.de (Shortlink 281). (

Datensatz suchen

Suchfunktionalitäten lassen sich in zwei große Kategorien einteilen: Filtern oder Springen. Die häufigste Aufgabenstellung bei der Sprungvariante ist der Wunsch, in ein Text- oder Kombinationsfeld einen Suchbegriff eingeben zu können und damit zum passenden Datensatz zu springen. Dafür bietet VBA zwei verschiedene Lösungsmöglichkeiten, die beide sowohl im Einzel- als auch im Endlosformular funktionieren.

Abb. 1: Suche mit FindRecord oder Bookmark

In der Beispieldatenbank zu diesem Artikel finden Sie das Formular frmArtikelSuche
(s. Abb. 1), in dem beide Techniken vorgeführt werden. Ob Sie sich zur Suche eines Kombinationsfeldes oder eines normalen Textfeldes bedienen, ist für den reinen Suchcode unerheblich.

Im Beispielformular ist es ein Kombinationsfeld, dessen erste und gebundene Spalte die eindeutige ArtikelId enthält, die zweite Spalte enthält die Artikelbezeichnung.

Die Spaltenbreite der ID-Spalte steht auf 0, damit sie nicht sichtbar ist. Der Anwender gibt also den Suchtext für die aussagekräftige Artikelbezeichnung ein, gesucht wird aber mittels der gebundenen Spalte, die die eindeutige ID enthält.

Die erste Methode, FindRecord, ist sehr einfach und erfordert nur drei Zeilen VBA-Code im Ereignis Nach Aktualisierung des Such-Kombinationsfeldes.

If IsNull(Me!cboSuche1) Then Exit Sub

Me!ArtikelId.SetFocus

DoCmd.FindRecord Me!cboSuche1

Die erste Zeile dient dazu, die Prozedur gleich wieder zu verlassen, falls das Kombinationsfeld leer ist. Ansonsten würde FindRecord eine unnötige Fehlermeldung liefern. Die zweite Codezeile setzt den Fokus auf das Textfeld ArtikelId, die dritte führt die eigentliche Such- und Sprungaktion aus, indem nach dem FindRecord-Befehl der Parameter für den Suchvergleich angegeben wird. In diesem Fall ist das der Inhalt des Such-Kombinationsfeldes. Die Methode FindRecord bietet darüber hinaus noch interessante weitere Parameter zum Beispiel zur Unterscheidung zwischen Groß- und Kleinschreibung, zur Angabe einer Suchrichtung oder zur Suche in allen Feldern eines Datensatzes. Die Methode ist also die Umsetzung des normalen Suchdialogs von Office und bietet auch alle entsprechenden Möglichkeiten. Sie sind recht gut in der Online-Hilfe erläutert.

Der große Nachteil dieser Methode ist, dass das Feld, in dem gesucht werden soll, im Formular sichtbar und aktiviert sein muss, damit es den Fokus erhalten kein und FindRecord weiß, wo gesucht werden soll. Das ist oft nicht erwünscht, so wie im Beispielfall, in dem die Anzeige einer nicht aussagekräftigen und nicht änderbaren ArtikelId keinen Sinn macht. Für diesen Fall eignet sich eher der Umweg über den RecordsetClone des Formulars, wie er im zweiten Such-Kombinationsfeld des Beispielformulars gezeigt wird. Der Code im Ereignis Nach Aktualisierung des Kombinationsfeldes lautet:

If IsNull(Me!cboSuche2) Then Exit Sub

Dim rst As DAO.Recordset

Set rst = Me.RecordsetClone

rst.FindFirst "ArtikelId = " _
    & Me!cboSuche2

If Not rst.NoMatch Then

    Me.Bookmark = rst.Bookmark

End If

Set rst = Nothing

Es wird also ein DAO-Recordset deklariert und mit dem Clone des Formular-Recordsets belegt. In diesen Daten wird mit der FindFirst-Methode von DAO nach dem Datensatz gesucht, der dem Suchbegriff entspricht. Falls etwas gefunden wurde, setzt FindFirst den Zeiger auf diesen gefundenen Datensatz und anschließend wird die Bookmark-Eigenschaft des Formulars auf jene des RecordsetClones gesetzt. Das hat zur Folge, dass im Formular der gefundene Datensatz zum aktuellen wird. Was ist der Grund dafür?

Beim Öffnen eines Formulars weist Access jedem angezeigten Datensatz einen eindeutigen Wert zu, das so genannte Lesezeichen oder Bookmark in VBA. Der RecordsetClone ist nichts anderes als eine Kopie der Daten im Formular und verwendet dieselben Bookmarks. Deshalb kann man sie in beiden Richtungen aufeinander abstimmen.

Noch ein Warnhinweis, falls Sie Access 97 verwenden: Sie sollten ein aktuelles JET-Update für Access 97 installiert haben und/oder das Service Release 2 für Office 97. Wenn nicht, sollten Sie vor der ersten Verwendung des RecordsetClones schreiben:

Me.RecordsetClone.Requery

Ansonsten könnte der legendäre Bookmark-Bug wirksam werden, der in älteren Access-Versionen manchmal dafür sorgt, dass die Anzeige im Formular nicht richtig mit dem dahinter liegenden Recordset synchronisiert wird und somit Datenänderungen nicht im aktuell sichtbaren Datensatz des Formulars vorgenommen werden, sondern in irgendeinem anderen. Das war einer der schwersten Fehler, die Access jemals hatte, weil dadurch ohne Schuld des Anwenders falsche Daten erzeugt wurden. Microsoft hat diesen Bug erst mit den oben angeführten Updates gefixt.

Sortierung ändern

Zum Sortieren gibt es die zwei einfach und klar zu bedienenden Schaltflächen in der Formular-Symbolleiste. Es kommt aber vor, dass man entweder keine Symbolleisten anzeigen, die Sortier-Funktion auf das Klicken einer selbst erstellten Schaltfläche legen oder nach mehr als einem Feld sortieren möchte. Für all diese Varianten brauchen Sie die Sortierung per VBA. Dafür gibt es wiederum zwei Varianten mit Vor- und Nachteilen. Die erste Variante ist das Erzeugen oder Ändern des SQL-Strings, der als Datenherkunft des Formulars dient. Entscheidend für die Sortierung der Daten ist dabei die Klausel ORDER BY von SQL. Angenommen Sie haben eine Tabelle tblKunden, die standardmäßig nach dem Primärschlüsselfeld KundenId sortiert wird, und Sie möchten auf Knopfdruck nach den Feldern Nachname und Vorname sortieren. Der Code im Ereignis Beim Klicken einer Schaltfläche könnte so aussehen:

Dim strSQL As String

strSQL = "SELECT tblKunden.* " _
    & "FROM tblKunden " _
    & "ORDER BY tblKunden.Nachname, " _
    & " tblKunden.Vorname;"

Me.RecordSource = strSQL

Die Neuzuweisung der RecordSource (Datenherkunft) an das Formular bewirkt immer auch gleich eine Aktualisierung der Anzeige. Mehr ist also nicht zu tun.

Diese Sortier-Methode über das SQL-Statement des Formulars ist sehr flexibel, weil Sie nicht nur die Sortierung, sondern auch alle anderen die Daten betreffenden Einstellungen über das SQL-Statement vornehmen können. Wenn Sie nicht besonders SQL-erfahren sind, ist das beste Vorgehen, eine Abfrage mit dem Abfrage-Editor zu erstellen, in die SQL-Ansicht zu wechseln und das Statement von dort per Zwischenablage zu übernehmen. Auch Profis verwenden oft diese Technik und verbessern gegebenenfalls noch das Statement des Assistenten, weil es schneller und weniger fehleranfällig ist als das Tippen des kompletten Statements samt Feldnamen und so weiter.

Der große Nachteil dieser Methode ist, dass die Daten komplett neu abgerufen werden, was bei langsamer Verbindung oder großen Datenmengen ein Performance-Problem darstellen kann. Die zweite Methode ist die Verwendung der Eigenschaft Sortiert nach des Formulars:

Me.OrderBy = "Nachname, Vorname"

Me.OrderByOn = True

Für eine absteigende Sortierung müssten Sie übrigens genau wie in SQL auch hier das Schlüsselwort DESC verwenden. Zum Beispiel absteigend nach Nachname und Vorname sortiert:

Me.OrderBy = _
    "Nachname DESC, Vorname DESC"

Me.OrderByOn = True

Diese Methode hat den Vorteil, dass die Datenherkunft des Formulars nicht neu geladen wird. Sie hat aber den Nachteil, dass Access die letzte Sortierung speichert. Das passiert auch, wenn Sie diese Eigenschaft nicht per VBA, sondern im Eigenschaftsfenster einstellen. Wenn Sie verhindern möchten, dass die Daten beim nächsten Öffnen nach der zuletzt verwendeten Einstellung sortiert werden, können Sie im Ereigniscode Beim Öffnen des Formulars schreiben:

Me.OrderBy = ""

Gleicher Datensatz nach
Requery

In vielen Situationen müssen Sie zum Aktualisieren der Daten eines Formulares die Requery-Methode verwenden. Ein typisches Beispiel ist das Auswahlformular, das nach dem Öffnen eines Detailformulars alle geänderten und neuen Datensätze anzeigen soll und die gelöschten nicht mehr. Das Problem mit Requery ist, dass die Methode bei der erwünschten Neuabfrage der Datenherkunft zum ersten Datensatz des Formulars springt. Um das sauber zu beheben, ist einiges an Code erforderlich. Abb. 2 zeigt die Formulare frmArtikelAuswahl und frmArtikelAktualisierung aus der Datenbank zum Artikel.

Das eine Formular ist eine nicht direkt änderbare Artikelliste, das andere ein Detailformular, in dem Änderungen vorgenommen werden können. Das Detailformular enthält drei Schaltflächen, die die unterschiedlichen Auswirkungen auf das Auswahlformular demonstrieren, besonders wenn neue Datensätze hinzugefügt oder bestehende gelöscht wurden. Quellcode 1 ist der Code hinter dem Klick-Ereignis der untersten Schaltfläche, die nach dem Schließen des Detailformulars und dem Requery auf das Auswahlformular zum aktuellen Datensatz zurückkehrt.

Abb. 2: Auswahl- und Detailformular mit Requery-Methode

Private Sub btnSchliessenMitDS_Click()

    On Error GoTo myError

    DoCmd.Close acForm, Me.Name

    Dim rs As DAO.Recordset

    Dim frm As Form

    Dim lngStore As Long

    Set frm = Forms!frmArtikelAuswahl

    Set rs = frm.RecordsetClone

    lngStore = frm!ArtikelId

Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

Sind Sie Abonnent?Jetzt einloggen ...
 

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

© 2003-2015 André Minhorst Alle Rechte vorbehalten.