Como contar registros con criterios en formularios
Tengo una base de datos con access y cree un formulario con subformulario de una consulta de union, (esta consulta de union tiene tres columnas DOCUMENTO, IVA Y MES. En el formulario agregue una cuadro de texto para contar los documentos que empiecen con BH pero no puedo lograr que los cuente
=DCont("[DOCUMENTO]";"[FORMULARIO 29]";"[DOCUMENTO] = 'BH'").
Lo único que he logrado es sumar el total de los documentos pero me gustaría contarlos por criterios.
1 respuesta
Si los documentos son, por ejemplo BH43, BHA5678, etc tienes que decirle que sólo te cuente aquellos registro en que las dos primeras letras del valor de documento sean BH, es decir
=......"left([documento];2)=""BH""")
Me puedes confirmar si esta bien lo que hice
=DCont("[MES]";"FORMULARIO 29";"[DOCUMENTO]="LEFT([DOCUMENTO];2)="BH"")
Ya que me sale un mensaje que la expresión de la sintaxis no es valida
Tienes razón, me guié por lo que habías escrito y no me fijé es
-------------------------"Documento=left([documento];2)=""BH""")
Antes de la B van dos doble comillas y después de la H van tres.
De todas, si formulario y 29 están separados tienes que encerrarlo entre corchetes, si embargo mes y el primer documento no hace falta.
Ahora si
=DCont("[DOCUMENTO]";"[FORMULARIO 29]";"DOCUMENTO=left([DOCUMENTO];2)=""BH""")
Ya no me sale en mensaje, pero en cuadro de texto me sale #error
Pero también puedes ponerlo como
......"Documento=""BH""&""*"""
Es decir, que te cuente aquellos registros en que el campo documento empiece por BH y "algo más"
Es que hay muchas, pero que muchas formas de hacerlo, como si cuando eliges un valor, por ejemplo, BH, HV, MN, etc, te aparezca un mensaje diciéndote cuantos hay de el que elijas..
=DCont("[DOCUMENTO]";"[FORMULARIO 29]";"DOCUMENTO=left([DOCUMENTO];2)=""BH""&""*""")
igual me sale #error
sera porque el formulario lo cree de una consulta de union,
la cantidad de registros hasta ahora son 150
Vamos a ver si me aclaro, la tabla origen del formulario ¿no se llama formulario 29? Es que si formulario 29 es sólo el nombre del formulario la función esa no te sirve. La función Dcount( es su nombre verdadero, aunque en SQL la pone como Dcont), se compone de tres partes, la primera es lo que debe contar, la segunda donde debe contar, tabla o consulta, nada más, y lógicamente en un formulario continuo no tiene existencia real más que el registro activo, los demás registros son imágenes virtuales y la tercera parte(criterio) es la que diferencia un registro de otro, la que le dice cuenta éste pero cuentes ese otro. Esta parte según sea el "conteo", se puede suprimir.
Mira, te pongo un par de ejemplos
En el formulario Clientes, como no tengo documentos uso el campo País pero es exactamente igual. Tengo un cuadro de texto independiente, el de la izquierda, donde en su origen de control, que me cuente los países.
Cuando lo abro, él me cuenta todos
Pero cuando "limito" el país, él me va a contar sólo los de ese país( que serían los tuyos de BH...) Elijo Estados Unidos
En el momento que lo selecciono
Me saca los registros de Estados Unidos y como ese cuadro de texto sólo tiene esos registro que contar te pone los que hay. El cuadro de la derecha(se llama Cuantos) hace lo mismo pero el valor se lo doy en código. En el evento Después de actualizar del combinado le tengo puesto
Private Sub Elegir_AfterUpdate() Me.RecordSource = "select * from clientes where pais='" & Me.Elegir & "'" Cuantos = DCount("pais", "clientes", "pais='" & Me.Elegir & "'") End Sub
Es decir, que el origen de registros del formulario sean aquellos de la tabla Clientes en que su país sea igual al que acabo de elegir en el combinado, valga la redundancia, Elegir y que en el cuadro de texto Cuantos me ponga la cuenta de los registros de la tabla clientes( no del formulario) que tengan ese país.
Es más, no necesitas hacerlo en el mismo formulario, puedes hacerlo en cualquier lado y de mil formas. Por ejemplo, en el formulario 1, que sólo tiene el combinado Elegir, si selecciono, por ejemplo, Alemania(sería tu BH...)
En cuanto la selecciono
Y también porque lo está contando en la tabla. El código en este caso sería
Private Sub Elegir_AfterUpdate() Dim i As Byte i = DCount("*", "clientes", "pais='" & Me.Elegir & "'") MsgBox " De " & Elegir & " hay, ni más ni menos que, " & i & " clientes ", vbOKOnly + vbExclamation, "Que lo sepas" End Sub
Pero como te decía lo puedes hacer de mil formas.
Lo que no me explico es porque al contar todos los registros con esta fórmula funciona
=DCont("[DOCUMENTO]";"[FORMULARIO 29]";"[DOCUMENTO]")
y al querer contar por algún criterio con estas formulas no lo hace
=DCont("[DOCUMENTO]";"[FORMULARIO 29]";"DOCUMENTO=left([DOCUMENTO];2)=""BH""")
=DCont("[DOCUMENTO]";"[FORMULARIO 29]";"DOCUMENTO=left([DOCUMENTO];2)=""BH""&""*""")
A lo mejor estoy haciendo algo mal, pero no logro dar con el problema
este código con criterio es el único que no me indica #error pero me sale 0 en el cuadro de texto
=DCont("[DOCUMENTO]";"[FORMULARIO 29]";"[DOCUMENTO] = 'BH'")
Vamos a ver.
1º La expresión que dices que te funciona, no te funciona.
DCont("[DOCUMENTO]";"[FORMULARIO 29]";"[DOCUMENTO]")
No tiene sentido ninguno, el último [documento] no es ningún criterio. Le estás diciendo. Cuéntame todos los blancos del formulario 29 que sean blancos. Como son todos blancos, hace caso omiso de eso y te dice los registros que hay.
2º No estás contando, y eso no lo dijiste desde el principio, los registros de un formulario. ¿Cómo te va a contar los registros del formulario 29, si en el formulario 29 sólo hay un registro, en el que estás, y no tiene ningún control que se llame Documento? Tiene un subformulario Nada más.
Vamos a suponer que la tabla Origen se llama clientes y tiene varios registros
Verás que sólo hay 3 registros que contengan la cadena BH en Documento.
Aunque los registros estuvieran en un formulario, que no en un subformulario
Cuando lo abres
Es más, aunque lo pusieras como
Tal como dices, pero haciendo referencia a la tabla, como el primero no tiene sentido
Es decir, lo cuenta todo
Aunque fuera un formulario formulario 29 con un subformulario. Para no agrandar demasiado la imagen los cuadros de texto los pongo abajo, pero es exactamente igual
Te saldrá
Observa que lo estamos haciendo todo en SQL, no ha intervenido VB para nada.
Por cierto, me olvidaba. El uso de Left, en SQL es Izq. Si construyo la consulta
Puedes ver que le digo, que me busque aquellos registros en que las dos letras de la izquierda sean BH. Cuando la abro
Me saca los únicos tres que hay.
Gracias por tu paciencia y explicación. ahora si me funciona con este codigo y pude ver cuantas BH tengo.
=DCont("DOCUMENTO";"[FORMULARIO 29]";"DOCUMENTO Like ""BH""&""*""")
pero se me presento otro problema. Como puedo hacer para que las boletas que me encuentre las pueda separar por meses?
Estaba creando un cuadro combinado para que cada vez que coloque el mes 1 me arroje solo la cantidad de ese mes, pero no se como vincularlo
La ventaja de las funciones Dcount, Dsum, Dlookup, etc es que aceptan hasta 99 criterios AND ó OR. Por ejemplo
TextoA=dcount("*","clientes","pais=""Alemania"" and Cabello=""Blanco"" and pelo=""Rubio"" and edad=45 or edad=39 and FechaNac between.....
Personalmente lo haría en código VB. Por ejemplo, en el evento Al recibir el enfoque de ese cuadro de texto, al que llamremos TextoA le pondría
textoA=dcount("*","clientes","documento like ""BH""&""*"" and mes=[Escriba un mes]")
Así, cuando pusieras el cursor sobre él, te aparecería una ventana con esa pregunta. Escribes el mes que quieras y al aceptar ya te pone su valor.
El inconveniente de como tienes construido el formulario y supongo que también la tabla Origen es que es válido sólo para este año, porque para el año que viene tendrás dos meses 3, 4, 5,... y dentro de cuatro años tendrás 4 meses 3, 4, 5, ... Es preferible usar, por ejemplo Mes([fecha])&"/"&año([fecha]), ya que así sólo se darrá un único 04/2020, un único 04/2021, etc
¡Gracias! Julián, has sido una gran ayuda, me resulto todo lo que me indicaste. Te pasaste una vez más
Gracias por compartir tus conocimientos
Un abrazo
Julián, apropósito cuando tengo un registro mensual que no tengo ninguna BH que contabilizar como lo hago para que aparezca 0. intente con este código pero no me toma.
=DSuma("VALOR";"[FORMULARIO 29]";"DOCUMENTO Like ""BH""&""*"" AND MES=[Cuadro_combinado20] AND EsNulo DOCUMENTO;0;")
No hace falta que aparezca ningún 0, lo que se necesita es que para los cálculos, o bien no tenga en cuenta los nulos, o bien, sólo para los cálculos, que transforme esos nulos en ceros. Por ejemplo, si tengo la tabla
Verás que hay 91 registros pero en el campo Fecha por mes sólo hay cinco que tengan valor. En un formulario, en un cuadro de texto, en su origen de control le pongo lo que ves en el Zoom
Al abrirlo
Vamos ahora a suponer que la tabla tiene un campo Cantidad
En otro cuadro de texto, en su origen del control le pongo
Aquí no le pongo criterio pues quiero que me sume todos los campos Cantidad. Cuando lo abro
Si quisiera que sólo me sume determinados registros, por ejemplo, los clientes de Alemania, lo pondría como
=Dsum("Nz([cantidad])";"clientes";"Pais =""Alemania""")
La función Nz(NullZero) antiguamente sólo transformaba( repito, sólo para el cálculo) los nulos en ceros, y así podías sumar, restar, multiplicar, contar, etc, sin "tocar" para nada el valor que hay o no haya en el campo. Actualmente transforma los nulos en el valor que quieras, por ejemplo
Texto5=nz([texto3]) si texto3 es nulo lo transforma en 0
Texto5=nz([texto3];"4) si texto 3 es nulo lo transforma en 4 (sólo para los cálculos)
Texto5=Nz([texto3];"") si texto3 es nulo lo transforma en cadena vacía que es diferente a los nulos
Texto5=Nz([texto3];"Adios") si texto 3 es nulo lo transforma en lo que en este momento digo
- Compartir respuesta