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