[Allegro] Trick 39: Dopplung mit Doppeltrick

Bernhard Eversberg ev at biblio.tu-bs.de
Fr Feb 9 09:21:21 CET 2007


Trick 39: Erg.Menge bzw. Gesamtbank verdoppeln

Aufgabe: Die Sätze der aktuellen Erg.Menge schnell mal eben duplizieren
Erweiterte Aufgabe: Alle Sätze duplizieren.

Warum? Vielleicht braucht man ja gelegentlich mal Kopien von
        bestimmten Sätzen und will sie nicht alle einzeln von
        Hand verdoppeln.
        Auch wenn das nicht der Fall ist, kann man doch aus diesem
        Problem was lernen, und wenn's nur ist, daß nichts wirklich
        GANZ einfach ist... (OK, das wußten Sie schon)

Lösung:
Das Kopieren eines Satzes wird nicht mit  copy  gemacht, denn
dabei entsteht ein irritierendes Flackern, weil jeder kopierte
Satz erst einmal angezeigt wird - das brauchen wir in diesem
Fall ja nicht, und es kostet mehr Zeit. Es wird vielmehr Gebrauch
gemacht von der neuen (ab V27.1) Spezialvariablen kn. Das ist der
eigentliche Trick.
Noch ein Trick: Den Befehl "put" weglassen, dann hat man die Duplikate
erst mal nur im OfflineSpeicher. Mit "erase off" wird man sie
dann wieder folgenlos los...
Hier der komplette FLEX. Kopieren Sie ihn in eine Datei
ergdopp.flx, bei Bedarf zu starten mit  X ergdopp

----------------------------------------------------------------------
   ERGDOPP.FLX : Verdopplung der Erg.Menge
   20070209

if empty mes Keine Erg.Menge;end

set e0   // EditorFehlermeldungen verhindern
first

:loop
   Satz als Ganzes in iV kopieren
var kn
   leeren Neusatz anlegen
new 0
   iV einspeisen - d.h. Satz kopieren
insert
   Falls hierarchischer Satz: auf Hauptsatz schalten
first sub
   Feld #00 geeignet belegen (klappt nicht ohne "first sub"!)
#00 dopp?5
   Datumsfelder beseitigen
#99e
#99n
   Duplikat speichern (wenn man das 'put' wegläßt, werden die
     Sätze erst mal nur im OfflineSpeicher gestapelt)
put

next
if yes jump loop

:exit
set e1
------------------------------------------------------------------------

Und nun zur erweiterten Aufgabe. Im ersten Moment ist man versucht,
den obigen FLEX herzunehmen und einfach "first #" bzw. "next #" zu
schreiben. Damit hätte man ein anderes Problem gelöst: Die Datenbank so
aufblähen, daß sie die gesamte Platte füllt? Stimmt nicht, denn mit
next # kommt der naechste Satz, ausgehend von der momentanen Satznummer,
und die ist nach dem "put" die Nummer des gerade gespeicherten Satzes.
Aus demselben Grund geht es auch nicht mit last # / prev #! "Er" würde
pausenlos den letzten Satz kopieren.
Der Trick ist deshalb eine Schleife mit einem Zähler, ausgehend vom
letzten Satz bis runter zur Nummer 1. Dabei muß man nur achten auf die
gelöschten Sätze und die nicht besetzten Satznummern (wg. Entlüftung).
ABER: Wenn es am Anfang unbesetzte Nummern gibt, werden sie besetzt, und
beim Rückwärtszählen kommt dann eine dieser Nummern dran und ist
plötzlich besetzt, mit einer Kopie! Die würde nochmals kopiert, das muß
man verhindern. Der Trick ist, beim Speichern der Kopien eine IdNummer
zu verpassen, an der man erkennen kann, daß es ein kopierter Satz ist.

Andererseits könnte man auch hier das "put" erstmal weglassen! Mit
diesem Trick würde man die beschriebenen Probleme vermeiden. Am Ende
dann: "Datei / Offline-Speicher -> Datenbank".
In diesem Fall führt also mehr als ein Trick zum Ziel...

Der ausgetüftelte FLEX sähe insgesamt so aus:

   DBDOPP:FLX : Verdopplung der Datenbank
   20070209
yes Im Ernst?
if not yes end
set e0
last #
var i
z=
:loop
var "#" z
f1nd
   geloescht?
if del jump nxt
   unbesetzte Nummer?
if no jump nxt
var #00
   ist es ein verdoppelter Satz?
if "dopp" jump nxt
var kn
new 0
ins
first sub
   IdNr vorgeben setzen
#00 dopp?5
#99e
#99n
put
:nxt
z -1
   Zaehler zeigen
var z
sho iv
   Abbruch ermoeglichen
keychk
if yes end
if z>0 jump loop
:exit
set e1





Mehr Informationen über die Mailingliste Allegro