Problema con un campo fecha, que no muestra los resultados debidos

Estoy intentando hacer un cierre de caja en una base de datos que cree que para usar como TPV.

En primer lugar, tengo una tabla donde meto los tickets que se van generan día a día:

Para ello, creo que una consulta donde le digo que muestre los campos Fecha, NombreFormaDePago y Entregado. Como tengo la posibilidad de que en una compra te puedan pagar mediante dos formas de pago distintas, tengo que hacer unir dos consultas. Así:

SELECT Format([Fecha],"Short Date") AS Fecha1, T05FormasDePago.NombreFormaDePago, Sum(T10TPV.Entregado1) AS Entregado
FROM T10TPV INNER JOIN T05FormasDePago ON T10TPV.CodigoFormaDePago1 = T05FormasDePago.CodigoFormaDePago
GROUP BY Format([Fecha],"Short Date"), T05FormasDePago.NombreFormaDePago
UNION ALL SELECT Format([Fecha],"Short Date") AS Fecha1, T05FormasDePago.NombreFormaDePago, Sum(T10TPV.Entregado2) AS Entregado
FROM T05FormasDePago INNER JOIN T10TPV ON T05FormasDePago.CodigoFormaDePago = T10TPV.CodigoFormaDePago2
GROUP BY Format([Fecha],"Short Date"), T05FormasDePago.NombreFormaDePago;

Como ves, la fecha, al estar formateada para mostrar la fecha y la hora, tengo que "quitarle" la hora. De ahí que le cambie el formato en la consulta. Y he aquí donde creo que radica el problema.

Bien, en un formulario que uso como diálogo, utilizo el siguiente código para abrir el informe:

Private Sub CmdAbrirInforme_Click()
Dim MiArgumento As String
    Select Case Me.GrpFecha
        Case 1
            If Nz(DSum("Entregado", "CCierreDeCaja", "Fecha1=#" & Me.txtHoy & "#"), 0) = 0 Then
                MsgBox "No hay registros hoy para hacer el cierre de caja.", vbInformation, NombreBD
                DoCmd.Close
            Else
                MiArgumento = Format(Me.txtHoy, "dd") & "-" & Format(Me.txtHoy, "mm") & "-" & Year(Me.txtHoy)
                DoCmd.OpenReport "I104CierreDeCaja", acViewPreview, , "Fecha1=#" & Format(Nz(Me.txtHoy, #1/1/1900#), "mm/dd/yyyy") & "#", , MiArgumento
                DoCmd.Close acForm, Me.Name
            End If
        Case 2
            If Nz(DSum("Entregado", "CCierreDeCaja", "Fecha1=#" & Me.txtOtraFecha & "#"), 0) = 0 Then
                MsgBox "No hay registros esa fecha para hacer el cierre de caja.", vbInformation, NombreBD
                DoCmd.Close
            Else
                MiArgumento = Format(Me.txtOtraFecha, "dd") & "-" & Format(Me.txtOtraFecha, "mm") & "-" & Year(Me.txtOtraFecha)
                DoCmd.OpenReport "I104CierreDeCaja", acViewPreview, , "Fecha1=#" & Format(Nz(Me.txtOtraFecha, #1/1/1900#), "mm/dd/yyyy") & "#", , MiArgumento
                DoCmd.Close acForm, Me.Name
            End If
    End Select
End Sub

Lo que hago es comprobar que haya registros ese día. Si no hay, mensaje de aviso y cierro. Si hay, muestra el informe.

Lo que pasa es que me he dado cuenta de que no filtra correctamente, porque, por ejemplo, el 1 de agosto de 2020 no hay registros y me debería mostrar el mensaje. Sin embargo, y muy a mi pesar, muestra el informe vacío.

Además, en la consulta ordena por fecha como le sale del... (completa con lo que tú quieras):

Y, obviamente, no puedo dejar esto así tan alegremente. He intentado poner las fechas en formato americano, pero en la consulta de unión no me lo coge. Ya no se me ocurre nada más.

¿Tú sabes cómo podría solucionarlo?

1 Respuesta

Respuesta
1

El problema, me parece, está en que al usar Format() en la consulta, el campo calculado lo devuelve como texto, por eso todos los problemas que comentas.

Soluciones se me ocurren varias, la más simple, aplicar CDate() para forzar a que el campo sea fecha:

Cdate( Format([fecha],"short Date"))

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas