Klasse zum Sortieren im Endlosformular

Diskussionen über den Quellcode (Module, Klassenstruktur, Schnittstellen u.s.w.) der Access Code Library

Klasse zum Sortieren im Endlosformular

Beitragvon Andreas Vogt » Sa 20. Jun 2015, 17:57

Hallo,
nachdem ich die Klasse clsSort von Armin Hess (http://www.gaeuwetter.de/access/home) gesehen habe dachte ich die Idee ist eigentlich gut, nur die Umsetzung fand ich nicht gut.
Daher hab ich die Klasse neu geschrieben, ebenfalls ein Beispielformular dazu erstellt - welches beim ersten Öffnen eine Tabelle mit 10 Datensätzen erstellt. Pfad: form/sort

Es geht darum im Endlosformular per Klick auf einen Spaltenkopf die jeweilige Spalte zu sortieren. Der Spaltenkopf wird durch CommandButtons dargestellt, die Zuordnung zur Datenspalte erfolgt per Property.
Beispiel:
Code: Alles auswählen
Private cSort As ColumnSort

Private Sub Form_Load()
    Set cSort = New ColumnSort
End Sub

Private Sub cmdFirstName_Click()
    cSort.SortFieldName = "Firstname"
    cSort.Sort
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Set cSort = Nothing
End Sub


Gruß Andreas
Andreas Vogt
Entwickler
 
Beiträge: 165
Registriert: Do 18. Mär 2010, 18:00
Wohnort: Offenburg
Accessversion: 2.0, 97, 2002, 2003, 2007, 2010
Access-Erfahrung: Fortgeschritten

Re: Neue Klasse zum Sortieren im Endlosformular

Beitragvon Josef Pötzl » Sa 20. Jun 2015, 19:21

Hallo!

Ich würde da einen Schritt weiter gehen und auch das Klicken von der Klasse abfangen lassen, damit man im Endlosformular nur den "Aktivierungscode" benötigt.
Das Anwenden der Sortierung würde ich auch im formular durchführen, damit man dort entscheiden kann, ob man es an OrderBy weitergibt, oder ob man die Sortierung für das Einstellen der Recordsource oder ein Recordset verwendet.
Außerdem würde ich keine CommandButtons sondern die meist vorhandenen Label-Controls (Überschriften der Spalten) nutzen - oder beides zulassen. Ich finde es praktischer, wenn man nicht zu viel umbauen muss, um eine Sortierung zu ergänzen.

Tipp aus der Praxis:
Es ist auch empfehlenswert, wenn man die Sortierung nach der 1. Sortierung vordefinieren kann. Nicht zu selten ist eine Sortierreihenfolge der weiteren Datenfelder in Abhängigkeit der "Hauptsortierung" nützlich. Ich nutze dafür die Tag-Eigenschaften der Labels um das einzustellen.

So würde z. B. der Tag bei einer Personenliste aussehen: FamilyName [DESC], PreName [DESC]
Anm.: das [DESC] dient dazu, die passende Sortierrichtung zu deklarieren. (1. Klick = Aufsteigend sortiert, 2. Klick auf das gleiche Label = Absteigend sortiert, 3. Klick = wieder aufsteigend usw.)

mfg
Josef
Josef Pötzl
Moderator
 
Beiträge: 805
Registriert: Mo 30. Nov 2009, 10:08
Wohnort: Klagenfurt
Accessversion: 2016

Re: Neue Klasse zum Sortieren im Endlosformular

Beitragvon Andreas Vogt » Sa 20. Jun 2015, 20:20

Hallo Josef,
ja gute Ideen, mache mich gleich mal ans Werk.
Das mit der Abhängigkeit von Haupt und Nebensortierungen könnte man über eine Property let AddFieldName machen und die Feldbezeichner in einem Array sortiert speichern und dann den Sortier-String daraus zusammenbauen.

Die Reihenfolge der Sortierung ist z.Z. Nichtsortierung bei Start - Aufsteigend - Absteigend - Nicht Sortiert. Wechselt man die Spalte wird die neue Datenspalte aufsteigend sortiert.

Andreas
Andreas Vogt
Entwickler
 
Beiträge: 165
Registriert: Do 18. Mär 2010, 18:00
Wohnort: Offenburg
Accessversion: 2.0, 97, 2002, 2003, 2007, 2010
Access-Erfahrung: Fortgeschritten

Re: Neue Klasse zum Sortieren im Endlosformular

Beitragvon Josef Pötzl » Sa 20. Jun 2015, 20:25

Ich könnte mir auch so etwas vorstellen:

Code: Alles auswählen
'Sortier-Controls definieren:
With KlassenReferenz
   '.Add [Steuerelement das das Sortieren auslöst], Zu sortierendes Datenfeld, Optional (oder Paramarray): weitere SortierDatenfelder
  .Add LabelSteuerelement, "DatenfeldX [DESC]", "DatenfeldA", "DatenfeldB [DESC]"

'oder
  '.Add Steuerelement, dazu gehörender Sortier-Text
  .Add LabelSteuerelement, "DatenfeldX [DESC], DatenfeldA, DatenfeldB [DESC]"
   ...
end with
Josef Pötzl
Moderator
 
Beiträge: 805
Registriert: Mo 30. Nov 2009, 10:08
Wohnort: Klagenfurt
Accessversion: 2016

Re: Neue Klasse zum Sortieren im Endlosformular

Beitragvon Andreas Vogt » Sa 20. Jun 2015, 21:52

Ja, das ist eine brauchbare Lösung. Paramarray nehm ich nicht so gerne, String ist aber völlig OK.
Um im Formular die Intellisense ausnützen zu können würde ich aber eher das so schreiben:
With ClassObject
.Add lblFamilienname, strDatenfeld1, [Desc]
.Add lblFamilienname, strDatenfeld2, [Asc]
End With
Was meinst du dazu?
Andreas Vogt
Entwickler
 
Beiträge: 165
Registriert: Do 18. Mär 2010, 18:00
Wohnort: Offenburg
Accessversion: 2.0, 97, 2002, 2003, 2007, 2010
Access-Erfahrung: Fortgeschritten

Re: Neue Klasse zum Sortieren im Endlosformular

Beitragvon Josef Pötzl » Sa 20. Jun 2015, 22:33

Kommt drauf an, was du erreichen willst.

Ich dachte an das Anfügen des zu überwachenden Steuerelements, das das Sortieren auslöst. Dazu passen dann als Parameter die Sortiervorgabe.
Mehrmals das gleiche Steuerelement würde ich nicht eingeben.
Dann eher so:
Code: Alles auswählen
With SortiererReferenz
   With .Add(lblReference, Datenfeld1)
        .Add Datenfeld2
        .Add Datenfeld3
   end with
end with
 
... ist aber irgendwie schlecht lesbar

Anm.: den [DESC]-Text in meinem Beispiel verwende ich in meinen Anwendungen umd festzulegen, ob bei einem 2. Klick auf das gleiche Steuerelement auch in den "Untersortierfeldern" gewechselt werden soll. Da könnte man sich aber überlegen, wie man das gestaltet, um eine verständliche Definition zu übergeben.

Ich finde die Variante:
1. Parameter = Steuerelementreferenz
2. Parameter = Sortierangabe
am verständlichsten.

Beim 2. Parameter ist zu überlegen, ob man den als einen String übergibt, auf mehrer Parameter aufteilt oder eine weitere "Sortierdeklarations"-Refernz übergibt, die mittels Factory-Funktion erzeugt wird.

LG
Josef
Josef Pötzl
Moderator
 
Beiträge: 805
Registriert: Mo 30. Nov 2009, 10:08
Wohnort: Klagenfurt
Accessversion: 2016

Re: Neue Klasse zum Sortieren im Endlosformular

Beitragvon Andreas Vogt » So 21. Jun 2015, 11:24

Ok, so mach ich es.
Der Form-Code sieht dann ungefär so aus:
Code: Alles auswählen
Dim cSort AS ColumnSort

Private Sub Form_Load()
    Set cSort = New ColumnSort
    With cSort
        .Add Me.lblVorname, "strVorname"
        .Add Me.lblNachname, "strNachname;strVorname"
        .Add Me.lblAlter, "strAlter"
    End With
End Sub


Eine Angabe von [DESC] ist imo nur beim 2. Sortierfeld sinnvoll, und ASC ist ja eh Default.

Andreas
Andreas Vogt
Entwickler
 
Beiträge: 165
Registriert: Do 18. Mär 2010, 18:00
Wohnort: Offenburg
Accessversion: 2.0, 97, 2002, 2003, 2007, 2010
Access-Erfahrung: Fortgeschritten

Re: Neue Klasse zum Sortieren im Endlosformular

Beitragvon Josef Pötzl » So 21. Jun 2015, 12:24

Im Anhang ist ein Beispiel, wie ich mir die Schnittstelle vorstellen könnte.
Die Klassen sind nicht fertig - sie zeigen nur das Prinzip. Ich übernahm nur ein paar Codezeilen aus meiner Form-Steuerung.

Anm.: in diesem Beispiel zeigt sich eine Lästigkeit, wenn man das automatische Positionieren von Access einsetzt - Man kann die aktuelle Position und Größe der Labelsteuerelemente nicht ermitteln, da sich die Eigenschaften Left usw. auf die "Speicherposition" und nicht auf die sichtbare Position beziehen.

LG
Josef
Dateianhänge
FormSortingExtension.zip
(40.95 KiB) 1449-mal heruntergeladen
Josef Pötzl
Moderator
 
Beiträge: 805
Registriert: Mo 30. Nov 2009, 10:08
Wohnort: Klagenfurt
Accessversion: 2016

Re: Neue Klasse zum Sortieren im Endlosformular

Beitragvon Andreas Vogt » So 21. Jun 2015, 17:22

Hm, OK. Was sollte ich noch gleich noch machen?
Steht ja alles schon da, brauch ja nur noch abtippen.

Hast du das im Repository drin?
Wenn ja spar ich mir die Arbeit und nehme mein Beispiel wieder raus.

Andreas
Andreas Vogt
Entwickler
 
Beiträge: 165
Registriert: Do 18. Mär 2010, 18:00
Wohnort: Offenburg
Accessversion: 2.0, 97, 2002, 2003, 2007, 2010
Access-Erfahrung: Fortgeschritten

Re: Neue Klasse zum Sortieren im Endlosformular

Beitragvon Josef Pötzl » So 21. Jun 2015, 20:59

Die Klassen sind nun eingecheckt (Ordner "form/sort")

Das Setzen des "Sortier-Symbols" läuft allerdings bei verwendeten "Layouts" nicht stabil. (Beispiel ist im Anhang.)
Problem ist das Positionieren des Steuerelements zu den Labels, welche von Access bei Größenänderung des Formulars verschoben und vergrößert werden.

Vielleicht hat jemand eine stabilen Code, um die "echte" Position der Labels zu ermitteln und das Sortiersymbol-Label zu positionieren.


Vorschlag für eine Erweiterung der Klasse FormSortExtension:
Als Alternative zu Add für jedes einzelne Sortierfeld, eine Methode anfügen, die die Controls anhand des Namen, von Tag-Einstellungen o. ä. erkennt und aus dem Tag auch die SortierFelder ausliest. => Das ermöglicht relativ unveränderten Code in den Formularen. Man muss dann nur die Steuerelemente, nach denen sortiert werden soll passend konfigurieren.

LG
Josef
Dateianhänge
FormSortingExtension.zip
(76.59 KiB) 1442-mal heruntergeladen
Josef Pötzl
Moderator
 
Beiträge: 805
Registriert: Mo 30. Nov 2009, 10:08
Wohnort: Klagenfurt
Accessversion: 2016

Nächste

Zurück zu Quellcode

cron