Mit Format 2 der Anweisung @COMPARE können die Inhalte zweier Arbeitsdateien zeilenweise verglichen werden. Das Vergleichsergebnis legt der EDT in einer Arbeitsdatei ab. Diese wird vor dem Ablegen des Ergebnisses gelöscht. Wahlweise ist auch eine Ausgabe des Ergebnisses nach SYSLST
, im L-Modus auch nach SYSOUT
möglich.
Operation | Operanden | F-Modus / L-Modus |
@COMPARE | { [procnr1] WITH procnr2 | procnr1 } [LIST [procnr3] ] [,procnr4] |
procnr1 | Nummer der Arbeitsdatei, die verglichen werden soll. Ist |
procnr2 | Nummer der Arbeitsdatei, mit der verglichen wird. Ist |
LIST | Bei Angabe von Ist |
procnr3 | Arbeitsdatei, in der das detaillierte Vergleichsergebnis abgelegt wird, falls Die Arbeitsdatei wird vor der Verwendung gelöscht. War eine Datei in dieser |
procnr4 | Die Angabe einer Arbeitsdatei als Hilfsdatei wird nur noch aus Kompatibilitätsgründen |
Die Arbeitsdateien procnr1
und procnr2
müssen voneinander verschieden sein, andernfalls wird die @COMPARE-Anweisung mit der Meldung EDT5499
abgewiesen. Die Arbeitsdatei procnr3
kann mit procnr1
oder procnr2
identisch sein, man bekommt dann aber kein detailliertes Ergebnis (siehe unten).
Sind alle zu vergleichenden Zeilen gleich bzw. ungleich, wird nur die Meldung EDT0291
bzw. EDT0290
ausgegeben. Ein detailliertes Vergleichsergebnis wird in diesem Fall nicht ausgegeben.
Muss ein detailliertes Ergebnis nach procnr3
ausgegeben werden, wird nach Ende des Vergleichs die Meldung EDT0297
ausgegeben. Ist in diesem Fall eine der beiden Vergleichsdateien die Arbeitsdatei, in der das Ergebnis stehen soll, wird die Meldung EDT5350
ausgegeben, die Ausgabe des detaillierten Vergleichsergebnisses unterbleibt dann.
Ist eine der Vergleichsdateien die Arbeitsdatei 0, darf keine ISAM-Datei durch @OPEN (Format 2) real geöffnet sein, andernfalls wird die @COMPARE-Anweisung mit der Meldung EDT4935
abgewiesen.
Um in EDT-Prozeduren das Vergleichsergebnis abfragen zu können, wird zusätzlich zu den Meldungen EDT0290
und EDT0297
der EDT-Fehlerschalter gesetzt der mit der @IF-Anweisung abgefragt werden kann (siehe @IF-Anweisung):
EDT-Fehlerschalter | Arbeitsdatei | |
EDT0291 | nicht | leer |
EDT0290 | gesetzt | leer |
EDT0297 | gesetzt | nicht |
Wenn alle aufgeführten Fälle unterschieden werden sollen, muss vor dem Vergleichen mit @COMPARE sowohl der EDT-Fehlerschalter mit @RESET zurückgesetzt als auch die Arbeitsdatei procnr3
gelöscht werden.
Der EDT codiert vor dem Vergleich jede Zeile intern nach UTF16
um und vergleicht die entstandenen Zeilen als Bytefolge. Die Zeilen sind gleich, wenn sowohl Zeileninhalt wie Zeilenlänge dieser Bytefolge gleich sind. Die Zeilennummern werden beim Datenvergleich nicht berücksichtigt. Wenn beide Arbeitsdateien im gleichen Zeichensatz vorliegen, ist dieses Verfahren äquivalent zu einem byteweisen Vergleich der Originalzeilen.
Die Ausgabe des Vergleichsergebnisses muss ggf. in einen geeigneten Zeichensatz umcodiert werden. Bei Ausgabe nach SYSOUT
oder SYSLST
ist dies der Zeichensatz, der für SYSOUT
bzw. SYSLST
eingestellt ist. Bei Ausgabe in eine Arbeitsdatei ist dies der Zeichensatz der verglichenen Arbeitsdateien. Haben diese unterschiedliche Zeichensätze, erfolgt die Ausgabe im Zeichensatz UTFE
.
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.
Das Format der Ausgabe ist für die Ausgabe in eine Arbeitsdatei bzw. nach SYSLST
oder SYSOUT
identisch:
LINE#( 1) FILENAME: DAT.270104 LINE#( 0) FILENAME: VERGL.1
Es wird eine Überschriftenzeile ausgegeben, in der die Spalten, die den verglichenen Arbeitsdateien zugeordnet werden, mit LINE#
... und der Nummer der jeweiligen Arbeitsdatei (in Klammern) gekennzeichnet sind. Zusätzlich wird, sofern vorhanden, der Name einer geöffneten Datei bzw. eines geöffneten Bibliothekselements oder ein lokaler @FILE-Eintrag ausgegeben.
0007.10 KUNDE-100 SORT 0007.20 KUNDE-200 PERCON 0007.30 KUNDE-700 FDDRL 0010.00 $KUNDE-900 LMS 0010.00 $KUNDE-900 LMSCONV
Für Zeilen, die nur in einer Arbeitsdatei vorkommen, werden die Zeilennummern und der Inhalt der Sätze (ggf. um 17 Zeichen gekürzt) ausgegeben. Dabei gibt die Stellung der Zeilennummer in Spalte 1 oder in Spalte 2 unter der Überschrift LINE#
... an, in welcher der beiden Arbeitsdateien der Satz steht. Dies gilt sinngemäß auch für Sätze unterschiedlichen Inhalts. Diese kommen mit dem einen Inhalt nur in der ersten Arbeitsdatei vor, mit dem anderen Inhalt nur in der zweiten Arbeitsdatei und stehen dabei für gewöhnlich untereinander.
0008.00=0010.00
0018.00=0020.00
Für Zeilen gleichen Inhalts werden die identifizierten Zeilennummern in der Form 0001.00=0006.00
ausgegeben. Sind mehrere aufeinander folgende Sätze gleich (Bereich gleicher Sätze), wird nur das erste und letzte Zeilennummernpaar des Bereiches angegeben (Näheres siehe Beispiel).
Beispiel
Aus der Arbeitsdatei 2 wird in die Arbeitsdatei 1 gewechselt.
Arbeitsdatei 2 wird mit Arbeisdatei 1 verglichen und das Ergebnis in Arbeitsdatei 3 abgelegt. Anschließend wird in die Arbeitsdatei 3 gewechselt.
Das Vergleichsergebnis der Arbeitsdateien 1 und 2 ist in der Arbeitsdatei 3 abgelegt.