Trick 39:  Dopplung mit Doppeltrick
              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 nächste 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