[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