Access - Campo en formulario que cuente número de registros en que aparece otro campo

 
Vista:

Campo en formulario que cuente número de registros en que aparece otro campo

Publicado por Fofitólogo (40 intervenciones) el 07/03/2020 15:46:01
Hola,
Creé ya hace tiempo una base de datos para incluir libros de una biblioteca (Con campos Título, Autor, Género, Páginas, etc,etc)

Tengo una tabla "Libros" en el que aparecen los distintos campos.

En el formulario que recoge los distintos campos y valores para introducir el nombre del Autor en cada registro, utilizo un Cuadro Combinado en el que pongo por origen de la fila el campo Autores de una consulta (Autores) que hice con los Autores de la tabla. Así si del Autor que quiero incluir ya tengo registrados otros libros, me aparece en el despegable, y si no con escribirlo se incluye como nuevo autor en la tabla.
En esa consulta de autores incluí otro campo que cuenta los libros de cada autor. Eso fue fácil (Agrupé por libros y al segundo campo, le puse Total: Cuenta.

Pero ahí es donde viene mi cuestion: No sabría cómo acceder desde el formulario de un registro en concreto a ese valor que "cuenta los libros de ese autor en concreto"
Fuese accediendo a ese campo o no me gustaría implantar un campo en cada registro del formulario en el que apareciera el número de libros que tiene en la base de datos ese autor. Es decir, que si tengo seleccionado en el desplegable de autor "Eduardo Mendoza" me aparezca el número de registros que tienen ese valor en el campo Autor.
No sé si podría ser en el momento, pero con que se actualizara al salir del registro o algo similar, me valdría.

No veo la forma, agradecería cualquier ayuda.
Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Campo en formulario que cuente número de registros en que aparece otro campo

Publicado por Anonimo (3314 intervenciones) el 07/03/2020 22:58:37
El modo mas sencillo de obtener un dato de una consulta, consiste en utilizar una función de dominio (DLookup).

Esta función tiene dos parámetros indispensables (el primero y el segundo) el tercero es optativo.

El primer parámetro recibe el nombre del campo del conjunto de datos u origen (que puede ser una tabla o consulta), por ejemplo el campo 'TOTAL'
El segundo parámetro recibe el nombre de ese conjunto de datos o dominio (la tabla o consulta mencionada antes) esto es el nombre de esa consulta de agrupación

Con esos dos datos se obtendría el primero de los datos de ese conjunto (útil si es el que necesita o si la consulta siempre devuelve un único dato)

Cuando hay mas de un dato que cumpla los criterios, se utiliza el tercer parámetro, el cual no es mas que una condición que limite los resultados a uno que sea útil para nuestros propósitos

--Un ejemplo ficticio--
Partiremos de que hay un conjunto de datos (consulta) que retorna el numero de libros de un autor, el nombre de la consulta ¿"Cuenta-de-libros" es aceptada?

Libros de este autor = DLookup ("Total", "Cuenta-de-libros")

Sale el primero que encuentre, si se han puesto condiciones en la consulta y devuelve un único resultado es valida, pero ¿y si hay mas de un autor?

En estos casos se utiliza el tercer parámetro, la condición:
Libros de este autor = DLookup ("Total", "Cuenta-de-libros", "Autor = 'Cervantes'")

Y se obtendrá el numero de libros de ese autor (o aquel que cumpla las condiciones) tenga en esa librería o 'dominio'

Si se desea aplicar en un formulario continuo (u similar) lo correcto es aunar esos resultados por un elemento común (el ID generalmente) y presentarlos mediante una consulta que (por ejemplo) obtenga el nombre y datos asociados (además del ID) con otra que obtenga los datos agrupados (mas el ID al que se asocia).

Esta consulta (la que se obtiene uniendo las dos antes mencionadas) es la adecuada para utilizar como origen de datos de ese formulario continuo en el que se mostrarían los datos de los autores y la cuenta de libros de cada uno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Campo en formulario que cuente número de registros en que aparece otro campo

Publicado por Fofitólogo (40 intervenciones) el 08/03/2020 11:42:12
Gracias por la respuesta.
Desconocía esta función. La he usado como DBúsq que es la que me aparecía y que supongo que es exactamente la misma. (solo que en el cuadro de expresiones me marca que los parámetros estén separados por ; que es como los he puesto)

El caso es que la he usado como dices en el formulario. He probado a ponerla con tres parámetros y me daba este error en el campo al abrir el formulario: #Nombre.
Por si acaso, decir que la he puesto en un campo cuadro de texto y a través de origen de control (entiendo que esa sería la forma, ¿no?)

Por ir por partes lo he probado con dos parámetros como dices al principio = DBúsq([CuentadeLibros];[Autores]) siendo "CuentadeLibros" el campo de la consulta "Autores" en la que salen los libros que hay de ese autor y tampoco me devuelve nada más que ese error: #Nombre.

Cierto es que el Access lo tengo muy abandonado, siendo que mis conocimientos eran ya muy básicos. De momento no doy con el problema aunque voy a seguir investigando.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Campo en formulario que cuente número de registros en que aparece otro campo

Publicado por Anonimo (3314 intervenciones) el 08/03/2020 22:10:00
Cuando los datos aportados no se corresponden con el entorno real de trabajo, las respuesta suelen perder dignidad y parecer inadecuadas.

La respuesta se ha basado en esta parte de la exposición inicial:
Eso fue fácil (Agrupé por libros y al segundo campo, le puse Total: Cuenta.

Las adaptaciones son libres y los resultados, siempre responderán a lo que el programador realmente construya, a lo sumo puedo dar un consejo (o como mucho dos)
1º Para evitar errores en los nombres se tendrá que ser exquisito y no utilizar palabras reservadas, además es cómodo y fiel copiar y pegar esos nombres (se evitan errores)

2º El resultado lo presentara allá donde se le indique, bien en un cuadro de texto desde VBA (o asignándolo con una macro), bien como origen de datos de un cuadro de texto, teniendo en cuenta que si se modifica 'algo' que afecte a esa expresión, habrá que refrescarlo, pues la expresión se evalúa cuando se carga del registro.

Por aportar un camino (que no una solución de Copy&Paste que solo sirve para una única vez) hacer denotar que:
.- Los parámetros tienen que asumir ser textos (que el motor evaluara en tiempo de ejecución) y que 'los textos son interpretados como tales, cuando se les define entre comillas (del tipo adecuado al entorno)

Tomando como referencia esta expresión:
= DBúsq([CuentadeLibros];[Autores])

La forma correcta seria asi (atención utilizo unos datos que desconozco NO garantizo el éxito, si garantizo que estaría bien construida):
= DBúsq("[CuentadeLibros]" ; "[Autores]")

DBúsq << ===>> DLookup (Access interpretara y 'traducirá' al idioma que el Windows tenga como predeterminado, la expresión que se escriba en el idioma de los autores

, <<==>> ; …. simples cuestiones de idioma, se aplica el 'separador regional de Windows' de la maquina (en español el punto y coma, en otro idioma el que corresponda, en VBA SIEMPRE la coma simple que en español se utiliza como separador decimal y ello la inutiliza como separador de texto

Espero que sean de utilidad estas aportaciones.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Campo en formulario que cuente número de registros en que aparece otro campo

Publicado por Fofitólogo (40 intervenciones) el 09/03/2020 23:55:01
Hola, muchas gracias por la precisa y completa explicación.

Comentar que la notación que me propusiste de DBúsq("[CuentadeLibros]" ; "[Autores]") ha funcionado. No sólo eso sino que he añadido el tercer parámetro para que me busque la cuenta de libros de un autor concreto, con DBúsq("[CuentadeLibros]" ; "[Autores]"; "[Autor]='Eduardo Mendoza'") y también funciona, devolviendo el campo correcto de la consulta.

Ahora que esa prueba sale perfecta, lo que me faltaría es que en el tercer parámetro en lugar de hacer mención a un autor en concreto, se hiciera referencia al autor que tengo en el formulario en ese registro en ese momento (o si no es posible de otra forma, al salir del registro). Es decir, sustituir el parámetro de "[Autor]='Eduardo Mendoza'" por el que indique al autor que hay en ese registro del formulario. Eso es lo que estoy buscando.

No sé cómo hacerlo .
Por comentar lo que he probado desde la ignorancia: Dentro del generador de expresiones, pruebo a seleccionar Formularios cargados--Libros (es el nombre de mi formulario)--Autor (es el nombre del campo de autor dentro de mi formulario) y lo que me coloca en esa parte de la expresión es <<Expr>>[Autor]. Esto lógicamente no funciona.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Campo en formulario que cuente número de registros en que aparece otro campo

Publicado por Anonimo (3314 intervenciones) el 10/03/2020 21:03:36
Si esto funciona:
1
DBúsq("[CuentadeLibros]" ; "[Autores]"; "[Autor]='Eduardo Mendoza'")

y quieres cambiar a Eduardo Mendoza por una variable (por ejemplo lo que escribas en un cuadro de texto)
.- comencemos por 'quitar' al Sr Mendoza (las '_' son para simular el hueco dejado por lo que hemos borrado)
1
DBúsq("[CuentadeLibros]" ; "[Autores]"; "[Autor]='_________________________'")

como hemos tenido que 'romper la cadena para quitar el contenido, la parcheamos:
1
DBúsq("[CuentadeLibros]" ; "[Autores]"; "[Autor]='"_________________________"'")

y si el cuadro de texto es la variable y se llamase 'Que_Autor' ===> [Que_Autor]
Tendremos que ponerlo en ese hueco dejado antes, esto es: en el medio de los dos textos ( Texto ==> Lo_que_sea_ como relleno y el pan de ese 'bocadillo' las dobles comillas) ergo tenemos dos textos y un vacío en medio

1
DBúsq("[CuentadeLibros]" ; "[Autores]"; "[Autor]='"      [Que_Autor]        "'")

y asi dara error pues hay un texto, una variable y otro texto, tenemos que juntar todo para morder ese bocata (digamos que es la salsa de tomate que pegara los dos panes entre si encerrando el contenido: el pegamento tomate ===> &

1
DBúsq("[CuentadeLibros]" ; "[Autores]"; "[Autor]='"  &    [Que_Autor]  &      "'")

Para Access esto (pan + tomate + salchicha + tomate + pan )= bocadillo
(la salchicha es lo que contenía el cuadro de texto 'que autor')

Si en lugar de salchicha (simulación, que esto va de autores) ponemos 'Cervantes' devolverá lo que es esa ubicación se tenga del autor

Solo exige un requisito, que la función 'pueda ver' que hay en 'que_autor', (no existe problema si están cercanos, esto es en el propio formulario) para otras ubicaciones …. hay que dedicarle un poco mas de paciencia a la teoría y practicar el ping-pong hasta ser un campeón.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Solucionado. Gracias

Publicado por Fofitólogo (40 intervenciones) el 11/03/2020 10:34:33
¡Solucionado!, tal cual me has dicho que complete la función ya tengo la cuenta que buscaba en el formulario operativa.

Explicación detallada y clara.

Practicar el ping-pong hasta ser un campeón ja,ja... en mi pala creo que hay un agujero.

¡Muchas gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar