Record RecordA type SerialRecord
{ fileName = "myFile" }
record_type char(1);
field1 char(20);
end
Record RecordB type BasicRecord
10 record_type char(1);
10 field2 bigint;
10 field3 decimal(7);
10 field4 char(8);
end
Program ProgramX type basicProgram
myRecordA RecordA;
myRecordB RecordB {redefines = myRecordA};
function main();
get next myRecordA;
while (myRecordA not endOfFile)
if (myRecordA.record_type == "A")
myFunction01(myRecordA.field1);
else
myFunction02(myRecordB.field2, myRecordB.field3, myRecordB.field4);
end
get next myRecordA;
end
end
end
Um eine Datensatzvariable als Neudefinition einer anderen Datensatzvariablen zu deklarieren, müssen Sie die Eigenschaft 'redefines' verwenden. Die Eigenschaft akzeptiert den Namen einer anderen Datensatzvariablen. Diese Eigenschaft ist nur in einer Datensatzvariablendeklaration verfügbar, nicht jedoch in einer Datensatzabschnittsdefinition.
Record StructuredRecordA
10 x INT;
end
Record StructuredRecordB
10 y INT;
end
Record TestRecord
myRec1 StructuredRecordA;
myRec2 StructuredRecordB { redefines=myRec1};
end
Ebenso gilt: Wenn Sie einen Datensatz in einer Bibliothek, aber außerhalb einer Funktion deklarieren, müssen Sie auch
den zweiten Datensatz in derselben Bibliothek und ebenfalls außerhalb einer Funktion deklarieren.Die Eigenschaften, die Sie dem ursprünglichen Datensatz zuordnen, haben keine Auswirkungen auf den überschreibenden Datensatz. Es wird lediglich der Speicherbereich erneut definiert.
Es kann kein überschreibender Datensatz für Ein-/Ausgabe verwendet werden.
Record exampleRecord1
10 a INT;
20 aa INT;
20 ab CHAR(4) { redefines = a.aa };
10 b CHAR(4) { redefines = a };
end
Wenn Sie eine Variable auf der Basis von exampleRecord1 in einer Aufrufanweisung übergeben, werden die Daten des erneut definierten Bereichs so konvertiert, als würde es sich bei ihnen um INT und nicht um CHAR(4) handeln. Wenn Sie a.ab initialisieren (beispielsweise mithilfe der Anweisung 'set empty'), werden die Daten des erneut definierten Bereichs auf binäre Nullen und nicht auf Leerzeichen gesetzt.
Record exampleRecord2
10 a int;
20 x int;
10 b char(4) { redefines = a };
20 z char(4);
10 c char(4) { redefines = a };
end
Record exampleRecord3
10 a int[2];
10 b char(2) { redefines = a }; // Ungültig, da 'a' eine Feldgruppe ist
end
Record exampleRecord4
10 a bigint;
10 b char(1)[8] { redefines = a }; // Gültig
end
Record exampleRecord5
10 top char(4)[3];
20 a int;
20 b smallint { redefines = a }; // Gültig, obwohl 'a' eine Feldgruppe ist
end
Record exampleRecord6
10 top char(12)[5];
20 middle char(4)[3];
30 a int;
30 b smallint { redefines = a }; // Gültig, obwohl 'a' eine Feldgruppe ist
end
package com.companyb.customer;
Record RecC type basicRecord
10 dateFormat SMALLINT;
10 billingDate CHAR(8);
10 usBillingDate CHAR(8) {redefines=billingDate};
20 month CHAR(2);
20 day CHAR(2);
20 year CHAR(4);
10 euroBillingDate CHAR(8) {redefines=billingDate};
20 day CHAR(2);
20 month CHAR(2);
20 year CHAR(4);
10 deliveryDate CHAR(8);
10 usDeliveryDate CHAR(8) {redefines=deliveryDate};
20 month CHAR(2);
20 day CHAR(2);
20 year CHAR(4);
10 euroDeliveryDate CHAR(8) {redefines=deliveryDate};
20 day CHAR(2);
20 month CHAR(2);
20 year CHAR(4);
End
program RedefinesExample type BasicProgram (
inDateFormat SMALLINT,
inDeliveryMonth CHAR(2),
inDeliveryDay CHAR(2),
inDeliveryYear CHAR(4),
inBillingMonth CHAR(2),
inBillingDay CHAR(2),
inBillingYear CHAR(4))
{alias="REDXMP3"}
// 'aRec' ist ein strukturierter Datensatz, dessen Elemente 'billingDate' (Fakturierungsdatum) und 'deliveryDate' (Lieferdatum)
// jeweils durch zwei andere Elemente mit Unterstruktur erneut definiert werden,
// deren Ebene und übergeordnetes Element identisch sind.
aRec RecC;
const USDateFormat SMALLINT=1;
const EURODateFormat SMALLINT=2;
function main()
aRec.dateFormat = inDateFormat;
// Wenn US-amerikanisches Datumsformat verwendet werden soll
if ( inDateFormat == USDateFormat )
usBillingDate.month = inBillingMonth;
usBillingDate.day = inBillingDay;
usBillingDate.year = inBillingYear;
usDeliveryDate.month = inDeliveryMonth;
usDeliveryDate.day = inDeliveryDay;
usDeliveryDate.year = inDeliveryYear;
else // Datum muss im europäischen Format dargestellt werden
euroBillingDate.month = inBillingMonth;
euroBillingDate.day = inBillingDay;
euroBillingDate.year = inBillingYear;
euroDeliveryDate.month = inDeliveryMonth;
euroDeliveryDate.day = inDeliveryDay;
euroDeliveryDate.year = inDeliveryYear;
end
end
end