[Allegro] Trick 79 : Gezielter Rauswurf von Mehrfachfeldern und Lückenschluß
Bernhard Eversberg
ev at biblio.tu-bs.de
Fr Jun 5 12:25:52 CEST 2015
Trick 79 : Gezielter Rauswurf von Mehrfachfeldern
------------------------------------------------- 2015-06-05
Manchmal hat man einen Haufen Mehrfachfelder, von denen man einige
gelöscht hat oder löschen will, und man hätte die übriggebliebenen
danach gerne wieder lückenlos angeordnet. Wenn z.B. #313 entfallen ist,
soll #314, falls noch da, mitsamt aller nachfolgenden Felder so
umbenannt werden, daß aus #314 dann #313 wird, aus dem nächsten #314
usw. Besonders bei der HFM-Technik kann's passieren, daß man viele
unerwünschte Felder und Lücken beseitigen will, ordentlich wie man ist.
Ob das wohl geht? Ohne Tricks nicht, das ist klar.
Und am besten soll's auch auf eine Erg.Menge anwendbar sein, aber
das ist natürlich trickfrei möglich.
Einen kompletten FLEX für die nachfolgend beschriebene Aufgabe kann
man sich abholen mit
X getfile mfselect.flx
Nehmen wir mal als konkrete Aufgabe, aus einer Sequenz von #90er-
Kategorien alle die rauszunehmen, in denen das Standortsigel A9 steht,
also ein Unterfeld $L mit Inhalt A9. Die entstehenden Lücken (und auch
die evtl. bereits vorhandenen Lücken) sollen geschlossen werden durch
Zusammenschiebung der übriggebliebenen Felder.
Für diese Ausgabe sind 4 Tricks nötig:
1. Die #90er alle in eine Variable $vorher kopieren
2. Alle #90er aus dem Satz löschen
3. Die Variable $vorher durcharbeiten: Wenn $LA9 nicht vorkommt,
dann den Inhalt an eine Hilfsvariable $nachher anhängen
Dabei das Mehrfachzeichen ersetzen durch '~'
4. Den Inhalt von $nachher in einem Schwung in den Satz einkopieren,
wobei aus dem '~' das nächste Mehrfachzeichen wird, gemäß der
Angabe $M in der CFG bzw. in HFM-Weise, also .1, .2, .3, ...
Die Tricks sehen, der Reihe nach, so aus:
0. Zuerst ein Hilfsfeld, sagen wir #usi, belegen mit der Zeichenfolge,
nach der zu suchen ist: Im Beispiel könnte man setzen (oder eine
Abfrage vorschalten):
#usi LA9
Und wenn man's auf Ergebnismengen anwenden will:
first
:schleife
1. Die #90er alle in eine Variable $vorher kopieren
Hierfür könnte man an Trick 46 denken, es geht aber inzwischen
auch einfacher (wo steht's? h xcstring unter 3.):
var #90+
ins $vorher
dasselbe auch in eine Hilfsvar. $v
ins $v
In $vorher und in $v haben wir dann alle #90, getrennt durch den
Code 10 (als ^J zu schreiben) [s. h xcstring unter B. ]
Sodann wird $v nur für 2. gebraucht:
2. Alle #90er raus aus dem Satz
Eine Schleife: Aus $v werden die Feldnummern der Reihe nach
entnommen und das Feld jeweils gelöscht.
:loesch
var $v (0,4) bzw. (0,5), wenn das Schema 3stellig ist ...)
ins in iV steht "#90x" mit dem jeweiligen x,
und sonst nix, daher bewirkt "ins" die Löschung
var $v (b"^J") Das erste Feld von $v abschneiden
ins $v
if $v jump loesch Noch mehr? Dann dasselbe nochmal
3. Die Variable $vorher durcharbeiten, zutreffende Felder raus
Das ist der umfangreichste Teil.
:loop
ersten Teil von $vorher nehmen
var $vorher (e"^J")
ins $s
schauen, ob #usi drin vorkommt
var $s (b"#usi")
sonst ist iV leer, dann naechsten Teil
if "" jump nxt
kommt vor, dann den Inhalt verwenden, beginnt beim Zeichen 4
var $s (4,0)
ins $s
#90~ davor setzen, dann entsteht eine korrekte Reihenfolge der #90x
var "#90~" $s
an $nachher anhaengen, mit 13 10 getrennt
ins $s
var $nachher 13 10 $s
ins $nachher
naechste #90, wenn noch eine da ist
:nxt
var $vorher (b"^J")
ins $vorher
if $vorher jump loop
4. Den Inhalt von Variable $nachher in den Satz kopieren
Die neuen #90er sind jetzt in $nachher, getrennt durch 13 10.
Das ist ganz einfach.
($nachher beginnt aber mit 13 10, das muss weg:)
var $nachher (f"^J^M")
Dann das Ganze einfuegen in den Satz
ins
5. Und wenn man's auf Erg.Mengen anwenden will:
var ""
ins $nachher
next
if yes jump schleife
message Fertig!
Mehr Informationen über die Mailingliste Allegro