Error en consulta de fechas y condiciones

Tengo un formulario de consulta donde coloco un rango de dos fechas adicional debo colocar un código de producto y seleccionar una condición, esto con el fin de buscar cuantas veces ha ingresado un código según una condición (BUENO, DAÑADO, REPARADO, SIN GARANTÍA) entre un rango de fecha, anexo la pantalla:

Pero al momento de realizar la programación me de error:

Private Sub btnBusqueda_Click()
Dim SQL As String
If validaFechas Then
SQL = "SELECT *"
SQL = SQL & " FROM Garantias_productos"
SQL = SQL & " WHERE Fecha_recepcion BETWEEN #" & Format(Me.txtFechaInicial, "mm/dd/yyyy") & "# AND #" & Format(DateAdd("s", 86399, Me.txtFechaFinal), "mm/dd/yyyy hh:nn:ss") & "# AND [Codigo_producto] = '" & Me.Codigo_producto & "'# AND [Condicion] = '" & Me.Condicion & "'"
Forms!Consulta_Garantias_Codigo_Condicion!Consulta_Garantias_Tecnicos.Form.RecordSource = SQL
End If
End Sub

No logro dar con el error, por favor ayuda.

Cabe destacar que también tengo una pantalla similar donde solo consulto el rango de fecha + el código y funciona perfecto, no fue hasta que agregue un criterio más (CONDICIÓN) y empezó a fallar.

3 respuestas

Respuesta
1

Si las fechas no tienen (o se les elimina) la parte decimal, no seria necesaria la función DateAdd

Si las fechas se utilizan en formato numero, Between trabajara mejor y si limpias el carácter (#) que quedo por el medio de codigo_producto y condición se evitara el error.

En principio:
Format(DateAdd("s", 86399, Me.txtFechaFinal), "mm/dd/yyyy hh:nn:ss")

Format(int( Me.txtFechaFinal)), "mm/dd/yyyy") 

Y

... '" & Me.Codigo_producto & "'# AND [Condicion] = '" & Me.Condicion & "'" ...
... '" & Me.Codigo_producto & "' AND [Condicion] = '" & Me.Condicion & "'" ...

Format(int( Me.txtFechaFinal)), "mm/dd/yyyy")

Sobra un paréntesis:
Format(int( Me.txtFechaFinal), "mm/dd/yyyy")

Creo que lo hice pero ahora no me muestra nada:

Private Sub btnBusqueda_Click()
Dim SQL As String
If validaFechas Then
SQL = "SELECT *"
SQL = SQL & " FROM Garantias_productos"
SQL = SQL & " WHERE Fecha_recepcion BETWEEN " & Format(Me.txtFechaInicial, "mm/dd/yyyy") & " AND " & Format(Int(Me.txtFechaFinal), "mm/dd/yyyy") & " AND [Codigo_producto] = '" & Me.Codigo_producto & "' AND [Condicion] = '" & Me.Condicion & "'"
Forms!Consulta_Garantias_Codigo_Condicion!Consulta_Garantias_Tecnicos.Form.RecordSource = SQL
End If
End Sub

Quitar un carácter (posible resto olvidado en un experimento) no significa quitar TODOS los caracteres de ese tipo y pasar los datos de fecha sin las marcas que les corresponden.

Le añades a la fecha final 'casi' 24 horas (86399 segundos) para que añada los registros del último día (que tienen parte horaria y quedarían 'fuera'), esto último se evita si se le quita la hora a ambos términos (a uno no se le añade nada y al otro se le quita la hora, tan sencillo como INT(el día que sea).

Otra opción para obtener el resultado deseado es añadir un día a la fecha final (sin parte horaria, que por defecto será 0:00) y dejar sin manipular la fecha (la que tiene parte horaria y defines con horas minutos y segundos) que podía quedar asi:

1.-...  AND #" & Format(INT(Me.txtFechaFinal), "mm/dd/yyyy") & "# AND ...
2.-... AND #" & Format(Me.txtFechaFinal +1 , "mm/dd/yyyy") & "# AND ...

Con ambas formulas obtiene lo mismo que con:

... AND #" & Format(DateAdd("s", 86399, Me.txtFechaFinal), "mm/dd/yyyy hh:nn:ss") & "# AND ...

Mi consejo: Utiliza lo que veas más claro y con lo que logres el resultado que deseas.

Respuesta
1

El error lo tienes en

 '" & Me.Codigo_producto & "'# 

Le sobra el último carácter

Pero, de todas formas, no necesitas usar nada de Format... Puedes usar perfectamente between forms! Consultagarantias! FechaIni and forms! Consultagarantías! FechaFin, Así, te usará el valor real que figura en ese momento en el control FechaIni y en FechaFin, independientemente de su formato.

Además, en esa expresión que usas, si alguna vez dejaras algún control del encabezado, sin rellenar, como uno de los valores sería Nulo, no te funcionaría. Por ejemplo, si tengo el formulario con dos cuadros de texto y dos combinados, más o menos como es tu caso, puede darse el caso de que alguna vez quiera filtrar única y exclusivamente entre fechas, otra vez, entre fechas y un pais, o filtrar sólo entre dos países, o... Entonces lo que has escrito no te sirve para nada. Mira, voy a filtrar entre fecha( puedes ver que hay 170 países)

Cuando pulso Filtrar, me lo deja reducido a los paises que están entre ellas

Han quedado reducidos a 30

Vamos a suponer que quiero filtrar por un país entre dos fechas

Cuando pulso Filtrar

Etc. Esto es lo que se llama Filtros múltiples.

Como tengo tu email, si quieres que te envíe el ejemplo dímelo, o me mandas un mensaje.

Respuesta
1

Si quiere profundizar en filtros lo invito a ver mi video en YouTube

https://www.youtube.com/watch?v=vnmVcfBwtIw 

¡Gracias! Por su respuesta, de verdad me parece un video muy completo pero lamentablemente no tengo conocimientos avanzados del tema, pero la duda que tengo actualmente posiblemente usted pueda resolverla rápidamente, le cuento:

Tengo un cuadro de consulta, donde ingreso una fecha de inicio, una fecha fin y una condición (Condición de un producto en garantía), con estos 3 criterios la consulta me funciona de maravilla, me trae todos los registros que cumplen esos criterios, bien, realmente lo que quiero es que validando los criterios, si en los registros se encuentran 3 productos del mismo código, con la misma condición (Sea BUENO, DAÑADO o REPARADO) y en el mismo rango de fecha solamente se muestre 1 y al final me muestre la cantidad total del producto que cumple con estos criterios, anexo imágenes:

Formulario:

Este formulario tiene como origen una consulta:

Al momento de realizar la busqueda:

Como ven en la ultima imagen me trae 2 productos con el código AC0203 con la misma condición, quisiera que solo se mostrara una vez y al final exista un campo texto con la cantidad de veces que se repite este registro:

Disculpen hice mi planteamiento mal, no necesito la veces que se repite un registro necesito que si hay un registro que se repite varias veces solo me muestre uno solo y me sume las cantidades de ese producto en total

Espero que este ejemplo le solucione su problema.

TABLA

FORMULARIO CON TODOS LOS DATOS

Ahora selecciono un rango de fechas y condición "BUENO"

Ahora cambio la condición a "DAÑADO"

Ahora cambio el rango de fechas y condición a "REPARADO"

Código del evento Después de Actualizar del cuadro combinado

Private Sub cboCondicion_AfterUpdate()
  Dim strSQl As String
  If Not IsDate(Me.txtFechaInicial) Or Not IsDate(Me.txtFechaFinal) Then
    MsgBox "Se requiere un rango de fechas", vbInformation, "Le informo"
    Me.txtFechaInicial.SetFocus
    Exit Sub
  End If
  If Me.txtFechaFinal < Me.txtFechaInicial Then
    MsgBox "La fecha final debe ser mayor que la inicial", vbInformation, "Le informo"
    Me.txtFechaInicial.SetFocus
    Exit Sub
  End If
  strSQl = "SELECT Garantias_productos.Codigo_producto" & vbCrLf
  strSQl = strSQl & "           , First(Garantias_productos.Descripcion) AS DESCRIPCION" & vbCrLf
  strSQl = strSQl & "           , First(Garantias_productos.Condicion) AS CONDICION" & vbCrLf
  strSQl = strSQl & "           , Sum(Garantias_productos.Cantidad) AS CANTIDAD" & vbCrLf
  strSQl = strSQl & "        FROM Garantias_productos" & vbCrLf
  strSQl = strSQl & "       WHERE Garantias_productos.Fecha_recepcion Between " & "#" & Format(Me.txtFechaInicial, "mm/dd/yyyy") & "#" & vbCrLf
  strSQl = strSQl & "         AND " & "#" & Format(Me.txtFechaFinal, "mm/dd/yyyy") & "#" & vbCrLf
  strSQl = strSQl & "         AND Garantias_productos.Condicion='" & Me.cboCondicion & "'" & vbCrLf
  strSQl = strSQl & "    GROUP BY Garantias_productos.Codigo_producto;"
  Me.RecordSource = strSQl
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas