Alle schön der Reihe nach!

Heute wieder einmal ein Anwendungsfall aus der Praxis. Besonders gerne stelle ich meine Programmierarbeitskraft zur Verfügung, wenn es darum geht, Arbeitsabläufe zu analysieren und daraus ein Programm zu stricken, das mühselige manuelle Vorgänge automatisiert. Ganz ganz besonders gerne mache ich das, wenn der Auftraggeber auch einen für mein kapitalismus- und marktkritisches Gemüt positiv erscheinenden Unternehmenszweck verfolgt.

Weshalb ich immer wieder gerne an neuen Funktionen der Verwaltungssoftware für das Berliner Biogarten-Miet-und-Lernunternehmen bauerngarten bastle. Nur mal grob umrissen, damit Sie wissen, was das Problem war: Man kann dort an einem von drei Standorten eine Parzelle anmieten, vorbestückt und über die Saison nachbeliefert mit Bio-Gemüsereien. Die Parzellen sind Tortenstücke in kreisförmigen Feldern und wahlweise als ganze oder halbe Parzelle zu haben, in letzterem Fall also noch mal „durchgeschnitten“. Zur Veranschaulichung ein Detailausschnitt aus der Software: Braun sind ganze Parzellen, grün Teilparzellen, weiß noch unbelegt, und das herausgestellte Tortenstück gehört dem Kunden, der aktuell bearbeitet wird. Mehr kann ich mangels anonymisierter Daten leider nicht zeigen:

bgKreis

Zu Saisonbeginn gibt es für die Gärtner kleine laminierte Kärtchen am Rand der Parzellen, damit Klarheit herrscht, wem welche gehört. Diese – bzw. den CSV-Export für die vorhandenen Layoutdateien – galt es zu erstellen. Naheliegend, dass die kommaseparierte Datei nach Möglichkeit in Kreis- und Parzellenreihenfolge vorsortiert sein sollte.

Es mag gut möglich sein, dass man die Sortierung mit einer ungemein komplexen SQL-Query auch der Datenbank anvertrauen könnte. Das drohte bei mir aber zur Gehirnzellenentzündung zu führen, denn ein Kunde kann theoretisch mehrere Parzellen in einer Bestellung oder auch in mehreren Bestellungen haben – ergo alles andere als trivial abzufragen, da die Datenbank selbstverfreilich relational diverse Tabellen bedient.

Viel einfacher erschien es mir, erst einmal die Daten auszulesen und dann zu sortieren. Und damit nun endlich zum Kern des Pudels, ähm, Gartens: Wie sortiert man so etwas elegant und schnell?

Ich habe dafür eine kleine Klasse angelegt:

KartenCSV

KartenCSV nimmt im Constructor einfach nur die Properties entgegen, die aus der Datenbank in bunter Reihenfolge eintrudeln, und schreibt sie in die oben angezeigten Properties. Die Instanz von KartenCSV wird dann einem Array

Karten() As KartenCSV

mittels

Karten.Append New KartenCSV (Vorname, Nachname etc.)

angehängt.

Bin ich damit fertig (es wird jeweils nur ein Standort ausgelesen), folgt im Programm der Befehl

Karten.Sort (addressof KartenCSV.KartenCSVCompare)

Die Sortierfunktion mittels eines Delegates gibt es seit Xojo 2015r3. So ein Sortier-Delegate (sprich: Methode, die mittels AddressOf definiert wird) benötigt immer zwei Werte der entsprechenden Klasse und muss einen Integer ausgeben. Dieser ist 1, wenn Wert1 größer als Wert2 ist; -1 im umgekehrten Fall und bei Gleichheit 0.

Im Detail:

Public Shared Function KartenCSVCompare(value1 as KartenCSV, value2 as KartenCSV) as Integer
 if value1.Kreis > value2.Kreis then return 1
 if value1.Kreis < value2.kreis then return -1
 if value1.Parzelle > value2.Parzelle then return 1
 if value1.Parzelle < value2.Parzelle then return -1
 if value1.Subparzelle > value2.Subparzelle then return 1
 if value1.Subparzelle < value2.Subparzelle then return -1
 return 0
End Function

Ich mach’s mir also einfach: Keine komplizierte If-EndIf-Struktur. Die Funktion kehrt sofort zurück, wenn sie ein Ergebnis bestimmen konnte, und wenn nicht, arbeitet sie sich weiter die Code-Hierarchie herab. Ist also der Kreis derselbe, dann erst wird auf die Parzelle geschaut, und hat auch die dieselbe Nummer, erst dann wird die Subparzelle (die auf A, B oder AB lauten kann) geprüft.

Das ganze funktioniert blitzschnell und ist nun wirklich um Längen bequemer als die Code-Wüste, die man ansonsten erzeugen müsste. Danach schreibe ich nur noch in Reihenfolge des nunmehr sortierten Karten-Arrays die Werte in die Textdatei.

Sie sehen, es lohnt sich, hin und wieder in der Referenz nachzuschlagen und neue Funktionen zu entdecken, die altbekannte Klassen mächtig aufmotzen.

Und im übrigen: Wenn Sie wie ich viel zu viel Zeit am Rechner und damit in virtuellen Welten verbringen: Das Buddeln in der Erde ist eine wunderbar erdende Tätigkeit. Mal davon abgesehen, dass das selbstgepflegte Gemüse einfach um Längen besser schmeckt als selbst die beste (und ansonsten nicht zu verachtende) Demeter-Ware aus dem Biomarkt. Ich freu mich auf die Pflanz-Saison …

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s