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

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)

Listenfelder individuell sortieren

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.

Warum individuell sortieren?

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.

    Beispiel: Telefonliste

    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 Abb. 1 aufgebaut. Wichtig ist das Feld ReihenfolgeID - es enthält den Zahlenwert, der die Position jedes einzelnen Kontakts festlegt.

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

    Telefonliste per Listenfeld

    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.

    Individuelle Sortierung

    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.

    Abb. 2: Listenfeld mit Schaltflächen zum Ändern der Sortierreihenfolge

    Damit neue Datensätze sich hinten anreihen, legen Sie als Standardwert für das Feld ReihenfolgeID einen Wert fest, der größer als die zu erwartende Datensatzanzahl ist. Wenn neue Datensätze vorne in der Liste zu finden sein sollen, verwenden Sie einfach 0 als Standardwert.

    Da die Prozedur recht fix arbeitet (auch mit 1.500 Datensätzen benötigt sie nur Bruchteile einer Sekunde), soll das Formular mit dem Listenfeld sie bei jedem Öffnen aufrufen. Dafür sorgt die folgende Prozedur:

    Private Sub Form_Open(Cancel As Integer)

        ReihenfolgeInitialisieren

    End Sub

    Quellcode 2: Dieses Ereignis wird beim Klick auf die Schaltfläche cmdUp ausgelöst.

    Private Sub cmdUp_Click()

        Dim lngID As Long

        If Not IsNull(Me.lstTelefon) Then

            If Not Me.lstTelefon.ListIndex = 0 Then

                lngID = Me.lstTelefon

                SwapNeighbours lngID, True, "tblKontakte", "KontaktID", "ReihenfolgeID"

                Me.lstTelefon.Requery

            End If

        End If

    End Sub

    Einträge
    verschieben

    Um die Einträge des Listenfeldes verschieben zu können, verwenden Sie vier Schaltflächen mit folgenden Funktionen:

  • eine Position nach oben verschieben
  • eine Position nach unten verschieben
  • ganz nach oben verschieben
  • ganz nach unten verschieben
  • Dazu legen Sie zunächst vier Schaltflächen an, die Sie wahlweise mit einer entsprechenden Beschriftung oder einem Icon versehen. Das Formular sieht mit den vier Schaltflächen cmdUp, cmdDown, cmdTop und cmdBottom wie in Abb. 2 aus.

    Eintrag mit dem oberen Nachbarn tauschen

    Die Prozeduren zum Vertauschen der Position zweier Einträge ähneln sich sehr, sodass hier nur eine der beiden vorgestellt wird. Die Prozedur cmdUp_Click (s. Quellcode 2) wird durch die Schaltfläche cmdUp ausgelöst und erfüllt im Wesentlichen zwei Aufgaben: Sie prüft, ob überhaupt ein Listeneintrag ausgewählt ist und ob dieser sich nicht bereits an der ersten Position der Liste befindet. Dazu prüft sie die aktuelle Position des markierten Datensatzes mit der ListIndex-Eigenschaft. Anschließend ruft die Routine die Prozedur SwapNeighbours auf (s. Quellcode 3). Diese Prozedur erwartet fünf Parameter:

  • die ID des zu tauschenden Datensatzes
  • einen Bool’schen Wert, der angibt, ob mit dem oberen oder dem unteren Nachbarn getauscht werden soll
  • Quellcode 3: Vertauschen zweier Listeneinträge

    Private Sub SwapOrder(lngID As Long, bolUp As Boolean, strTable As String, _
        strPrimaryKey As String, strSortField As String)

        Dim cnn As ADODB.Connection

        Dim lngUp As Long

        Dim lngDown As Long

        Set cnn = CurrentProject.Connection

        If bolUp = True Then

            lngUp = DLookup(strSortField, strTable, strPrimaryKey & " = " & lngID)

            lngDown = DMax(strSortField, strTable, strSortField & " < " & lngUp)

            cnn.Execute "UPDATE tblKontakte SET ReihenfolgeID = " & lngUp _
                & " WHERE ReihenfolgeID = " & lngDown

            cnn.Execute "UPDATE tblKontakte SET ReihenfolgeID = " & lngDown & " WHERE KontaktID = " _
                & lngID

        Else

            lngDown = DLookup(strSortField, strTable, strPrimaryKey & " = " & lngID)

            lngUp = DMin(strSortField, strTable, strSortField & " > " & lngDown)

            cnn.Execute "UPDATE tblKontakte SET ReihenfolgeID = " & lngDown _
                & " WHERE ReihenfolgeID = " & lngUp

            cnn.Execute "UPDATE tblKontakte SET ReihenfolgeID = " & lngUp & " WHERE KontaktID = " _
                & lngID

        End If

        Set cnn = Nothing

    End Sub

  • die Herkunftstabelle der zu tauschenden Daten
  • den Namen des Primärschlüsselfeldes
  • und den Namen des Feldes, das die Informationen über die Reihenfolge enthält.
  • Mit diesen Informationen ermittelt die Prozedur den Reihenfolge-Wert der zu tauschenden Datensätze und nimmt den Tausch dann in zwei Schritten vor: Der Reihenfolge-Wert des nicht markierten am Tausch beteiligten Datensatzes wird auf den Reihenfolge-Wert des markierten Datensatzes und dann der Reihenfolge-Wert von letzterem auf denjenigen des nicht markierten Datensatzes gesetzt. Diese Funktion ist in der Prozedur für beide Fälle enthalten - also für den Tausch mit dem oberen als auch für den Tausch mit dem unteren Nachbarn.

    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:

    Verwandte Beiträge:

    Listenfeld und Details in einem Formular

    © 2003-2015 André Minhorst Alle Rechte vorbehalten.