Uso de Dcount access con varias condiciones

Soy nuevo en el foro, aunque os leo de vez en cuando y debido a unaa duda me he decidudo a preguntar, la cuestión es que tengo una BBDD de acces y necesito usar el dcount pero no me termino de aclarar, os pongo un ejemplo de tabla:

Nombre Día Mes Aprobados
Pedro      1      2         Si
Pedro      3      1         No
María      2      1         No
Carlos     1      2         Si
Pedro      1      2         Si

Ahora quiero hacer una consulta que me muestre lo mismo pero en vez de la columna aprobaados Si/No que me cuente las veces que ha aprobado Cada alumano en el mismo día y mismo mes, sería algo así:

Nombre Día Mes Aprobados
Pedro       1      2          2
María       2      1          1
Carlos      1      2          1
Pedro       3      2          1

Es decir, aunque Pedro sea laa misma persona, necesito una fila por cada mes, como esta dos veces el día uno del mes 2 debe contar 2 pero al usar dcount me cuenta 3, porque me todos los Si pero yo quiero que esté condicionado por el día, mes y nombre. No se si me explico, aa ver si me podeis ayudar.

2 respuestas

Respuesta
2

Prueba, en un nuevo campo de una consulta (cambia lo que marco en negrita por el nombre de tu tabla):

DCount("Aprobados","NombreTabla","[Nombre]='" & [Nombre] & "' AND [Día]=" & [Día] & " AND [Mes]=" & [Mes])

Otra forma, sin necesidad de usar DCount, sería por medio de una consulta de totales:

  • Creas una nueva consulta en vista diseño
  • coges los campos Nombre, Dia, Mes y Nombre otra vez
  • pulsas la tecla de la letra Sigma en la barra
  • seleccionas "Agrupar por" en la fila de "Total" para los 3 primeros campos y Cuenta para el segundo Nombre
  • Guardas y listo

Un saludo.


Muchas Gracias SVEINBJORN, ahora mismo lo pruebo y te comento.

Un saludo

Buenas SVEINBJORN, sobre la primera parte me da error de síntesis ¿puede ser que la última doble comillas esté mal?

Cambia las comas (,) por punto y coma (;). No me di cuenta y la escribí mezclando sintaxis de consulta y de VBA...

si,  eso lo puse bien, porque  & [Mes] no lleva comillas?

POrque es un valor que depende del registro, igual que & Día o que & Nombre

Ok, muchas gracias, te pego el código para ver si ves que estoy poniendo mal:

Malas: DCont("[tipo_llamada]";"[RELLAMADA]";"[tipo_llamada]='Llamada Mala' AND [Dia_Rellamada]= " & [Dia_Rellamada] & " AND [Mes_Rellamada]=" & [Mes_Rellamada] & " AND [Login_agente]=" & [Login_agente])

Al ejecutar eso me pide que introduzca el valor de parámetro Dia_Rellamada, si le doy a aceptar me pide el del mes y luego sale este error:

Error de sintaxis (falta operador) en la expresión de consulta '[tipo_llamada]='Llamada Mala' AND [Dia_Rellamada]= AND [Mes_Rellamada]= AND [Login_agente]= 400'.

Si te pide el parámetro "Dia_Rellamada" es que no tienes ningún campo que se llame así (comprueba acentos, espacios, signos...). Lo mismo para el mes.

Y si le das a "Aceptar" sin poner ningún valor, es normal que te salga un error, porque no igualas a nada en día y mes para hacer el filtro al DCount.

Muchas gracias por la ayuda y la paciencia, creo que me estoy haciendo un lío, entiendo que las comillas están bien, ahora, cuando yo pongo Dia_Rellamada es como se llama ese campo en la consulta pero en la tabla se llama de otra forma (fecha_llamada), en la consulta ¿cuál tengo que poner, el nombre del campo en la consulta o el de la tabla?

Perdona si te estoy liando.

Imagino que en la consulta es un campo calculado (por ejemplo Día(fecha_llamada)). En teoría deberías llamarlo como se llame el campo, pero a veces Access es "quisquilloso" con los nombres y "prefiere" que pongas la expresión.

Por tanto prueba a poner como criterio:

Malas: DCont("[tipo_llamada]";"[RELLAMADA]";"[tipo_llamada]='Llamada Mala' AND [Dia_Rellamada]= " & Día(fecha_llamada) & " AND [Mes_Rellamada]=" & [Mes_Rellamada] & " AND [Login_agente]=" & [Login_agente])

Y lo mismo para el mes.

Ok, muchas gracias, ya lo he solucionado poniendo el nombre que tiene el campo en la tabla, el de la consulta como dices es un campo calculado para sacar el día de la fecha y el mes, lo que pasa que algo no me cuadra, lleva más de 3h calculando la consulta, ha tenido que entrar en algún boucle, madre mía, voy a ver si lo soluciono.

Eso es raro...

Prueba así:

Malas: DCont("[tipo_llamada]";"[RELLAMADA]";"[tipo_llamada]='Llamada Mala' AND Day([fecha_llamada])= " & Día(fecha_llamada) & " AND Month(fecha_llamada)=" & Mes(fecha_llamada) & " AND [Login_agente]=" & [Login_agente])

Nada, se queda super tostado el PC, la barra de "ejecutando la consulta" avanza super lento, el access está haciendo un uso del 50% de la CPU, supongo que son demasiadas condiciones para una tabla muy grande, tal vez no es la forma más adecuada, Icue me está ayudando con código, pero tengo una pregunta, si hago una tabla que me muestre:

Login fecha dia mes año llamadas (contando todo) Concatenar (login&dia&mes&año)

y otra consulta igual pero solo contando las malas:

Login fecha dia mes año llamadas (contando malas) Concatenar (login&dia&mes&año)

Al tener un campo común como es "Concatenar" podría hacer una tercera consulta que muestre esto:

Login fecha dia mes año Porcentaje (Malas de la tabla 2 / Llamadas de la tabla 1) Concatenar (login&dia&mes&año)

Se puede hacer eso?

En teoría sí, pero siempre que el campo sea único en una tabla al menos, aunque en tu caso para lo que quieres, tendría que ser único en ambas consultas.

Por cierto, sigo pensando que la consulta de totales es tu mejor opción y más sencilla

El problema que tengo con la de totales es que me cuenta el total y necesito el total y los que la condición sea "llamada Mala" para poder sacar un porcentaje, es decir, algo así:

Login              Fecha            total_llamadas     Llamadas_ Malas   %_Llamadas_malas  Mes   Año 

1000        22/02/2017               50                             8                                        16%                 2       2017

Dónde login viene en la tabla, en la tabla viene una fila por llamada, indicando si es buena o mala, yo quiero contar todas las llamadas del mismo día de la misma persona, luego, en otro campo contar todas las llamadas del mismo día y de la misma persona pero "malas" y sacar el porcentaje, no se como se me está atragantando tanto una cosa que excel hago super rápido, el problema que en excel cuando le meto una tabla gigantesca se queda pillado.

Yo lo haría en pasos:

Una consulta de totales que te calcule el total llamadas, con los campos login, fecha, mes, año y total llamadas

Una consulta que te calcule las llamadas malas, con los campos login, fecha, mes, año, llamadas malas. Esta consulta la tendrás que filtrar para que trabaje solo con lo que consideras llamadas malas.

Una consulta sobre las dos anteriores en la que juntas todos los datos y calculas el porcentaje. Las dos consultas las relacionaría por login y fecha.

Si subes aqui una BD de ejemplo con la estructura de la tabla y algún dato, te la devuelvo con la consutla funcionando

Así es como lo estaba haciendo pero me quedo en el punto de enlazar una consulta con otra, se adjunto un ejemplo (le he borrado muchos campos, ya que sino pesaría muchísimo pero los básicos están):

Bajar

Te devuelvo el archivo: http://filebig.net/files/bu6RwS9ypG 

La Consulta1 está hecha relacionando las dos que ya tienes y haciendo el cálculo que falta. He cambiado algún nombre en las consultas originales para que la final quede con los nombres que citas. El campo del porcentaje tiene puesto formato porcentaje (en sus propiedades) y por eso no lo divido por 100 en el cálculo.

La Consulta2 muestra el mismo resultado, pero trabajando directamente sobre la tabla. Es más lenta que la anterior, pero puedes ver cómo sería el DCont para contar las llamadas malas de cada agente en cada día.

Madre mía, era más sencillo de lo que creía, y la función con el dcount va genial, creo que mi problema era que me liaba con los [ ], muchísimas gracias, te debo una.

No es nada, je je

Respuesta
2

Deberías aclarar primero. Si María ha suspendido no puede aparecer abajo en aprobados( no se puede ser generoso con los que no han prestado atención en clase). Luego en el segundo registro de Pedro pones que la fecha en que suspendió es día 3 del mes 1 y abajo pones día 3 del mes 2 ¿es qué también volvió a suspender en febrero? Ese chico no tiene remedio.

Es cierto Icue, realmente mi tabla nada tiene que ver e improvisé ese ejemplo para ver si me podía explicar bien, el resultado correcto daría esto:

Nombre Día Mes Aprobados

Pedro       1      2          2
Carlos      1      2          1

Espero que se entendiera. Un saludo

Haz la consulta como en la imagen

Esto funciona perfecto Icue, solo una cosa, si quisiera a parte de mostrar los SI mostrar en otra columna el total (SI + No) ¿Cómo lo podría hacer? Ya que de esa forma solo visualizo los SI (que es lo que pedía, pero sin perder la columna con los totales, es para poder hacer un porcentaje).

Te he contestado con una consulta, pero quisiera decirte que soy totalmente enemigo de ellas. Es mucho mejor e infinitamente más versátil hacerlo en código. Por ejemplo, supón que haces un formulario y le añades un combinado con origen de la fila el campo Alumnos de la tabla y agrupados. Supongamos que ese combinado se llama así, Alumnos. Podrías crear otro combinado Mes.

En las propiedades del combinado Alumno, en el evento después de actualizar pones

mes.rowsource="select mes from alumnos where alumno='" & me.alumno & "'"

Así, cuando eligieras un alumno, en el combinado Mes, solo te aparecerían los meses en que ese alumno ha tenido notas.

Luego le podrías poner un cuadro de texto, llamado por ejemplo, Aprobado y otro No Aprobado y en las propiedades del combinado Mes en el evento Después de actualizar poner

aprobado=Dcount("aprobado","alumnos","alumno='" & me.alumno & "' and aprobado="si" and mes=" & me.mes &"")

[No aprobado]=Dcount("aprobado","alumnos","alumno='" & me.alumno & "' and aprobado="no" and mes=" & me.mes &"")

Y cualquier otro cálculo que quieras

O bien en el formulario alumnos, con dos cuadros de texto Si aprobados y NoAprobados en el evento después de actualizar del cuadro de texto Aprobado ponerle

Siaprobados=Dsum(....lo de arriba

No aprobados lo mismo

Hay 20.000 formas, por eso si quieres, repito, si quieres, mándame un mensaje a [email protected] y te mando dos o tres ejemplos. Si lo haces, en el asunto del mensaje pon tu alias Fernando, ya que si no sé quien me escribe ni los abro.

Postdata. Te contestaría por la noche que me voy a ver el desfile de carnaval.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas