Problema con fecha

Cordial saludo, solicito su ayuda para solucionar el siguiente problema:
Administro una Bd en la cual tengo un formulario donde ingreso datos de una tienda y una fecha de un documento que genera la tienda, la cual no se puede repetir, ninguno es un dato indexado porque se demora la consulta, me cuenta la persona que la manejaba antes, yo estoy proponiendo crear un rango de fecha de un mes hacia atrás a partir de la fecha del sistema, pero al realizar la búsqueda de la fecha no me funciona, en cambio con el código de la tienda si funciona a la perfección.
Se que access maneja fechas invertidas #mm/dd/yy#, pero tampoco funciono.
Adjunto código
Muchas gracias.
Private Sub txtMdc_Exit(Cancel As Integer)
Dim varY As Variant
Dim msg As String
varY = DLookup("[fechaMdc]", "Table1", "[fechaMdc]=" & Forms![form1]!txtMdc)
If varY = txtMdc Then
msg = MsgBox("fecha mdc ya digitada" & vcrlf & varY, vbCritical, "validacion")
Else
msg = MsgBox("ok", vbInformation, "valida")
End If
End Sub

1 respuesta

Respuesta
1
Si quieres manejar formatos de fechas, te digo como lo hago yo de dos maneras:
a) Cuando es para formatos de mostrar datos ya introducidos, es rápido utilizar el mismo formato que excel, pongo el dato en una celda de excel, le doy el formato a la celda, y lo copio la cadena de texto que define el formato al control que quiero, bien en las propiedades o bien se lo asigno por código con la función Format. Es rápido, casi siempre funciona bien (a veces falla por la configuración regional de cada equipo), más fácil la cuestión de los formatos en excel que en access y lo llevas de uno a otro, es bueno para datos introducidos.
b) Cuando es para introducir datos, y quiero que ser yo quien controle la base de datos, hago lo siguiente:
- Descompongo la fecha introducida, generalmente como cadena de texto y luego convertida a fecha
- La descompongo con las funciones year(), month() y day(), y la vuelvo a componer como quiero con la función cDate.
Para tu caso
El dato fecha internamente se almacena como un doble, la parte entera corresponde al día y la parte decimal a las horas (lo puedes ver claramente en Excel).
Lo más seguro es ignorar el formato y trabajar con el dato, y lo puedes hacer de dos maneras:
a) Pasando el valor de la tabla y el digitado con el que comparas a un long (tendrás sólo la parte correspondiente al día), pero aquí ocurren varias cosas que te pueden generar algo de incertudimbre al redondear un doble a long, debería ser seguro utilizando fix(), por lo que sólo te lo aconsejo para un apuro o salir del paso.
b) Maneja y controla tu lo que hace la base de datos, descompones las fechas que comparas y las vuelves a componer antes de comparar:
Dim Fecha1 as double
Dim Fecha2 as double
Dim Dia1 as long
dim Dia2 as long
Fecha1 = ...
Fecha2 = ...
dia1=cdate(day(fecha1)&"/"&month(fecha1)&"/"&year(fecha1))
Esto debería funcionar igual con dia1=fix(fecha1)
y lo mismo para fecha2 y dia2
ahora compara dia1 y dia2
Hacerlo de esta manera te permite descontar ese mes que quieres
dd_dia=day(fecha)
mm_dia=month(fecha)
yy_dia=month(fecha)
...
mm_dia = mm_dia -1
if mm_dia = 0 then
mm_dia = 12
yy_dia = yy_dia - 1 (para descontar un mes a enero y pasar a diciembre del año anterior)
end if
De esta manera descuentas meses enteros, la otro opción es hacer fecha = fecha - 30, quitándole 30 días y no derá exacto en meses distintos de 30 días
De todas maneras creo que deberías dar una vuelta a lo de los índices, en teoría y según mi experiencia los indices aceleran el funcionamiento de las bases de datos. He tenido casos de bases de datos con índices geoespaciales (sistemas de información geográfica), que llegan a acelerarse más del doble utilizando índices.
Muchas gracias por su sugerencia, este fin de semana voy llevar a cabo sus consejos y le comentare.
ahhh otra cosa debo olvidarme de la función DLookUp
Gracias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas