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

Respuesta
1

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

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas