A menudo, las typedef identifican una agrupación abstracta. Por ejemplo, puede declarar un componente de registro llamado address y dividir dicha información en streetAddress1, streetAddress2 y city. Si un registro de personal incluye los elementos de estructura workAddress y homeAddress, cada uno de estos elementos de estructura puede señalar al formato del componente de registro llamado address. Esta utilización de typedef asegura que los formatos de dirección sean iguales.
Dentro del conjunto de normas descritas en esta página, puede señalar al formato de un componente al declarar otro componente o al declarar una variable.
Cuando declare un componente, no es necesario que utilice un componente como una typedef, pero quizás desee hacerlo, como en los ejemplos que se muestran más adelante. Tampoco es necesario que utilice una typedef cuando declare una variable que tiene las características de un elemento de datos; en su lugar, puede especificar todas las características de la variable, sin hacer referencia a un componente.
Una typedef siempre está en vigor cuando se declara una variable que es más compleja que un elemento de datos. Por ejemplo, si declara una variable llamada myRecord y señala al formato de un componente llamado myRecordPart, EGL crea un modelo de la variable declarada en dicho componente. Si, en cambio, señala al formato de un componente llamado myRecordPart02, la variable se llama myRecord pero tiene todas las características del componente llamado myRecordPart02.
La tabla y las secciones siguientes proporcionan detalles sobre las typedef en diferentes contextos.
Entrada que señala a una typedef | Tipo de componente al que la typedef puede hacer referencia |
---|---|
parámetro de función u otra variable de función | un componente de registro o componente dataItem |
parámetro de programa | componente dataItem, componente form, componente record |
variable de programa (no parámetro) | componente dataItem, componente record |
elemento de estructura | componente dataItem, componente record |
DataItem myPart CHAR(20) end Record myRecordPart type basicRecord 10 mySI myPart; // myPart actúa como una typedef 20 a CHAR(10); 20 b CHAR(10); end
Record myRecordPart type basicRecord 10 mySI CHAR(20); 20 a CHAR(10); 20 b CHAR(10); end
DataItem myPart HEX(20) end // NO válido porque mySI tiene un tipo primitivo // y señala al formato de un componente (a myPart, en este caso) Record myRecordPart type basicRecord 10 mySI CHAR(20) myPart; end
Cuando declare un elemento de estructura que señala al formato de otro componente, especifique si la typedef añade un nivel de jerarquía, como se ilustra más adelante.
Record address type basicRecord 10 streetAddress1 CHAR(30); 10 streetAddress2 CHAR(30); 10 city CHAR(20); end Record record1 type serialRecord { fileName = "myFile" } 10 person CHAR(30); 10 homeAddress address; end
El segundo componente de registro es equivalente a la siguiente declaración:
Record record1 type serialRecord { fileName = "myFile" } 10 person CHAR(30); 10 homeAddress; 20 streetAddress1 CHAR(30); 20 streetAddress2 CHAR(30); 20 city CHAR(20); end
Si un elemento de estructura utiliza la sintaxis anterior para señalar al formato de un componente de estructura, EGL añade un nivel jerárquico al componente de estructura que incluye el elemento de estructura. Por este motivo, la estructura interna del ejemplo anterior tiene una jerarquía de elementos de estructura, donde person está en un nivel distinto de streetAddress1.
Record address type basicRecord 10 streetAddress1 CHAR(30); 10 streetAddress2 CHAR(30); 10 city CHAR(20); end Record record1 type serialRecord { fileName = "myFile" } 10 person CHAR(30); 10 embed address; end
La estructura interna del componente de registro ahora es plana:
Record record1 type serialRecord { fileName = "myFile" } 10 person CHAR(30); 10 streetAddress1 CHAR(30); 10 streetAddress2 CHAR(30); 10 city CHAR(20); end
Record common type serialRecord { fileName = "mySerialFile" } 10 a BIN(10); 10 b CHAR(10); end Record recordA type indexedRecord { fileName = "myFile", keyItem = "a" } embed common; // acepta la estructura de common, // no las propiedades end Record recordB type relativeRecord { fileName = "myOtherFile", keyItem = "a" } embed common; end
Los dos últimos componentes de registro son equivalentes a las siguientes declaraciones:
Record recordA type indexedRecord { fileName = "myFile", keyItem = "a" } 10 a BIN(10); 10 b CHAR(10); end Record recordB type relativeRecord { fileName = "myOtherFile", keyItem = "a" } 10 a BIN(10); 10 b CHAR(10); end
Record address type basicRecord 10 streetAddress1 CHAR(30); 10 streetAddress2 CHAR(30); 10 city CHAR(20); end Record record1 type serialRecord { fileName = "myFile" } 10 person CHAR(30); 10 homeAddress address; 10 workAddress address; end
El componente de registro es equivalente a la siguiente declaración:
Record record1 type serialRecord { fileName = "myFile" } 10 person CHAR(30); 10 homeAddress; 20 streetAddress1 CHAR(30); 20 streetAddress2 CHAR(30); 20 city CHAR(20); 10 workAddress; 20 streetAddress1 CHAR(30); 20 streetAddress2 CHAR(30); 20 city CHAR(20); end
Record myTypedef type basicRecord 10 next01 HEX(20); 10 next02 HEX(20); end // no válido porque myFirst tiene un // tipo primitivo y señala al formato de un componente Record myStruct02 type serialRecord { fileName = "myFile" } 10 myFirst HEX(40) myTypedef; end
Record myTypedef type basicRecord 10 next01 HEX(20); 10 next02 HEX(20); end Record myStruct02 type basicRecord 10 myFirst myTypedef; end
Record myStruct02 type basicRecord 10 myFirst; 20 next01 HEX(20); 20 next02 HEX(20); end
El tipo primitivo de cualquier elemento de estructura que tenga elementos de estructura subordinados es CHAR por omisión, y la longitud de dicho elemento de estructura es el número de bytes representado por los elementos de estructura subordinados, independientemente de los tipos primitivos de dichos elementos de estructura. Para obtener información detallada, consulte la sección Estructura.
Sólo puede utilizar un componente de formulario como una typedef cuando declare un parámetro de programa.
Conceptos relacionados
Componente dataItem
Componente de formulario
Introducción a EGL
Componentes de registro
Estructura fija
Tareas relacionadas
Crear un componente de programa de EGL
Consulta relacionada
Sentencias EGL
Diseño interno de los registros SQL