Filtrar cuadro de lista por fecha

Tengo algo de conocimiento en Access y estoy tratando de hacer un calendario con la programación de citas pero cuando intento filtrar la fecha de la cita versus el cuadro de texto donde fijo el día a filtrar, por ejemplo 13 de enero, me trae las citas del 1 de enero y las del 13 de enero, es decir, no discrimina entre el 01 y el 13, ¿cómo puedo indicarle que busque la fecha exacta?

3 Respuestas

Respuesta
1

Una cosa es ver dígitos (caracteres numéricos) y otra es ver un numero, por cierto 01 no es el numero 'uno' son dos dígitos: el cero y el uno, para que sea un numero se tendrán que convertir con la función VAL.

La opción es convertir el campo (que actualmente será de texto) a numérico y lo único que perderá será el cero de adorno que le acompaña, la alternativa es convertir el numero a texto con la función Format, cualquiera de las opciones logran igualar el tipo de los términos de la comparación (1=1 o "01" = "01")

En la ventana de inmediato:

Dato="001abc"
? Val(dato)
1
? Cint(dato)
... error del sistema: ...
Se ha producido el error '13' en tiempo de ejecución: No coinciden los tipos

Hola Enrique y Eduardo, muchas gracias por las indicaciones, quiero contextualizar el caso para mayor claridad, tengo 5 cuadros de lista (un por cada día de la semana) y un cuadro de texto por cada cuadro de lista porque en cada cuadro de texto selecciono la fecha con la que quiero que el cuadro de lista me filtre las citas del día, por ejemplo 2/1/2023  (dd/mm/aaaa) al dar click en un botón activo el siguiente evento:

Private Sub BTN_CONSULTAR_AGENDAMIENTO_Click()
Dim SQL As String
SQL = "SELECT NOMBRE, HORA, ASESOR FROM CONS_AGENDADAS_CALL WHERE CONTACTAR LIKE *" & Me.TXT_FECHA_1 & "*'"
Me.LST_1.RowSource = SQL

End Sub

Así sale perfecto si manualmente selecciono una fecha por cada cuadro de texto, pero como es un calendario para la semana, en el primer cuadro de texto usé esta fórmula para que automáticamente se ubique en el primer día del mes:

=Fecha()-Format(Fecha();"d")+1

en los siguientes formulé asi:

=[TXT_FECHA_1]+1 .....=[TXT_FECHA_1]+2....=[TXT_FECHA_1]+3

Así es cuando tengo el problema, para el 2 de enero me trae las citas del 2 de enero, las del 12 de enero, las del 20,21,22,23... 29 es decir, todas las que tengan (para este ejemplo) un 2.

también lo hice dando formato de fecha: '#" & Format(Me.TXT_FECHA_1, "d/mm/yyyy") & "#"

Pero así no filtra nada

Donde TXT_FECHA_1 es el cuadro de texto donde fijaré la fecha a buscar,

Mi pregunta es: ¿Cómo logro que interprete cada cuadro de texto como una fecha como tal?

Gracias

Lo has complicado un poco.

Si el dato por el que se filtra es una fecha (un campo de tipo fecha de Access), tomar parte de la fecha no obtendrá el dato correcto, el día 5 puede ser de cualquier mes y año.

Utilizar Like no es una solución correcta, Like filtra de forma ambigua.

Esto es: por una parte de un texto, mediante los asteriscos se le puede indicar que 'comience por el dato a localizar, que finalice con el o simplemente que lo contenga, otra forma de hacer algo similar es con la función 'InStr'.

Si en un cuadro de texto se introduce una fecha, lo primero es verificar que es una fecha (en un cuadro de texto (independiente) se puede escribir cualquier cosa, afortunadamente Access dispone de una función que verifica que 'un texto' es una fecha y las traduce a numero (formato real de las fechas) la función es IsDate (texto a evaluar), devuelve un valor booleano (si/no, true/false ...).

Lo primero es verificar que la fecha es correcta
Si es correcta se filtra por ella y sumándole a la fecha una unidad se filtra por el día siguiente o sumándole siete por el mismo día de la semana siguiente.

Para filtrar fechas prefiero utilizarlas en su formato real (numero), la convertimos con dos funciones una la 'traduce' a fecha Access y la segunda la convierte en numero que es mas fácil de tratar
Como los orígenes de datos solo se diferencian en la fecha la SQL la dividimos en dos partes, una es la SQL sin fecha la otra parte es la fecha:

If IsDate(Me.TXT_FECHA_1) Then
    Dim XDia As Long, XSQL As String
    XDia = CLng(CDate(Me.TXT_FECHA_1))
    SQL = "SELECT NOMBRE, HORA, ASESOR FROM CONS_AGENDADAS_CALL WHERE CONTACTAR = "
    Me.LST_1.RowSource = SQL & XDia
    Me.LST_2.RowSource = SQL & XDia + 1
    Me.LST_3.RowSource = SQL & XDia + 2
    Me.LST_4.RowSource = SQL & XDia + 3
    Me.LST_5.RowSource = SQL & XDia + 4
    Else
    Me.TXT_FECHA_1 = ""
    Me.TXT_FECHA_1.SetFocus
    End If

Puedes analizar si el código que acompaña te es útil o sirve como referencia, se puede comprimir mediante un bucle (si te apetece, es una opción facil de implementar)

Una anotación:

Si la fecha se corresponde con un lunes, el resultado es el esperado
Si no lo es pueden aparecer días no laborables (sábados y domingos), se puede programar que dada una fecha, se ajuste al primer día laborable de la semana.

Respuesta
1

También puede utilizar la función CInt(), por ejemplo

Cint(Me. Campotexto)

Es decir, Cint("01") retorna 1 como entero

No obstante, sería conveniente saber cómo hace la consulta.

Respuesta
1

Si te tuviera que aconsejar no usaría un cuadro de texto para escribir una fecha, porque puede darse el caso de que escribas una fecha que no existe y se estaría perdiendo el tiempo. Dicho esto, lo puedes hacer de muchas, muchas formas, Por ejemplo, tengo un formulario Pedidos( aprovecho la base Neptuno), donde le he puesto un combinado llamado Elegir que me va a mostrar los días que si tienen pedido, con lo cual primero me evito tener que escribir y segundo, no escribiré ningún día que no tenga "cita"

Puedes ver abajo que hay 830 registros. Despliego el combinado y elijo una fecha, por ejemplo

En el mismo momento que la selecciono

En el origen de la fila del combinado tengo puesto

Select Fechapedido from pedidos group by Fechapedido

Y en el evento Después de actualizar del combinado Elegir

Private Sub Elegir_AfterUpdate()
Me.RecordSource = "select * from pedidos where fechapedido=#" & Me.Elegir & "#"
End Sub

Es decir, que el origen de registros del formulario sean aquellos de la tabla Pedidos en que el valor del campo FechaPedido sea igual al que acabo de seleccionar en el combinado.

Este combinado lo puedes poner en el mismo formulario Pedidos o en otro cualquiera. En este último caso la instrucción la deberías poner como

Docmd.openform"Pedidos",,,"fechapedido=#" & me.elegir & "#"

Es decir, ábreme el formulario Pedidos en aquellos registros en que su fecha de pedido sea igual a la fecha que acabo de elegir.

Hola Julián, muchas gracias por el su aporte, de hecho en un aparte de la base tengo esa consulta similar y me funciona muy bien, en esta ocasión lo que busco es algo así (imagen) porque requiero poder ver el agendamiento de manera ordenada e identificar errores o tiempos disponibles, por ello y para no ir seleccionando los días uno a uno utilicé las fórmulas para que fuera automático pero como indico, me trae las fechas "parecidas" a un mismo cuadro

Carlos, personalmente creo que estás trabajando demasiado. Verás, 54 solapas para las semanas de un año me parece exagerado. No necesitas ninguna, es mucho más simple. Mira, supongamos que tengo la tabla Tareas, más o menos como en la imagen

Y tengo un formulario Inicio desde donde voy a "dirigir" todas las operaciones

Para no tener que estar escribiendo día a día con sus horas respectivas le digo que me cree el mes entero. Para eso, en el cuadro de texto escribo el primer día de un mes. En este caso le pongo el día que ves. Al pulsar Crear me deja la tabla

Como he visto que no trabajas ( haces muy bien) ni los sábados ni los domingos le he dicho que no los cree, por eso empieza el día 2 y que le ponga las horas desde las 9 de la mañana a las 5 de la tarde( no sé que horas trabajas). Como ya tengo creado el mes, voy a anotar unas citas un día, para ello, en el cuadro de texto de la derecha escribo el día( yo personalmente preferiría elegirlo)

Al pulsar Ir, me abre el formulario Tareas en ese día, en vista diálogo, para que las anote

Escribo lo que tenga que escribir.

Vamos a suponer( lo digo por tu imagen) que quiero saber lo que tengo para una semana. En el formulario Inicio, selecciono una. Para el ejemplo, selecciono la 1

Y al seleccionarla, se abre el formulario Semanal cono

No hay más nombre ni asesores porque no los he escrito.

El código es muy sencillo, aunque para aquí sería un poco largo, por eso, si quieres, repito, si quieres, mándame un mensaje ( sólo el mensaje) a [email protected] y te mando el ejemplo.

Si lo haces, en el asunto del mensaje pon tu alias Carlos Buitrago, ya que si no sé quien me escribe ni los abro.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas