Listenfelder individuell sortieren

Zusammenfassung

Sie lernen, wie Sie einer Tabelle ein Feld zur individuellen Sortierung hinzufügen und die enthaltenen Datensätze per Listenfeld und einigen weiteren Schaltflächen komfortabel sortieren können.

Techniken

Formulare, Listenfelder, SQL, VBA

Voraussetzungen

Access 97 oder höher

Beispieldateien

Listenfelder97.mdb (Access 97)

ListenfelderI2000.mdb (Access 2000 und höher)

André Minhorst, Duisburg

Die Reihenfolge von Datensätzen passt man normalerweise wie auch Filterkriterien zur wunschgemäßen Anzeige von Daten mit Hilfe der OrderBy-Klausel in SQL oder direkt mit den entsprechenden Eigenschaften von Formularen, Berichten oder Steuerelementen an. Manchmal enthalten die Daten aber einfach kein geeignetes Feld, mit dem sich die gewünschte Reihenfolge bewerkstelligen ließe. In diesem Fall heißt es dann: Hand anlegen und nachrüsten! Alles über zusätzliche Kriterienfelder und ihre manuelle Anpassung in Formularen, Kombinations- und Listenfeldern erfahren Sie hier.

Die meisten Tabellen oder Abfragen enthalten ausreichend “natürliche” Felder, nach denen sich die Daten sinnvoll sortieren lassen – Textfelder nach dem Alphabet, Datumsfelder nach dem Datum, Preise und andere Zahlenangaben nach dem Wert. Die in diesen Feldern genannten Daten sind vorrangig wegen ihres Inhalts interessant. Es gibt aber auch Felder, die nur der Sortierung dienen. Diese können etwa zum Sortieren folgender Daten nützlich sein:

  • Tracklisten von CDs
  • Positionen von Rechnungen
  • Tagesordnungspunkte von Besprechungen
  • In manchen Fällen arbeitet man vielleicht sorgfältig genug und gibt die Datensätze direkt in der richtigen Reihenfolge ein – dann verwendet man einfach den Primärschlüssel als Kriterium. Sobald aber die Position eines Punktes verändert werden soll oder ein zusätzlicher Punkt hinzukommt, der zwischen bestehenden Punkten eingefügt werden soll, ist der Primärschlüssel als Kriterium nicht mehr zu gebrauchen.

    An dieser Stelle müssen Sie ein zusätzliches Feld als Sortierkriterium verwenden, das Sie ganz einfach “ReihenfolgeID” oder vielleicht auch “Tracknummer”, “Rechnungsposition” oder “TOP” nennen, um bei unseren Beispielen zu bleiben.

    Die oben genannten Beispiele werden allesamt durch 1:n-Beziehungen realisiert: CDs und Tracks, Rechnungen und deren Positionen und Besprechungen und Tagesordnungspunkte. Zur Beschreibung der notwendigen Schritte zur individuellen Sortierung einer Tabelle dient eine einfache Telefonliste. Die sortiert man zwar normalerweise nach dem Alphabet, aber um spezielle Einträge an den Anfang oder das Ende der Liste zu bringen, muss man sich solcher Tricks wie dem Voranstellen von Ausdrücken (“aaa”, “zzz”) vor dem Nachnamen bedienen. Mit einem individuellen Sortierkriterium geht das viel einfacher.

    Quellcode 1: Initialisieren der Reihenfolge

    Public Sub InitializeOrder(strTable As String, _    strSortField As String)
        Dim cnn As ADODB.Connection
        Dim rst As ADODB.Recordset
        Dim lngSortID As Long
        Set cnn = CurrentProject.Connection
        Set rst = New ADODB.Recordset
        lngSortID = 1
        rst.Open "SELECT * FROM " & strTable & " ORDER BY " _        & strSortField, cnn, adOpenDynamic, adLockOptimistic
        Do While Not rst.EOF
            rst(strSortField) = lngSortID
            lngSortID = lngSortID + 1
            rst.Update
            rst.MoveNext
        Loop
    End Sub

    Als Telefonliste dient eine Tabelle namens tblKontakte. Sie ist wie in Bild 1 aufgebaut. Wichtig ist das Feld ReihenfolgeID – es enthält den Zahlenwert, der die Position jedes einzelnen Kontakts festlegt.

    Bild 1: Diese Tabelle enthält Namen und Telefonnummern.

    Um die Liste in einem Listenfeld anzuzeigen, fügt man dem gewünschten Formular zunächst ein solches hinzu und versieht es mit dem Namen lstTelefon. Anschließend legt man als Datensatzherkunft eine auf der Tabelle tblKontakte basierende Abfrage an. Diese enthält alle Felder der Tabelle und ist aufsteigend nach dem Feld ReihenfolgeID sortiert. Der SQL-Ausdruck für diese Abfrage sieht wie folgt aus:

    SELECT KontaktID, Vorname, Nachname, Telefon, Telefax, ReihenfolgeID
    FROM tblKontakte
    ORDER BY ReihenfolgeID;

    Die Datensatzherkunft enthält sieben Felder, davon zeigt das Listenfeld aber derzeit nur das erste an – und das soll gerade nicht erscheinen. Damit es die gewünschten Felder anzeigt, stellen Sie die Eigenschaft Spaltenanzahl auf den Wert 6 und die Eigenschaft Spaltenbreiten auf den Wert 0cm;2,503cm;2,503cm;3cm;3cm;3cm ein. Das erste Feld des zugrunde liegenden SQL-Ausdrucks wird durch die Spaltenbreite 0cm ausgeblendet. Das letzte Feld ReihenfolgeID ist zwar wichtig für die Anzeige, soll aber selbst auch nicht im Listenfeld erscheinen. Daher zeigt das Listenfeld auch nur sechs statt der in der Datensatzherkunft enthaltenen sieben Felder an.

    Die individuelle Sortierung erfolgt über das Feld ReihenfolgeID der Tabelle tblKontakte. Das Feld enthält zu diesem Zeitpunkt noch keinen Wert. Für die Sortierung muss aber jeder Datensatz einen eindeutigen Wert im Feld ReihenfolgeID besitzen. Um dies zu realisieren, bedient man sich der Prozedur aus Quellcode 1.

    Die Prozedur ReihenfolgeInitialisieren durchläuft per ADO alle Datensätze der Tabelle tblKontakte und weist jedem Datensatz einen Wert zu, der jeweils um 1 erhöht wird. Als voreingestellte Reihenfolge verwendet die Routine den bisherigen Wert des Feldes ReihenfolgeID. Interessant ist das Aufrufen der Prozedur nur, wenn Datensätze entfernt oder hinzugefügt wurden.

    Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

    den kompletten Artikel im PDF-Format mit Beispieldatenbank

    diesen und alle anderen Artikel mit dem Jahresabo

    Schreibe einen Kommentar