4D v16.3

Conjuntos

Inicio

 
4D v16.3
Conjuntos

Conjuntos  


 

 

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.

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á ordenado, los 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ónSelección actualConjuntos
Número por tabla1ilimitado
OrdenableNo
Puede guardarse en discoNo
RAM por registro (en bytes)Número de registros selec.* 4Número total de registros/8
CombinableNo
Contiene registro actualSí, 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.

Puede utilizar tres tipos de conjuntos:

  • Conjuntos proceso: un conjunto proceso sólo es accesible por el proceso en el cual fue creado. LockedSet es un conjunto 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 la máquina donde fue creado (cliente o servidor).
    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 ($), excepto para el conjunto sistema UserSet. A diferencia de otros tipos de conjuntos, un conjunto local/cliente se almacena en el equipo cliente.

Notas:

  • El tamaño máximo de un nombre de conjunto es de 255 caracteres (excluyendo <> y los símbolos $).
  • Para mayor información sobre la utilización de conjuntos en modo cliente/servidor, consulte la sección 4D Server, conjuntos y selecciones temporales del Manual 4D Server.

La siguiente tabla indica los principios de visibilidad de los conjuntos en función de su alcance y de dónde fueron creados:

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ó.

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.

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. Para mayor información, por favor consulte las descripciones de estos comandos como también la sección 4D Server, conjuntos y selecciones temporales del manual 4D Server.

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.
 FORM SET OUTPUT([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

Los comandos APPLY TO SELECTION, DELETE SELECTION, ARRAY TO SELECTION y JSON TO SELECTION crean un conjunto sistema llamado LockedSet cuando se utilizan en un entorno multiproceso.
Los comandos de búsqueda crean igualmente un conjunto sistema LockedSet cuando encuentran registros bloqueados en el contexto de "búsqueda y bloqueo" (ver el comando SET QUERY AND LOCK).
LockedSet indica cuáles registros fueron bloqueados durante la ejecución del comando.



Ver también 

Convenciones

 
PROPIEDADES 

Producto: 4D
Tema: Conjuntos

 
HISTORIA 

 
ARTICLE USAGE

Manual de lenguaje 4D ( 4D v16)
Manual de lenguaje 4D ( 4D v16.1)
Manual de lenguaje 4D ( 4D v16.2)
Manual de lenguaje 4D ( 4D v16.3)