versión 11 (Modificado)
Los conjuntos son una forma poderosa y rápida de manipular selecciones de registros. Además de la posibilidad de crear conjuntos, asociarlos a la selección actual, guardarlos, cargarlos y borrarlos, 4D permite realizar tres operaciones estándar de conjuntos:
Intersección
Unión
Diferencia.
Conjuntos y selección actual
Un conjunto es una representación de una selección de registros. La idea de conjuntos está íntimamente ligada a la idea de selección actual. Los conjuntos generalmente se utilizan por las siguientes razones:
Para guardar y luego restaurar una selección cuando el orden no tiene importancia
Para acceder a la selección que el usuario realiza en pantalla (el conjunto UserSet)
Para realizar una operación lógica entre las selecciones.
La selección actual es una lista de referencias que apuntan a cada registro actualmente seleccionado. La lista existe en memoria. Sólo los registros seleccionados están en la lista. Una selección no contiene realmente los registros, sólo una lista de referencias a los registros. Cada referencia a un registro utiliza 4 bytes en memoria. Cuando usted trabaja sobre una tabla, siempre trabaja con los registros en la selección actual. Cuando una selección está ordenada, sólo la lista de referencias se reorganiza. Sólo hay una selección actual para cada tabla en un proceso.
Como una selección actual, un conjunto representa una selección de registros. Un conjunto utiliza una representación muy compacta para cada registro. Cada registro está representado por un bit (un octavo de byte). Las operaciones que utilizan conjuntos son muy rápidas, porque los computadores pueden realizar muy rápidamente operaciones sobre bits. Un conjunto contiene un bit por cada registro de la tabla, sin importar si el registro está incluido o no en el conjunto. De hecho, cada bit es igual a 1 o 0, dependiendo de si el registro está en el conjunto o no.
Los conjuntos son muy económicos en términos de memoria RAM. El tamaño de un conjunto, en bytes, siempre es igual al número total de registros en la tabla dividido por 8. Por ejemplo, si crea un conjunto para una tabla que contiene 10 000 registros, el conjunto toma 1 250 bytes, aproximadamente 1.2K en RAM.
Pueden existir varios conjuntos para cada tabla. De hecho, los conjuntos pueden guardarse en el disco independientemente de la base. Para cambiar un registro que pertenece a un conjunto, primero debe utilizar el conjunto como selección actual, luego modificar el registro.
Un conjunto nunca está ordenadolos registros simplemente son marcados como que pertenecen al conjunto o no. Por el contrario, una selección temporal está ordenada, pero requiere más memoria en la mayoría de los caso. Para mayor información sobre selecciones temporales, consulte la sección Selecciones temporales.
En el momento de su creación, un conjunto "recuerda" el registro actual de la selección. La siguiente tabla compara los conceptos de la selección actual y de los conjuntos:
Comparación | Selección actual | Conjuntos |
Número por tabla | 1 | ilimitado |
Ordenable | Sí | No |
Puede guardarse en disco | No | Sí |
RAM por registro (en bytes) | Número de | Número total de registros/8 |
registros selec. * 4 | ||
Combinable | No | Sí |
Contiene registro actual | Sí | Sí, como el del momento de la creación |
El conjunto pertenece a la tabla en la cual se ha creado. Las operaciones sobre conjuntos sólo pueden realizarse entre los conjuntos que pertenecen a la misma tabla.
Los conjuntos son independientes de los datos, esto significa que después de realizar modificaciones a una tabla, un conjunto podría no ser exacto. Hay muchas operaciones que pueden hacer que un conjunto no sea exacto. Por ejemplo, si crea un conjunto de todos los habitantes de Madrid y cambia los datos de uno de los registros por Barcelona, el conjunto no cambia, porque el conjunto es simplemente la representación de una selección de registros. La eliminación y el remplazo de registros también pueden volver el conjunto obsoleto, al igual que la compactación de datos. La exactitud de los conjuntos sólo se puede garantizar si los datos de la selección original no han cambiado.
Conjuntos proceso e interproceso
Puede utilizar tres tipos de conjuntos:
Conjuntos proceso: Un conjunto proceso sólo es accesible por el proceso en el cual fue creado. UserSet y LockedSet son conjuntos proceso. Los conjuntos proceso se borran tan pronto como el método de proceso termina. Los conjuntos proceso no necesitan un prefijo especial en el nombre.
Conjuntos interproceso: Un conjunto es interproceso si el nombre del conjunto está precedido por los símbolos (<>) un signo "menor que" seguido por un signo "mayor que".
Nota: Esta sintaxis puede utilizarse en Windows y Macintosh. Igualmente, en Macintosh, puede utilizar el diamante (Opción-Mayús-V).
Un conjunto interproceso es "visible" para todos los procesos de la base.
En modo cliente/servidor, un conjunto interproceso es "visible" para todos los procesos de todos los clientes, como también para los procesos servidor (procedimientos almacenados).
El nombre de un conjunto interproceso debe ser único en la base.
Conjuntos locales/cliente: Los conjuntos locales/cliente son principalmente para uso en modo cliente/servidor. El nombre de los conjuntos local/cliente está precedido por el signo dólar ($). A diferencia de otros tipos de conjuntos, un conjunto local/cliente se almacena en el equipo cliente.
Nota: Para mayor información sobre la utilización de conjuntos en modo cliente/servidor, consulte la sección 4D Server y conjuntos en el Manual de 4D Server.
Visibilidad de Conjuntos
La siguiente tabla indica los principios de visibilidad de los conjuntos en función de su alcance y de dónde fueron creados:
Conjuntos y transacciones
Un conjunto puede ser creado al interior de una transacción. Es posible crear un conjunto de registro creados dentro de una transacción y un conjunto de registros creados o modificados fuera de la transacción. Cuando la transacción termina, debe borrarse el conjunto creado durante la transacción, porque podría no ser una representación exacta de los registros, especialmente si la transacción se canceló.
Ejemplo de conjuntos
El siguiente ejemplo borra los registros duplicados de una tabla que contiene información de personas. Un bucle For...End for pasa por todos los registros, comparando el registro actual con el registro anterior. Si el nombre, dirección, y código postal son iguales, el registro se añade a un conjunto. Al final del bucle, el conjunto se convierte en la selección actual y la selección actual anterior se borra:
CREATE EMPTY SET([Personas];"Duplicados") ` Crear un conjunto vacío para los registros duplicados ALL RECORDS([Personas]) ` Seleccione todos los registros ` Ordenar los registros por código postal, dirección y nombre ` de manera que los duplicados estén juntos ORDER BY ([Personas];[Personas]CodigoPostal;>;[Personas]Direccion;>;[Personas]Nombre;>) ` Inicializar las variables que conservan los campos del registro anterior $Nombre:=[Personas]Nombre $Direccion:=[Personas]Direccion $CodigoPostal:=[Personas]CodigoPostal ` Ir al segundo registro para compararlo con el primero NEXT RECORD ([Personas]) For ($i; 2; Records in table ([Personas])) ` Bucle por los registros a partir de 2 ` Si el nombre, dirección y código postal son los mismos ` del registro anterior, es un registro duplicado. If (([Personas]Nombre=$Nombre) & ([Personas]Direccion=$Direccion) & ([Personas]CodigoPostal=$CodigoPostal)) ` Añadir registro actual (el duplicado) al conjunto ADD TO SET ([Personas]; "Duplicados") Else ` Guardar el nombre, dirección y código postal de este registro para compararlo con el siguiente $Nombre:=[Personas]Nombre $Direccion:=[Personas]Direccion $CodigoPostal:=[Personas]CodigoPostal End if ` Pasar al siguiente registro NEXT RECORD ([Personas]) End for ` Utilizar los registros duplicados encontrados USE SET ("Duplicados") ` Borra los registros duplicados DELETE SELECTION ([Personas]) ` Eliminar el conjunto de la memoria CLEAR SET ("Duplicados")
En lugar de borrar inmediatamente los registros al final del método, puede mostrarlos en pantalla o imprimirlos, de manera que pueda realizar una comparación más detallada.
Conjunto sistema UserSet
4D administra un conjunto sistema llamado UserSet, el cual guarda automáticamente las selecciones de registros más recientes realizadas por el usuario en pantalla. De esta forma, puede mostrar un grupo de registros con MODIFY SELECTION o DISPLAY SELECTION, pedirle al usuario seleccionar algunos y devolver el resultado de esta selección manual en un conjunto.
4D Server: Aunque su nombre no comienza con el carácter "$", el conjunto sistema UserSet es un conjunto cliente. De manera que cuando utilice INTERSECTION, UNION y DIFFERENCE, asegúrese de comparar UserSet únicamente con otros conjuntos clientes.
Sólo hay un UserSet por proceso. Cada tabla no tiene su propio UserSet. UserSet se asocia a una tabla sólo cuando se muestra una selección de registros para la tabla.
4D administra el conjunto UserSet para los formularios listados mostrados en modo Diseño o utilizando los comandos MODIFY SELECTION o DISPLAY SELECTION. Sin embargo, este mecanismo no está activo para subformularios.
El siguiente método ilustra cómo mostrar registros para permitir al usuario seleccionar algunos registros, y luego utiliza UserSet para mostrar los registros seleccionados:
` Mostrar todos los registros y permitir al usuario seleccionar algunos de ellos. ` Luego muestre esta selección utilizando UserSet para cambiar la selección actual. OUTPUT FORM ([Personas]; "Mostrar") ` Definir el formulario de salida ALL RECORDS ([Personas]) ` Selección de todas las personas ALERT ("Presione Ctrl o Comando y haga clic para seleccionar los registros.") DISPLAY SELECTION ([Personas]) ` Mostrar las personas USE SET ("UserSet") ` Utiliza las personas seleccionadas ALERT ("Usted eligió las siguientes personas.") DISPLAY SELECTION ([Personas]) ` Mostrar las personas seleccionadas
Conjunto sistema LockedSet
Los comandos APPLY TO SELECTION, ARRAY TO SELECTION y DELETE SELECTION crean un conjunto sistema llamado LockedSet cuando se utilizan en un entorno multiproceso. LockedSet indica cuáles registros fueron bloqueados durante la ejecución del comando.
Ver también