Contar dependiendo del valor de un campo


([N1] marianoyana) #1

Buenas, estoy realizando una aplicación de ganadería, en la cual tengo distintas tablas, entre ellas una de los datos de la Explotación y otra que es plural de esta que es Animales.
En la tabla Animales existe un campo que es el sexo, donde pongo Macho o Hembra.
Y ahora lo que quiero hacer es un subformulario que me cuente el número de machos, hembras… y otras distintas cuentas como el número de animales de una raza, de una especie.

En principio lo de machos y hembras lo tengo solucionado mediante un campo de num machos y otro de hembras en la explotación que se actualiza desde la tabla animales, pero me gustaría que me contará esos datos sin tener que poner un campo en la tabla explotaciones y la actualización en la tabla animales.

Gracias


([N3] pacosatu) #2

Hola Mariano.

¿Realmente estás preguntando cómo contar las vacas de una explotación? Hombre, entre otras cosas para eso se inventó Velneo.
Tienes varias opciones, experimenta con ellas.
1º- Mírate el tema de los Subindexadores.
3º- Crea Índices por sexo, raza, especie y ejecuta las Consultas (objeto Búsqueda) sobre esos Índices.
2º- También puedes crear Índices condicionados por sexo, raza, especie, …

Siempre la variable sysListSize te devolverá el número de Animales obtenidos.

Saludos
Paco Satué


([N1] marianoyana) #3

Hasta el momento he creado indices por sexos, es decir tengo uno que me cuenta los machos y otro para las hembras, pero lo que quiero hacer es que en un subformulario poner un subobjeto, tipo numerico por ejemplo, que me aparezca el numero de machos y otro el numero de hembras.

Saludos


([N3] pacosatu) #4

Hola Mariano.

Entonces vincula una Variable Local del subformulario al control numérico.
La Variable Local será el valor sysListSize que hayas obtenido de un Proceso.
Ese Proceso tendrá Entrada = Un Registro de Explotación y Salida = Lista de Animales.
Ese Proceso ejecuta la Búsqueda por ejem: Por #sexo = “masculino”.

Ya es cuestión tuya concatenar todo en el formulario principal para que funcione.

Saludos
Paco Satué


([N1] marianoyana) #5

Gracias, Ya te cuento si lo consigo

Saludos


([N1] marianoyana) #6

Pensaba que podía ser más fácil, mediante las funciones estandares que contará el numero de veces que se repetía una cadena, como por ejemplo “Macho” u otro similar.

Saludos


([N3] pacosatu) #7

Hola Mariano.

Velneo, al igual que todas las bases de datos relacionales, solo sabe contar registros.
Cuando indexamos una tabla, entre otras cosas, lo hacemos para que pueda contar rápidamnete los registros que cumplan determinadas condiciones, en tu caso, sexo, especie, etc…
Así que no queda más remedio que hacerlo mediante objetos Búsqueda, y no quepa la menor duda de que esta forma es la más rápida y fiable.

Para complementar el uso de Índices, Velneo dispone del mecanismo de Actualizaciones, que nos irá contando los registros conforme se vayan añadiendo a la tabla. Esto tiene sus pros y contras y no es tan fiable como los Índices.

También puedes contar registros a lo bruto. Haces una consulta completa de la tabla y vas mirando uno a uno los registros para ver si son del sexo Macho o Hembra, etc.

Y finalmente, están los sistemas de bases de datos documentales, donde están indexados todos los términos posibles de búsqueda. Tenemos el ejemplo del motor Google.

No dudes en absoluto que el sistema más óptimo es el las Búsquedas Condicionadas de Velneo si quieres prescindir de las Actualizaciones.

Saludos
Paco Satué


([N1] aztecmexico) #8

Buen día,

Desde que publicaste el post me puse a evaluar alguna opción que fuera un tanto cuanto muy genérica y funcional y despues de darle algunas vueltas he llegado a lo siguiente:

  • Es un hecho que quizás no siempre sabrás con antelación cuantos grupos por ejemplo de especies o subespecies pueden estar registrados en la base de datos, lo cual complica el mantenimiento de un formulario que muestre los datos, vamos, contar por sexo es lo más fácil del mundo, dado que hay un limite de posibilidades, pero en lo demás seria bastante molesto que si de repente agregan una nueva especie tengas que ir a modificar el formulario y los procesos o búsquedas para poder contabilizarla.

Como te indica Paco, el truco aqui es el manejo de los índices, un índice para sexo, un indice para especies, otro para subespecies y así sucesivamente los que te sean necesarios.

Ahora, ¿Cómo resuelves el desconocer cuantas especies o subespecies poner en el formulario?,

Yo lo haría definiendo en dicho formulario 2 variables locales con array, con una longitud de 20 por decir un número, una de tipo alfanúmerico en la que guardarías el nombre o descripción del elemento a contar y otra de tipo numérico en la que guardarías el contador, en tu formulario pones todos esos campos de las variables con array, la descripción[n] y el contador[n] y ya, ahora, mediante un proceso o búsqueda vas alimentando, no lo he probado pero más o menos haria lo siguiente:

Cargar lista “animales”, sin importar el sexo y sin resolver nada
multipartir lista por el campo especie

ahora transcribo lo que dice el manual de vDevelop respecto a “multipartir lista”

Funcionalidad Por cada valor diferente que tenga el campo seleccionado se originará una nueva sublista que agrupará los registros correspondientes a ese valor. El subproceso que este comando genera será ejecutado por cada sub-lista obtenida. Si no hay registros en la lista de origen, no será ejecutado el subproceso.

No lo he probado, pero indica que “el subproceso que este comando genera será ejecutado por cada sublista obtenida…}”
Entonces dentro del subproceso haria lo siguiente:

set contador[n], syslistsize,
seleccionar ficha por posición, 1
leer ficha seleccionada
set descripción[n], #campoenlazado.name
set n, n+1

Y yá , es todo, ahora, para controlar la posición donde almacenarás los datos no sería con un ciclo, porque no sabes cuantas listas se generaron, simplemente antes del primer cargar lista global inicializas la variable numérica de control, Set n, 0, por eso al final del subproceso sumas 1 a dicha variable, para que en el siguiente almacene correctamente.

Es una idea general, pero creo que te serviría.

Saludos.

Martin Ibarra.


([N3] pacosatu) #9

Hola Martín

Yo creo que en una Explotación Ganadera tendrán bien definidos todos los posibles casos de sexo, raza, especie, etc … por lo tanto los Índices condicionados están bien delimitados.

Si no es así, tu idea del Multipartir funcionaría perfectamente.

Yo uso Multipartir en las importaciones masivas de datos, donde necesito saber los posibles valores de un determinado campo y poder depurar los valores antes de crear los Maestros.

En lugar de un array yo uso una tabla temporal en la que vamos guardando cada #Valor diferente junto con el #Contador.


Cargar lista (ANIMALES, INDICE_ESPECIES)
Multipartir lista (ESPECIE)
SET (NCONTADOR, sysListSize)
Seleccinar ficha por posicion (1)
Leer ficha seleccionada
SET (CESPECIE_TIPO, #ESPECIE)
Crear ficha en memoria (TMP_ANIMALES_ESPECIES)
Modificar campo (ESPECIE_TIPO, CESPECIE_TIPO)
Modificar campo (CONTADOR, NCONTADOR)
Alta de ficha
Añadir ficha a la salida

Obtienes una Lista de posibles valores de Especies con el Total de ocurrencias.
Ahora es fácil mostrar el resultado en una Rejilla, Combo, etc.

Saludos
Paco


([N1] aztecmexico) #10

Buen día Paco,

Como bien indicas la opción de una tabla en memoria funcionaría mejor porque no habría límite en la cantidad de especies, que bien pueden ser pocas o muchas o estar variando constantemente -en cuanto a las que comercializan en particular en x negocio- de igual forma con otra tabla para subespecies podria ir mostrando digamos 3 rejillas soncronizadas, sexo, especie y subespecie, las cuales bien vestidas con CSS quedarían con muy buena imagen al mostrarlas.

La opción que propuse en principio tienen la limitante de que -cuando menos yo no sé como- no se pueden crear variables al vuelo con un número determinado de ocurrencias por lo que si en un momento determinado la cantidad de especies o subespecies superara a la capacidad del arreglo pues nos quedariamos cortos y eso no se ve bien en ningún sistema.

Como ves Marianoyana opciones hay, cuestión de analizar un poco cual te conviene más y, eso si, hacer las pruebas o prototipos correspondientes y simplemente elegir la que mas te guste. Mi sugerencia particular sería como lo indica Paco, con una tabla en memoria y presentarlos en rejillas e irlas sincronizando, creo que te quedaría muy bien presentado y con mucha potencia.

Saludos.

Martin Ibarra.


([N1] marianoyana) #11

Lo Siento, pero según el nivel que tengo ando perdido.

Tengo una búsqueda donde le he puesto la condición de Macho, como supongo que podréis ver; posteriormente he hecho un proceso que me lanza la búsqueda de macho, pero donde me pierdo, si eso esta bien, es que en el proceso he puesto inicio Explotaciones (Ficha) y destino Animales (Lista). A la hora de lanzar de un formulario, ando perdido, ya que no sé como relacionarlo con el proceso y algún tipo de objeto numérico.

Lo de la Tabla en memoria se me escapa a mis conocimiento.

Gracias