Trick 56: Odnung im
Feld schaffen
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 für Code 1, ^M für 13,
^J für 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 || 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.