4D v16

Conjuntos y selecciones temporales

Inicio

 
4D v16
Conjuntos y selecciones temporales

Conjuntos y selecciones temporales    


 

 

Además de las manipulaciones explicadas en el vídeo, también debe tener en cuenta que:

En términos de memoria:

  • una selección necesita 4 bytes por registro de la selección, independientemente del número de registros en la tabla (a diferencia de los conjuntos).
  • Un conjunto requiere un bit para cada registro en la tabla.
    Los conjuntos se componen de una serie de bits. Un conjunto contiene tantos bits como registros hay en la tabla. Cada bit de un conjunto corresponde a un informe rápido “incluido en la selección” o “no incluido” del enésimo registro de la tabla al momento en que se crea el conjunto.

La tabla a continuación resume las posibilidades de los conjuntos y de las selecciones temporales:

TemaConjuntoSelección temporal
Espacio en memoria para un registro1 bit4 bytes
Conservar la ordenaciónNo
Conservar el registro actualNo
ReuniónNo
IntersecciónNo
DiferenciaNo
Guardar en discoNo
Tamaño memoria de una selección de 10 registros de 20 00020 000 bits o 2500 bytes10 x 4 bytes = 40 bytes
AlcanceLocal, Proceso, InterprocesoProceso, Interproceso

Sólo es posible comparar conjuntos de la misma tabla.

Atención: el funcionamiento de un conjunto implica la utilización durante un tiempo limitado y eventualmente de semáforos (ver la documentación 4D para mayor información).

De hecho, un conjunto hace corresponder un bit a la posición física de cada registro de la tabla. En caso de eliminación y posterior adición de registros, el contenido anterior de un registro físico podría ser reemplazado por el nuevo contenido que ya no está en línea con lo que el conjunto se supone que representa.

Sea metódico en el uso de los conjuntos, que son una manera eficiente y rápida para comparar selecciones.

Para conservar una selección, hay una tercera solución que implica el uso de un array que contiene su identificación utilizando el comando SELECTION TO ARRAY.

Puede usar una cuarta solución utilizando los clusters almacenados, por ejemplo, en los BLOBs.

Evidentemente, cuando los conjuntos y las selecciones ya no son necesarias, usted puede liberar memoria borrándolos.

 CLEAR SET("SetName")
 CLEAR NAMED SELECTION("SelectionName")

En este vídeo, vamos a aprender cómo conservar una selección y a realizar funciones (unión, intersección, diferencia).

Los conjuntos son una forma sencilla de intersectar las listas de registros de una misma tabla.

Los conjuntos son una de las formas que puede utilizar para poner una selección en espera de modo que pueda utilizarse de nuevo más adelante.
Al realizar una operación en dos conjuntos, se obtiene un nuevo conjunto que contiene el resultado de la operación realizada (de acuerdo con la teoría de conjuntos convencional).

Vamos a aplicar estos principios de inmediato a la lista de intervenciones en el formulario de navegación. Podemos crear un juego de la selección actual.

Vamos a crear un botón que busque todas las intervenciones que se iniciaron antes de las 9:00 a.m.

Aquí está el método del botón:

 QUERY([Interventions];[Interventions]Intervention_Time

y vamos a crear un segundo botón que nos dará todas las intervenciones que no se han realizado al 100%. Podemos programar este botón así:

 QUERY([Interventions];[Interventions]Progress<100)

Por el momento, en el archivo que importamos, el % de avance no se especifica.

Así que primero vamos a aplicar una fórmula en todas las intervenciones. Aquí tenemos una selección de 11,732 intervenciones en las que vamos a aplicar una fórmula y especificar que:

  • el avance es igual al valor de redondeado (devuelto por Round) del resto (calculatado con Mod) de Random (que devuelve un valor de 0 a 32,767), el Mod por 100 redondeado a la décima más cercana.

Si ahora hacemos un informe para comprobar lo que los valores de % de avance se han llenado, vemos que van de 0 a 100.

Por supuesto, si hacemos clic en el primer botón y luego en el segundo, habremos perdido la selección creada durante el primer clic.
Así que en el primer botón, puede ser útil, después de la búsqueda, conservar la información en un conjunto que podemos llamar "Morning_Interventions".

 CREATE SET([Interventions];"Morning_Interventions")

Igualmente, aquí, luego de recuperar el conjunto de las intervenciones que no han terminado, llamamos este conjunto "Interventions_in_progress".

 CREATE SET([Interventions];"Interventions_in_progress")

Entonces podemos comparar los conjuntos:

  • ya sea añadiéndolos para obtener el conjunto de las intervenciones de la mañana + las intervenciones en curso.
    Duplicamos el botón e indicamos que se trata de las intervenciones antes de las 9:00 am + los proyectos en curso;
    Luego escribimos
     UNION("Morning_Interventions";"Interventions_in_progress";"Interventions_Result")

    en un tercer conjunto llamado Interventions_Result para no sobrescribir los dos primeros conjuntos.
  • Si queremos las intervenciones de la mañana que todavía están en progreso, tenemos que comparar la parte común de ambos conjuntos, de modo que tenemos todas las intervenciones de la mañana que aún están en marcha. En este caso, el comando a utilizar no es  UNION, si no INTERSECTION.
  • Y si queremos obtener las intervenciones terminadas, tenemos que aplicar DIFFERENCE a los 2 conjuntos: todas las intervenciones de la mañana menos las intervenciones aún en curso nos dará el conjunto resultante.

Podemos probar las diferentes posibilidades ejecutando el formulario de navegación.
Tomamos todas las intervenciones, hay 11.732 y aquí (después de hacer clic en los botones de búsqueda), aún tenemos 11.732.

¿Por qué? Recuerde que en el vídeo anterior, añadimos en la función Navigation_Function, al final, esta línea nos da el número de registros encontrados después de que se crea una nueva  selección.

 vNumRecords:=Records in selection([Interventions])

Vamos a copiar este código y aplicarlo a los 2 botones de búsqueda.
En la actualidad, no tenemos el puntero de la tabla aquí, vamos a procesar las intervenciones.

Luego podemos copiar esta línea de código para los otros 4 botones:

  • en la diferencia
  • la intersección
  • la unión, vemos que en estos 3 botones, falta algo...
  • e igualmente aquí en el botón de búsqueda.

Ahora, si volvemos al formulario de navegación, tenemos:

  • 631 631 intervenciones antes de las 9:00 a.m.
  • 11,192 intervenciones que no han terminado.

Las intervenciones antes de las 9:00 a.m. + las intervenciones que están en un 100%, las intervenciones de las 9:00 a.m. en curso o de las 9:00 a.m. terminadas, no cambia el número que está aquí.

¿Por qué? Esto se debe a que la simple creación de un conjunto no implica su uso.
En este botón aquí, después de que hemos creado la unión que crea un tercer conjunto, se debe indicar el conjunto particular que debe ser utilizado.

Así que vamos a modificar el código y:

  • Aquí, añadimos el comando USE SET.
  • Copiar, luego, vamos a ponerlo en los otros 2 botones.
  • Añadimos la línea de utilización del conjunto en los otros 2 botones

Y de esa manera podemos probar:

  • las intervenciones en curso: tenemos 601
  • las intervenciones terminadas: tenemos 30
  • lo que corresponde a las intervenciones antes de las 9:00 am: en otras palabras, 631

Para completar este enfoque, vamos a cerrar el formulario y lanzar nuevamente el método Navigation para verificar su funcionamiento.
Si hacemos clic sobre uno de los tres botones a la derecha, un mensaje de error indica que los conjuntos no existen. Naturalmente, los conjuntos deben existir antes de que podamos usarlos.
Vamos a hacer seguimiento a la creación de estos conjuntos, haciendo clic en el primer botón de búsqueda.

Podemos ver, en la lista de la izquierda, el tema "Conjuntos",  que muestra la lista de los conjuntos existentes en el proceso se está rastreando. En la actualidad, no hay ninguno.

Cuando el método se ejecuta:

  • Damos nombre a un primer conjunto
  • A continuación, vamos a dar nombre a un segundo conjunto durante su ejecución
  • Usando el modo de seguimiento, esto nos permitirá ver la creación del tercer conjunto cuando cuando se ejecuta la primera línea.

Y luego veremos, que como el conjunto ya existe, es sólo la cantidad la que cambia.

Es necesario tener en cuenta que un conjunto es sólo una lista de registros que no necesariamente es la selección actual, ya que ahora la selección actual de la tabla Interventions contiene 601 registros.

Cuando pasamos al comando USE SET, la selección ahora contiene un número de registros que coinciden con el número indicado en el conjunto y la variable vNumRecords también se adaptará en consecuencia.

Otro uso de los conjuntos que es muy conveniente consiste en seleccionar un cierto número de registros y a continuación indicar que queremos volverlos la selección actual, es decir, que cuando hagamos clic en el botón, haya sólo estos X registros.

Para ello, debemos:

  • Programar el botón
  • Indicar que queremos una selección
  • Copiar una entrada en el método
  • Y escribir el código correspondiente.

El código es el siguiente:

 $SetName:="Userset_"+String(Milliseconds)
 GET HIGHLIGHTED RECORDS($TablePointer->;$SetName)
 USE SET($SetName)
 vNumRecords:=Records in selection($TablePointer->))

En otras palabras, vamos a:

  • Crear un nombre de conjunto (es decir, una parte de texto + la conversión a texto de los mili segundos)
  • Obtener los registros resaltados, es decir, aquellos que en los que han hecho clic en la tabla en cuestión y crear el conjunto correspondiente
  • Utilizar este conjunto
  • Volver a calcular el número de registros a los que esta cifra corresponde
  • A continuación, borrar el conjunto para liberar memoria.

Podemos probar:

  • todas las intervenciones
  • podemos seleccionar algunas
  • y trazamos el botón de selección

En este nivel, tenemos:

  • un nombre de conjunto
  • el conjunto se creará aquí, así que tenemos 3 elementos en este conjunto
  • lo usaremos para que se convierta en la selección actual de la tabla Interventions
  • recalculamos el número de registros
  • a continuación, vamos a borrar el conjunto.

En nuestro array, ahora tenemos la lista de registros que seleccionamos.

Un conjunto se compone de un bit por registro y por lo tanto no conserva el orden de clasificación.

Cuando sea necesario conservar esta información, debe utilizar comandos relacionados con las selecciones temporales:
COPY NAMED SELECTION y USE NAMED SELECTION

Aquí vamos a agregar un botón que nos permite:

  • Crear una primera selección (selección temporal T1)
  • Vamos a copiar el código en la selección temporal
  •  Y duplicar el botón: T2

Ahora tenemos la posibilidad de almacenar dos selecciones que tendrán en cuenta el orden de clasificación.

Las selecciones existen en la memoria pero no se utilizarán.

A continuación, vamos a:

  • Duplicar estos botones
  • Modificar su fórmula para solicitar el uso de estas selecciones (y aquí no es necesario especificar la tabla.)

Demos un vistazo a este ejemplo. Si tomamos todas las intervenciones:

  • Tomemos las primeras
  • Selección
  • Ordenémoslas por fecha y hora de intervención
  • Creamos una primera selección
  • A continuación, tomamos la misma selección
  • Vamos a ordenar por objeto y hora de intervención
  • Y creamos la segunda selección.

Ahora:

  • Si llamamos a la primera selección, viene ordenada de acuerdo a los criterios indicados: fecha y hora
  • Si hacemos clic en el segundo botón, se ordenan como lo solicitamos primero por objeto y luego por fecha.

 
 

 
PROPIEDADES 

Producto: 4D
Tema: Conjuntos y selecciones temporales

 
HISTORIA 

 
ARTICLE USAGE

Autoformación ( 4D v16)