Puede declarar un registro que
redefine un área de memoria declarada por otro registro. Por ejemplo, puede escribir un bucle que
lee un área de datos después de otra de un archivo serie cuando la estructura de los datos
recibidos es distinta de una recuperación a la siguiente, como en el ejemplo siguiente:
Record RecordA type SerialRecord
{ fileName = "myFile" }
record_type char(1);
item1 char(20);
end
Record RecordB type BasicRecord
10 record_type char(1);
10 item2 bigint;
10 item3 decimal(7);
10 item4 char(8);
end
Program ProgramX type basicProgram
myRecordA RecordA;
myRecordB RecordB {redefines = "myRecordA"};
function main();
get myRecordA;
while (myRecordA not endOfFile)
if (myRecordA.record_type == "A")
myFunction01(myRecordA.item1);
else
myFunction02(myRecordB.item2, myRecordB.item3, myRecordB.item4);
end
get myRecordA;
end
end
end
En el bucle, la función actúa de la manera siguiente:
- En el primer campo del registro de entrada busca un código que identifica cómo están
estructurados el resto de los datos.
- Procesa los otros campos de los datos recuperados utilizando el registro de entrada o un
segundo registro básico. El segundo registro hace referencia a la misma área de memoria que el
registro de entrada, pero la estructura es diferente.
Para declarar un registro como una redefinición de otro, puede utilizar la propiedad
redefines, que acepta un serie que identifica otro registro. Esta propiedad solo está
disponible en una declaración de registro, no en una definición de componente de registro.
El registro original y el de recubrimiento pueden ser cualesquiera tipos de registro fijo, con
las instrucciones siguientes:
- Los registros deben estar en el mismo ámbito. Si un registro se declara como un campo o un
registro no fijo, por ejemplo, el otro registro debe declararse como un campo en el mismo registro
no fijo. Igualmente, si un registro se declara en una biblioteca pero fuera de una función, el otro
debe declararse en la misma biblioteca pero fuera de una función.
- El registro de recubrimiento debe tener la misma longitud o ser más corto que el registro
original. Esta restricción evita que el código acceda a un área del registro de recubrimiento que
no esté en el área de memoria que se está redefiniendo.
- La utilización de un registro SQL (o de cualquier registro que sea anulable) debe tener en
cuenta los bytes ocultos descritos en el apartado Interiores de registros SQL.
Un registro de recubrimiento no tiene ninguna información (que no sea la estructura) que esté en
el registro original. Un registro indexado puede redefinir un registro serie, por ejemplo, pero el
archivo al que accede el registro indexado se identifica en el componente del registro indexado y
no en el componente del registro serie.