[Allegro] Trick 56: Ordnung im Feld
Bernhard Eversberg
ev at biblio.tu-bs.de
Do Sep 6 08:25:30 CEST 2007
Trick 56: Datenfeld intern sortieren
Aufgabe: Schnell mal eben die in #31 stehenden Schlagwörter
alphabetisch ordnen.
Warum: Manche Felder werden mit mehreren gleichartigen Inhalten
gefüllt, mitunter werden es recht viele. Wenn sich z.B.
50 Schlagwörter in #31 angesammelt haben, ist ein Sortieren
sinnvoll, um etwa Doppeleinträge leichter zu entdecken. Bei
der Anzeige des Titelsatzes macht es sich auch besser, wenn
die Schlagwörter nicht total ungeordnet erscheinen.
Lösung: Bis V27.5 war das eine echt schwierige Aufgabe und wurde
kaum jemals angepackt. Ab V27.6 ist es leicht, weil es den
neuen FLEX-Befehl "sort" gibt. Ganz ohne Trick kommt man aber
auch hier nicht aus...
So sieht der Kern eines FLEXes aus, der die Aufgabe löst:
var #31 "; ||"
ins _; _^M^J_
sort
ins _^M^J_; _
var (e"; ||")
ins #31
Und der Kenner erkennt: Im lokalen Ersetzungsbefehl ins _.._.._
können jetzt Steuerzeichen vorkommen! ^A fuer Code 1, ^M fuer 13,
^J fuer 10 usw. usf. Der Befehl "sort" braucht die Steuerzeichen
13 10 (= Zeilenvorschub) als Trenner zwischen den zu ordnenden
Elementen, denn beim Ordnen von Textdateien sind das Zeilen.
Deshalb wird der Trenner "; " zuerst durch 13 10 ersetzt, nach
dem "sort" dann wieder retour.
Aber wozu das "; ||"? Das ist der wahre ExpertenTrick.
Ohne es würde hinterher dem letzten Schlagwort, wenn es dann
plötzlich in der Mitte auftaucht, die Trennung "; " zum nächsten
fehlen! Wenn am Ende "; ||" steht, dann wirkt dies wie ein
weiteres Schlagwort, aber es bleibt beim Ordnen am Ende, weil
|| auf jeden Fall hinter allem kommt, was mit z beginnt.
Wie man's macht, wenn es nicht #31 ist und/oder wenn die
Trennung nicht "; " ist, das wird jeder leicht erkennen.
Auch der Einbau in die gewöhnliche Schleife zum Abarbeiten
einer Erg.Menge oder gar der Gesamtbank ist Routine.
Aber wäre nicht ein Unterprogramm das Beste, das einem die
Arbeit abnimmt, d.h. dem man nur die Kategorienummer übergibt und
dann macht es den Rest alleine? Gute Idee. So könnte das aussehen:
Das ist der Aufruf: (statt #31s die gewünschte Nummer)
var "#31s"
perf fsort
...
end
Und das ist das Unterprogramm:
(in der iV steht die übergebene Kategorienummer)
:fsort
ins $katnr
var
var +"; ||"
ins _; _^M^J_
sort
ins _^M^J_; _
var (e"; ||")
ins $inhalt
var $katnr " " $inhalt
ins
return
Tip: Wer das schrittweise analysieren und verstehen will, setzt sich
mes-Befehle dazwischen und sieht dann, was in dem Moment in der iV
steht. Der entscheidende Trick ist das 'ins' in der zweitletzten
Zeile. In der iV steht in dem Moment die übergebene Feldnummer (hier
die #31s) und in $inhalt steht der neue (geordnete) Feldinhalt,
zusammen ergibt das also ein komplettes Datenfeld. Das 'ins' ordnet es
nur noch in den Datensatz ein.
Mehr Informationen über die Mailingliste Allegro