Como Contar Registros en Access con una fecha anterior a hoy?

Tengo una base de datos con productos ("Productos") en los que se guarda Nombre_Producto (string), Precio y Fecha_Caducidad (Date). En la fecha tengo una máscara de formato Short Date (dd/mm/yyyy).

Desde un formulario, quiero saber el numero de productos que han caducado hoy pero no consigo que el resultado sea el correcto. Estoy utilizando la funcion Dcount.

Dim Caducados as Integer

Caducados = Dcount ("[Nombre_Producto]",  "Productos",  "[Fecha_Caducidad] < #" & Date & "#")

El problema es que el resultado siempre sale el numero total de registros y no únicamente los que el campo fecha es anterior a hoy. ¿Alguien qué por favor me diga qué está mal? Es Access 2013

2 respuestas

Respuesta
1

Tus razones tendrás para ponerlo así, pero si tengo la tabla DetallePedidos, con 15 "caducados" y 5 que no

En un cuadro de texto de un formulario cualquiera pongo

Cuando lo abro

Es decir, cuéntame aquellos registros de la tabla Detallepedido en que su campo FechaVenta sea menor que la del día de hoy.

¡Gracias!  Lo curioso es que así si me funciona. Si creo una casilla en el formulario y le pongo como valor por defecto este, si que lo cuenta bien el resultado es el correcto. El problema es que lo quería tener con vba, y ya me pica la curiosidad de por qué no está funcionando cuando lo hago con código.

Puedes hacerlo de muchas formas. Lo puedes poner en cualquier evento, al activar el registro, después de actualizar otro cuadro de texto, etc, al recibir el enfoque, etc. Sería casi igual

Texto14=dcount("*","detallepedidos","fechaventa<Date")

Las separaciones en vez de punto y coma son comas

Es más, opino que es mejor hacerlo en Vb, porque con la instrucción Dcont... ocupas el origen de control y si quisieras guardarlo, al tener el origen del control ocupado, tendrías que decírselo en VB, con lo cual estarías duplicando instrucciones y de lo que se trata es de trabajar lo menos posible.

¡Gracias!   Como he dicho antes a Sveinbjorn ya me esta funcionando. Creo que el error viene de pasar Fecha_Caducidad entre corchetes, ha sido quitar los corchetes y todo bien.   La verdad es que a veces me lío en cuando pasar corchetes, cuando comillas y cuando apostrofes  :-)    A ver si me lo repaso...

Es opinión mía, pero te aconsejo que nunca le pongas as los campos, tablas, y objetos en general con nombres separados, ya se lo pondrás bien en la etiquetas. Vamos a suponer que un campo lo llamas Nombre Cliente, y en una instrucción SQL o de VB, sin querer lo pones como Nombre Cliente. Te puedes volver loco al ver que no funciona y es porque entre Nombre y Cliente he puesto dos espacios, y prácticamente no se nota. Mientras que si lo pones todo junto nunca te equivocarás. Por otro lado, si lo pones todo junto, tanto en SQL como en VB no tienes que estar preocupándote de si lleva o no lleva corchetes o dobles comillas. Si va todo junto lo pones tal cual.

Y un último consejo, cuando escribas una instrucción escríbela siempre en minúsculas. Si al terminar y apartar el cursor de esa línea no pone las mayúsculas en su sitio échate a temblar, está mal escrita.

Respuesta
1

El problema con tu código está en como interpreta Vba las fechas: para Vba las fechas están en formato americano (mm/dd/aaaa), mientras que en tu bsd las tienes en formato europeo (dd/mm/aaaa). En consecuencia Date devuelve 04/05/2020 que al comparado con los datos de tu Bd, se hace "la picha un lío" y la entiende como 4 de mayo, y por eso devuelve cosas erróneas.

Puedes solucionarlo usando la función Format() en ambos lados de la comparación, así no hay margen de error :

"Format(Fecha_Caducidad,'mm/dd/yyyy')< #" & Format (Date,"mm/dd/yyyy") & "#")

¡Gracias!  parece pero sigue habiendo un error que no soy capaz de identificar. Ahora lo que ocurre es que me devuelve = 0, como si no hubiera habido ninguno. Estoy con una tabla sencilla de pruebas, 2 anteriores y 3 posteriores a la fecha, tendría que devolver = 2

Prueba así:

Caducados = DCount("*", "Productos", "Format(Fecha_Caducidad,'mm/dd/yyyy')< #" & Date & "#")

o así:

Caducados = DCount("*", "Productos", "Fecha_Caducidad< #" & Format(Date, "mm/dd/yyyy") & "#")

Yo acabo de probar las dos opciones y funcionan: http://www.filebig.net/files/iyXyjn2uMK 

Incluso probé una tercera (que me dejó "volado"), que también te indico en el ejemplo que curiosamente también funciona. Y sin embargo, la lógica me dice que en vez de esa la que tendría que funcionar era la que te propuse inicialmente.

Por último, mencionar que si la función Date() la metes dentro de la cadena de criterios (como en la propuesta de Julian), el propio Access se encarga de formatear la fecha correctamente según la configuración regional del equipo. Es decir, que si pones:

Caducados = DCount("*", "Productos", "Fecha_Caducidad< Date()")

También te funcionará.

¡Gracias! Muchas gracias a los 2. Ya he conseguido que funcione, lo he hecho con la ultima y como también apuntada Julián... Un placer contar con gente que te puede echar una mano. Saludos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas