Mit der Anweisung @COPY werden Datensätze der aktuellen oder einer anderen Arbeitsdatei oder Inhalte von Zeichenfolgevariablen in die aktuelle Arbeitsdatei kopiert.
Der Zeilenbereich der Quell-Arbeitsdatei, der die zu kopierenden Datensätze enthält, bzw. der Bereich von Zeichenfolgevariablen wird der Einfachheit halber im Folgenden als Sendebereich bezeichnet. Der Zeilenbereich der aktuellen Arbeitsdatei, in den die Datensätze der Quell-Arbeitsdatei kopiert werden, wird als Empfangsbereich bezeichnet.
Operation | Operanden | F-Modus, L-Modus |
@COPY | { {lines [ (procnr) ] | svars } [TO { line1 [(inc)] [:] [line2] } [,...]] } [,...] |
lines | Zusammenhängender Zeilenbereich, der in die aktuelle Arbeitsdatei kopiert |
procnr | Nummer der Quell-Arbeitsdatei, aus der die Zeilen kopiert werden ( |
svars | Bereich von Zeichenfolgevariablen, deren Inhalte in die aktuelle Arbeitsdatei |
TO... | Mit den auf |
line1 | Nummer der ersten Zeile des Empfangsbereiches. |
inc | Schrittweite, aus der die auf |
: | Die Operanden |
line2 | Legt die größtmögliche Zeilennummer des Empfangsbereiches fest, bis zu Es findet somit kein Kopieren in Zeilen der aktuellen Arbeitsdatei statt, |
Mit der @COPY-Anweisung können mehrere Sendebereiche mit jeweils mehreren Empfangsbereichen durch Komma getrennt angegeben werden. Die Anzahl der Sende- und Empfangsbereiche ist nur durch die maximal erlaubte Länge einer EDT-Anweisung begrenzt.
Wenn sich der Sende- und der Empfangsbereich überlappen, wird der Sendebereich zeilenweise kopiert. Dies kann dazu führen, dass ein Datensatz zunächst in eine Zeile und anschließend wieder aus dieser Zeile kopiert wird, wenn diese sowohl im Sende- als auch im Empfangsbereich liegt. Auf diese Weise kann der Sendebereich bzw. Teile davon mehrfach in den Empfangsbereich kopiert werden.
Bereits in der aktuellen Arbeitsdatei existierende Zeilen mit gleichen Zeilennummern werden beim Kopieren überschrieben.
Wenn eine Zeile angelegt wird, deren Nummer größer als die bisherige höchste Zeilennummer ist, wird die aktuelle Zeilennummer verändert.
Ist die aktuelle Arbeitsdatei leer und hat sie den Zeichensatz *NONE
, dann erhält sie beim Kopieren den Zeichensatz der Quell-Arbeitsdatei bzw. der ersten angegebenen Zeichenfolgevariablen. Hat die aktuelle Arbeitsdatei einen Zeichensatz, dann werden die zu kopierenden Zeilen bzw. die Inhalte der Zeichenfolgevariablen in den Zeichensatz der aktuellen Arbeitsdatei konvertiert. Werden dabei Zeichen gefunden, die im Zeichensatz der Arbeitsdatei nicht darstellbar sind, werden diese durch ein Ersatzzeichen ersetzt, sofern ein solches spezifiziert ist (siehe @PAR SUBSTITUTION-CHARACTER), andernfalls wird die @COPY-Anweisung abgewiesen und die Fehlermeldung EDT5453
ausgegeben.
Wird die Anweisung mit [K2] unterbrochen und der EDT-Lauf mit /INFORM-PROGRAM
fortgesetzt, so wird die Bearbeitung der Anweisung abgebrochen und die Meldung EDT5501
ausgegeben.
Hinweis
Da es die obige Syntax erlaubt, den TO
-Operanden wegzulassen, ist es nicht immer möglich, eindeutig zwischen einem Empfangsbereich und einem nächsten
Sendebereich zu unterscheiden. In diesen Fällen entscheidet sich der EDT für die Interpretation als Empfangsbereich. So wird z.B. in der Eingabe
@COPY 2-3(1) TO 7,1(1)
die Angabe 1(1)
als zweiter Empfangsbereich interpretiert (die 1
in Klammern wird als Schrittweite interpretiert), während die Angabe 1(0)
an dieser Stelle als nächster
Sendebereich interpretiert worden wäre (die 0
kann keine Schrittweite sein und wird als Arbeitsdateinummer interpretiert). Will der Anwender in diesem Beispiel die Interpretation als Sendebereich erzwingen, könnte er z.B.
@COPY 2-3(1) TO 7,1-1(1)
eingeben, dann gibt es keine Mehrdeutigkeiten.
Beispiel 1
Mit den drei @COPY-Anweisungen sollen die Zeile 1 in die Zeile 7, die Zeile 2 in die Zeile 5 und der Zeilenbereich von Zeilennummer 1 bis 3 in den Zeilenbereich ab Zeile 30.1 mit der expliziten Schrittweite 5 kopiert werden.
Beispiel 2
Mit der @COPY-Anweisung können Zeilenbereiche vervielfacht werden, wenn sich Sende- und Empfangsbereich überlappen. Nachfolgend soll die erste Zeile vervielfacht werden.
Mit dieser Anweisung wird der Zeilenbereich von Zeilennummer 1 bis 2 in den Zeilenbereich ab Zeilennummer 1.5 mit der impliziten Schrittweite 0.1 kopiert.
Dabei kopiert der EDT zunächst die Zeile 1 in die Zeile 1.5. Diese Zeile liegt im angegebenen Sendebereich. Daher wird die Zeile 1.5 mit der impliziten Schrittweite 0.1 in die Zeile 1.6 kopiert. Entsprechend wird Zeile 1.6 in 1.7, ... , Zeile 1.9 in 2.0 (dabei wird der Inhalt der Zeile 2 überschrieben) und abschließend Zeile 2.0 in Zeile 2.1 kopiert.
Der Zeilenbereich 3 bis 5 soll in den Zeilenbereich von 4.1 bis 5 mit der impliziten Schrittweite 0.1 kopiert werden.
Dabei kopiert der EDT zunächst die Zeile 3 in die Zeile 4.1 und die Zeile 4 in die Zeile 4.2. Die beiden neu angelegten Zeilen liegen im angegebenen Sendebereich. Daher wird anschließend die Zeile 4.1 in die Zeile 4.3, die Zeile 4.2 in 4.4, ... , die Zeile 4.8 in 5.0 kopiert. Dabei wird der Inhalt der Zeile 5 überschrieben. Die Zeilen 4.9 und 5.0 werden nicht mehr kopiert, da die größtmögliche Zeilennummer des Empfangsbereiches bereits erreicht wurde.