Búsqueda y arrays, una forma de hacer multibúsquedas (y II)

Intentaré explicar con otro ejemplo una nueva forma de hacer multibúsquedas en una tabla de datos usando de nuevo los arrays de Velneo.

El planteamiento es sencillo pero suficiente para desarrollar dos formas de hacer una multibúsqueda sobre una misma tabla: una con una rejilla en la que escogemos los datos de quién queremos mostrar de dentro de una lista de ellos y otra en la que introducimos nosotros los datos como si fuese un histórico.

Tenemos dos tablas, una de CLIENTES  y otra de VISITAS,  ésta última histórica de la primera, en la que iremos guardando las visitas que le hacemos a cada cliente en diferentes fechas. No he querido crear más campos para que el ejercicio fuera lo más sencillo y claro posible.

Esquema inicial de tablas

Esquema inicial de tablas

Primer planteamiento: el objetivo es que la aplicación busque todas las visitas que se han hecho a los clientes que yo elija en una rejilla en la que me muestra todos los clientes. Es lo que he llamado en el mapa visitas múltiple  selección y los objetos usados se guardan en la carpeta del mismo nombre.

He creado una tabla DUMMY  en memoria que se va a cargar con todos los clientes cada vez que se necesite a través de un tubo de lista.

esquema dummy

Esquema de tablas con CLIENTES, VISITAS y DUMMY

Con un formulario especial de la tabla VISITAS donde se muestra una rejilla con todos los DUMMY,  editable en su campo %ESCOGER%,  que en principio vale 0, pero que podemos cambiarlo en esa rejilla a 1 para que nos  busque las VISITAS  a ese CLIENTEDUMMY. Tras tener escogidos los CLIENTES  que queremos el proceso utiliza una cesta de VISITAS  y la potencia de los arrays, para ir cargando en la cesta las visitas de cada uno de los CLIENTES seleccionados y mostrarlos al final en una rejilla de la tabla VISITAS. Como se puede observar, la tabla DUMMY  no tiene ningún tipo de conexión con las otras dos tablas.

proceso multi

Proceso con DUMMY y "multiselección".

En el proceso se crea una cesta local de visitas donde se irán añadiendo las visitas de los CLIENTES  elegidos.

Se vacía la DUMMY   y  se rellena posteriormente mediante un tubo de lista con todos los clientes. Se crea el array.

A continuación se muestra un registro de VISITAS en el que hay una rejilla con los datos de la DUMMY. El primer campo %ESCOGIDO% es editable y se puede cambiar su valor de o a 1.

Se carga la lista DUMMY  por el índice “escogido” ( formado por el código y con campo condición para indexar %ESCOGIDO% igual a 1 ) y se van añadiendo al array los códigos de los clientes guardados en el campo %CODIGO%  de la tabla DUMMY.

Por último se caga el array, y se va leyendo cada item, que irá modificando la variable global en memoria $COD-CLIENTE$ para así lanzar la búsqueda VISITAS-COD-CLIENTE  y añadir los resultados obtenidos a la cesta. Por último se muestra la cesta.

Este planteamiento se lanza en la opción de menú búsqueda múltiple con rejilla editable

Segundo planteamiento. el objetivo es que la aplicación busque todas las visitas que se han hecho a los clientes que yo haya introducido en una rejilla. Es lo que he llamado en el mapa visitas múltiple  dando altas y los objetos usados se guardan en la carpeta del mismo nombre.

He creado una tabla DUMMYDOS  en memoria  a la que se van a añadir los clientes que se quiera mediante un formulario de alta

esquema con dummydos

Esquema con CLIENTES,VISITAS y DUMMYDOS

Esta vez DUMMYDOS si que actúa como histórica de CLIENTES, pues necesito rellenar esta tabla con un localizador y para ello , necesito que CLIENTES sea maestra de DUMMYSDOS.

El proceso llamado varía un poco, pero también creo que es sencillo y fácil de comprender.

proceso dummydos

Proceso que alimenta la cesta de las visitas

En este caso, cuando se recorre la lista de DUMMYDOS,  el dato que se debe añadir al item del array es el puntero al CLIENTE, que guarda el campo %CODIGO% de la ficha del maestro CLIENTES.

El segundo  planteamiento se lanza en la opción de menú búsqueda múltiple con rejilla “alimentada”

Seguro que es mejorable, pero es sólo un ejercicio para ver cuánto partido le podemos sacar a Velneo.

Link de descarga del mapa completo y en el foro de Velneo.

EDICION (8-sep-2010)

Tal y como me comenta por e-mail mi compañero y sin embargo amigo 🙂 Adelo Herrero el primer planteamiento se puede hacer sin la tabla DUMMY  usando la misma tabla de CLIENTES para simular la multiselección con el campo %ESCOGIDO%.

Tienes toda la razón Adelo. Se agradece el comentario y subo al link de descarga la versión actualizada con tu sugerencia.

Un saludo.

Con Velneo se pueden hacer muchas cosas!!!

Hace poco, revisando la Wikipedia, me encontré con este artículo. Me pareció interesante desde el principio  y hoy mismo lo volví a revisar y me propuse dejar a un lado los programas habituales de gestión y dedicarle un tiempo a intentar simular dicho juego.

En principio , la idea se basa en una única tabla, VMAESTROS (aprovechando el almacén de objetos, :-)) que para que los cálculos fueran más ágiles, la hice en memoria.

Incluye cuatro campos además del código:

  • FILA , numérico de longitud 1, para guardar la fila en la que está la ficha
  • COLUMNA, numérico de longitud 1, para guardar la columna
  • VIDA, booleano, para indicar si la célula está viva ( valor 1 ) o muerta (valor 0)
  • SIGUIENTE, también booleano, que me dará el estado de la célula en el siguiente “turno”

De la tabla, sólo conservo el índice código y creé otro formado por la terna FILA-COLUMNA que me servirá para posteriores cálculos además de para mostrar las fichas con el objeto visual casillero, organizado por filas y columnas como si fuera una matriz.

Las premisas del juego so:

  • Una célula muerta con exactamente 3 células vecinas vivas “nace” (al turno siguiente estará viva).
  • Una célula viva con 2 ó 3 células vecinas vivas sigue viva, en otro caso muere o permanece muerta (por “soledad” o “superpoblación”).

El estado siguiente  de una célula  en la posición fila F columna C de su estado inicial y de los estados de las 8 células que le rodean

Trama de las celdas

Luego, el próximo estado de CF ha de depender de otros 8 valores y será calculado por la premisa primera del juego o de la segunda, dependiendo del estado de VIDA  de CF inicial. Y todo ha de calcularse para cada una de  las células.

Para eso utilicé el campo%SIGUIENTE%  en el que podré calcular el valor de CF en la siguiente “jugada”.

proceso recálculoEn el proceso se recorre la lista en modo lectura/escritura, para modificar el campo SIGUIENTE  llamando a la función TOYVIVA  a la que le pasamos los parámetros FILA, COLUMNA y VIDA.

función vida

Calcula el estado siguiente de la celda CF

Si el “no está viva” (parámetro _estado=0), entonces se ataca la segunda premisa y se ve el estado de las otras 8 células que le rodean y se cuentan cuántas de ellas viven. Si viven 3, se retorna como valor de función 1, es decir, en la siguiente jugada la célula estará viva.

Si “vive” (parámetro _estado=1) vamos a la primera premisa pero esta vez inicializamos el contador no a 0 como antes sino a -1 dado que la célula CF ya está viva pero no la podemos contar. Si encontramos que hay 2 ó 3 vivas seguirá viva y si no, morirá en la siguiente jugada.

Una vez la función me devuelve todos los valores, vuelvo a recorrer en el proceso la lista para pasarle al campo VIDA  el valor guardado en SIGUIENTE y volver a poner este último a cero.

Para que fuera algo más vistoso en cuanto a funcionamiento, creé dos menús

  • MENU INICIAL  en el que aparece el casillero para que podamos dar vida a las células que queramos con un click en cada casilla o ponerlas todas a cero. Todas las fichas se crean al iniciarse el programa en el proceso llamado desde el menú AUTOEXEC  con el proceso VMAESTROS (que genera una “matriz! de 40X40) pero que podeis cambiar por el llamado GENERA  que pide el número de filas y columnas a generar
  • MENU VIDA en el que se han sincronizado dos casilleros iguales, pegados uno encima del otro con una variable global booleana VISIBLE que hace los efectos del refresco tras los recálculos. A su vez, para que no se tenga que dar a una opción de menú cada vez que se quiera ver la evolución dinámica del juego, en este menú he puesto una opción texto estático en vertical llamada Recalcular, con la opción Timer, cada cuantos en 1, para que se repita cada vez que el timer del menú ( puesto cada 2000 milisegundos)

Espero que os guste  o que al menos os entretenga.

Para los foreros de Velneo , el enlace de descarga en el foro y para los que no , este enlace de descarga externa.

Un saludo.

A %d blogueros les gusta esto: