¿Formulario qué me saque las ITV que caducan antes de una fecha?

Tengo un formulario, donde aparece la matricula de un vehículo, y un formulario asociado a esta matricula donde están las Itv. Es decir

Matricula Fecha a pasar ITV Fecha Próxima ITV

O-5453-BZ 01/01/2012 30/06/2012

O-5453-BZ 01/07/2012 31/12/2012

O-5453-BZ 01/01/2013 30/07/2013

Evidentemente los datos del subformularios están guardados en una tabla llamada ITVs, en ella no solo hay un vehículo, hay varios y las distintas fechas, y ademas si esta activo (funcionado ene ese momento) que se fueron realizando las ITV ejemplo.

Matricula Fecha a pasar ITV Fecha Próxima ITV ACTIVO
O-2896-HJ 01/01/2011 25/06/2011 0

O-5453-BZ 01/01/2012 30/06/2012 -1

O-2356-CJ 03/01/2012 03/07/2012 -1
O-5453-BZ 01/07/2012 31/12/2012 -1
O-2356-CJ 04/07/2012 03/07/2012 -1
O-5453-BZ 01/01/2013 30/06/2013 -1

O-2356-CJ 04/01/2013 03/07/2013 -1

La idea es crear un formulario que al entrar me pregunte con que tiempo de antelación me avise cuando va a caducar una ITV de los vehículos activos.

Por ejemplo si hoy es día 16/06/2013 y le ponogo que me diga los vehículos que la ITV va ha caducar en 15 días me saldrá:

Matricula Fecha a pasar ITV Fecha Próxima ITV ACTIVO
O-5453-BZ 01/01/2013 30/06/2013 -1

Sin embargo si pongo 20 días saldrá:

Matricula Fecha a pasar ITV Fecha Próxima ITV ACTIVO
O-5453-BZ 01/01/2013 30/06/2013 -1

O-2356-CJ 04/01/2013 03/07/2013 -1

Evidentemente el O-2896-HJ no sale porque no esta activo, y hay que tener en cuenta que pueda que no salga ningún dato.

Yo creo que la dificultad radica en como hacer una consulta, para que me coja solo el ultimo registro de cada matricula (el que tenga la fecha próxima ITV más alta) y además este en activo. Y luego haga una búsqueda que la fecha próxima ITV sea menor a la fecha de hoy mas los días que le pongo de aviso.

1 Respuesta

Respuesta
1

La opción más sencilla es que crees una consulta sencilla con el asistente, seleccionas los 4 campos (matricula, fecha a pasar ITV, fecha próxima ITV y Activo). Luego la abres en vista diseño y le haces estos cambios:

Ordenas matricula y los dos campos de fechas en Ascendente.

Conviertes la consulta a Totales, dándole al botón con la letra Sigma. En la fila Total, le pones a los dos campos de fecha: Último, y los otros dos los dejas en: Agrupar por.

Le añades al campo Activo el criterio: Verdadero, para que sólo salgan los coches activos

Y para acabar la consulta, le añades al campo Fecha próxima ITV este criterio: <AgregFecha("d";[Añade número de días];Fecha()), para que te filtre las matriculas que tienen que pasar la ITV en por días desde la fecha actual (en el texto entre corchetes puedes poner lo que quieras)

Para acabar, creas el formulario sobre esa consulta, y cada vez que lo abras te saldrá un inputbox que te pregunta el número de días, y luego abre el formulario con los datos buscados.

Todo sale perfecto, pero se me ocurre dos cosas si se puede mejorar:

Al entrar en el formulario que me deje la opción de escoger, de entre si esta activo, no esta activo o los dos. Yo he puesto en criterio en el campo activo [Cactivo], al ejecutar el formulario aparte de pedirme los días, tengo que meter el valor 0 O -1 (verdadero o falso), lo que quiero es que salga un cuadro de texto, que puede escoger entre activo (valor -1), no activo (valor 0) o todos (0 o -1). Y no escribir 0 o -1

Ademas cuando entro en el formulario, una vez dentro que pueda, cambiar los días (en un cuadro de texto) y/o si son los que están activos, no activos o todos, y me salgan los datos solicitados. Es como si ejecutase la consulta otar vez o bien al meter otros días o al clickar en Activo, no activo o todos.

Gracias de Nuevo.

El problema que tengo en principio es como el inbox que me sale para meter los datos de [Cactivo] no se como tocarlo, para poner un cuadro de selección.

Puedes hacer lo siguiente:

Borra los dos criterios de la consulta (el de fecha y el de activo)

En tu formulario, crea un cuadro de texto independiente, y lo llamas txtDias, y un cuadro combinado que llamas cboEstado. Este cuadro combinado, si lo haces con el asistente, le dices que quieres escribir tu los valores, y pones "Todos", "Activos" y "No Activos", y le dices que guarde los valores para usarlos luego. Si lo haces manualmente, elige en tipo de origen de la fila: lista de valores y en origen de la fila, los e valores de antes, separados por punto y coma (;)

Añades un botón de comando, llamado cmdVer, y le generas este código:

Private Sub cmdVer_Click()
Dim vDias As Integer
Dim vEstado As String
Dim miFiltro As String
vDias = Nz(Me.txtDias, 0)
vEstado = Nz(Me.cboEstado, "")
If vDias = 0 Then
miFiltro = ""
Else
miFiltro = "[Fecha Próxima ITV] < " & DateAdd("d", vDias, Date)
End If
Select Case vEstado
Case "Activos"
miFiltro = miFiltro & " [ACTIVO] = -1"
Case "No Activos"
miFiltro = miFiltro & " [ACTIVO] = 0"
Case Else
'Nada
End Select
Me.Filter = miFiltro
Me.FilterOn = True
End Sub

Luego, si quieres tener un botón para quitar el filtro, añades otro botón, lo llamas cmdLimpiar, y le pones este otro código:

Private Sub cmdLimpiar_Click()

Me.FilterOn=False

End sub

Por último, si no quieres un cuadro combinado para elegir los valores del campo activo, puedes hacerlo con un cuadro de texto (sólo tendrías que cambiar en el código "cboElige" por el nombre de ese cuadro de texto) o también puedes hacerlo con un marco de opciones. En este caso, le asignarías a Todos el valor -2, a Activos el valor -1 y a No Activos el valor 0. Y el código sería este:

Private Sub cmdVer_Click()
Dim vDias As Integer
Dim vEstado As Integer
Dim miFiltro As String
vDias = Nz(Me.txtDias, 0)
vEstado = Nz(Me.mrcEstado, -2)
If vDias = 0 Then
miFiltro = ""
Else
miFiltro = "[Fecha Próxima ITV] < " & DateAdd("d", vDias, Date)
End If
Select Case vEstado
Case -1
miFiltro = miFiltro & " [ACTIVO] = " & vEstado
Case 0
miFiltro = miFiltro & " [ACTIVO] = " & vEstado
Case Else
'Nada
End Select
Me.Filter = miFiltro
Me.FilterOn = True
End Sub

Tienes otra opción, más sencilla, pero menos vistosa: Añades un botón al formulario y le pones de código: Me. Requery

Me sale un error, y creo que es por la linea

miFiltro = "[MáxDeFechaPoximaItv] < " & DateAdd("d", vDias, Date)

ya que cuando aplica el filtro, por ejemplo el criterio es <25/02/2013 y para que salga bien probando debería salir <#25/02/2013#, he probado a poner

miFiltro = "[MáxDeFechaPoximaItv] < " & #DateAdd("d", vDias, Date)# pero me da error

Si voy a filtro por formulario, y miro por lo que esta filtrado pone <25/02/2013 y el resultado es que no sale nada, pero si le pongo manualmente <#25/02/2013#, me sale perfecto. No se lo que puede estar pasando.

Y luego a veces me da error en

Me.Filter = miFiltro

se ha producido un error 2448 en tiempo de ejecución

no se puede asignar un valor a este objeto

gracias

Prueba a hacer esto:

En la consulta, renombra los campos fechas, poniendo en la fila Nombre el nombre del campo, a continuación dos puntos (:) y el nombre del campo otra vez. Ter quedaría algo así:

FechaPoximaItv: FechaPoximaItv

El error que comentas que te da en esa linea de código, es porque el formulario toma como origen del campo FechaPoximaItv y no MáxDeFechaPoximaItv.

Si aún así no se resuelve el problema, mandame la BD y le echo un vistazo. (Súbela a filebig.net o cualquier otro servidor y pega aquí el enlace)

Ya hice lo que me dijiste y ademas solucione lo de las almohadillas:

miFiltro = "[FechaPoximaItv] <= " & "#" & DateAdd("d", vDias, Date) & "#"

Lo único ahora es que la fecha en el filtro me sale en formato americano,

a ver si de una vez sale

Para el formato de la fecha prueba con:

miFiltro = "[FechaPoximaItv] <= " & "#" & DateAdd("d", Format(vDias,"mm/dd/yyyy"), Date) & "#"

Buenas otra vez y disculpa que no contestase antes, me fue corriendo el viernes al hospital nada grave. es problema de ahora es que no me aplica los dos filtros, si lo dejo como tu dices da error

Me.Filter = miFiltro

ya que pone por ejemplo

se ha producido el error '3075' en tiempo de ejecución:

Error de sintaxis (falta operador) en la expresión de consulta '[FechaProximaItv]<=#02/03/2013# [ACTIVO]=-1'

en principio por lo que veo no entiende que aplique los dos filtros en como si falta se que el filtro fuese igual a menor o igual a la fechaYal activo -1. Falta elY

he intentado lo siguiente:

Private Sub cmdVer_Click()
Dim vDias As Integer
Dim vEstado As Integer
Dim miFiltro As String
Dim miFiltro1 As String
If Me.txtDias.Value = "" Then
Me.txtDias.Value = 0
End If
If Not IsNumeric(Me.txtDias.Value) Then
MsgBox "TIENES QUE INTRODUCIR UN NUMERO DE DÍAS", vbInformation, "ERROR"
Me.txtDias.SetFocus
Exit Sub
End If
vDias = Nz(Me.txtDias, 0)
vEstado = Nz(Me.mrcEstado, -2)
If vDias = 0 Then
txtDias = 0
miFiltro = "[FechaPoximaItv] <= " & "#" & Format(Date, "mm/dd/yyyy") & "#"
Else
miFiltro = "[FechaPoximaItv] <= " & "#" & Format(DateAdd("d", vDias, Date), "mm/dd/yyyy") & "#"
End If
Select Case vEstado
Case -1
miFiltro1 = miFiltro1 & " [ACTIVO] = " & vEstado
Case 0
miFiltro1 = miFiltro1 & " [ACTIVO] = " & vEstado
Case Else
'Nada
End Select
Me.Filter = miFiltro1
Me.Filter = miFiltro
Me.FilterOn = True
End Sub

pero solo aplica el ultimo, ¿se te ocurre algo?.

gracias

¿Te importaría subirme una copia de la BD a www.filebig.net u otro similar y ponerme aquí el enlace de descarga?

Así miro directamente tu BD y te doy una respuesta a tiro fijo

he estado revisando el código y he encontrado un fallito en el que te mande previamente, y que por eso te da el error: se ha producido el error '3075' en tiempo de ejecución: Error de sintaxis (falta operador) en la expresión de consulta '[FechaProximaItv]<=#02/03/2013# [ACTIVO]=-1'

En tu código, borra Dim miFiltro1 as String, borra Me.Filter=miFiltro1, y cambia esto otro:

Select Case vEstado
Case -1
miFiltro1 = miFiltro & " AND [ACTIVO] = " & vEstado
Case 0
miFiltro1 = miFiltro & " AND [ACTIVO] = " & vEstado
Case Else

Ya esta, he dejado:

Select Case vEstado
Case -1
miFiltro1 = miFiltro & " AND [ACTIVO] = " & vEstado
Case 0
miFiltro1 = miFiltro & " AND [ACTIVO] = " & vEstado

Y le he añadido

Case -2

miFiltro1= miFiltro

case Else

para que me siga filtrando por fecha y que aparezcan Todos en estado, sino aparecían TODOS y no filtraba por fecha

Y luego si deje

Me.Filter = miFiltro1

ya que es el que concatena los dos filtros, si dejo Me.Filter = miFiltro , solo filtra el de fechas. Costo trabajo pero ya sale, muchísimas gracias por todo. Te dejo el código final:

Private Sub cmdVer_Click()
Dim vDias As Integer
Dim vEstado As Integer
Dim miFiltro As String
If Me.txtDias.Value = "" Then
Me.txtDias.Value = 0
End If
If Not IsNumeric(Me.txtDias.Value) Then
MsgBox "TIENES QUE INTRODUCIR UN NUMERO DE DÍAS", vbInformation, "ERROR"
Me.txtDias.SetFocus
Exit Sub
End If
vDias = Nz(Me.txtDias, 0)
vEstado = Nz(Me.mrcEstado, -2)
If vDias = 0 Then
txtDias = 0
miFiltro = "[FechaPoximaItv] <= " & "#" & Format(Date, "mm/dd/yyyy") & "#"
Else
miFiltro = "[FechaPoximaItv] <= " & "#" & Format(DateAdd("d", vDias, Date), "mm/dd/yyyy") & "#"
End If
Select Case vEstado
Case -1
miFiltro1 = miFiltro & " AND [ACTIVO] = " & vEstado
Case 0
miFiltro1 = miFiltro & " AND [ACTIVO] = " & vEstado
Case -2
miFiltro1 = miFiltro
Case Else
'Nada
End Select
Me.Filter = miFiltro1
Me.FilterOn = True
End Sub

Te dejo mi correo para que lo tengas [email protected]

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas