Como puedo comparar fechas entre distintas tablas?

Espero explicarme bien porque este problema creo que es un tanto complejo.

Os explico, estoy haciendo un programa que calcula lo que cobraran los trabajadores a fin de mes, hay varios datos (situados en 2 tablas), precio "fijo" (precio dia, precio hora extra, precio festivo) y total por mes (total horas extras(precio hora extra * numero horas extras)).

Por ejemplo en la tabla precio fijo, pueden haber varios registros:

Cada registro de cada tabla tiene una fecha de inicio y una fecha de fin, lo que quiero es que al entrar en el formulario que calcula el total, si pongo FechaInicio (esta fecha esta en otra tabla, es la fecha del total de cada mes) 03/02/2015 me seleccione los datos de la tabla anterior, los que estan dentro de esa fecha.

Esta es la 2 tabla, donde ingreso la fecha(03/02/2015), y al abrirse el formulario quiero que me seleccione les valores que estan dentro de esa fecha en la tabla anterior.

3 respuestas

Respuesta
1

Otra forma de hacerlo, más sencilla si no dominas código VBA y recordsets, que sería usar la función DLookUp(), como sugiero en éstas respuestas:

Tabla con rangos e importes para ser buscados con una consulta

Ubicar una cifra dentro de un rango de números ACCESS

La sintaxis de la función con algúnos ejemplos la puedes encontrar aquí: https://support.office.com/es-es/article/DB%C3%BAsq-funci%C3%B3n-8896cb03-e31f-45d1-86db-bed10dca5937  o aquí: https://support.microsoft.com/es-es/kb/285866 

Un saludo.


Me gusta como funciona el DLookup, es bastante sencillo, pero no me funciona, seguramente tenga un problema en la condición, la paso por aquí a ver si podéis ver el error.

Quiero que la fecha seleccionada esté dentro de ese rango (DiaIniciSetmanada y DiaFiSetmanada).

Public Function PrecioDia(Importe As Currency) As Currency

PrecioDia=Nz(DLookUp("preuDia","DadesEmpleat","DataInici>=Forms![3-2-Total]![DiaIniciSetmanada] & " AND DataInici <" & Forms![3-2-Total]![DiaFiSetmanada]),0)


End Function

Gracias y saludos

A ver así:

Public Function PrecioDia(Importe As Currency) As Currency

PrecioDia=Nz(DLookUp("preuDia","DadesEmpleat","DataInici>=#" & Forms![3-2-Total]![DiaIniciSetmanada] & "# AND DataFinal <#" & Forms![3-2-Total]![DiaFiSetmanada] & "#"),0)

End Function

Además, creo que tenías un error, porque estás poniendo como criterios que DataInici sea menor u mayor o igual que al fecha del formulario, y eso no te devolverá ningún valor...

Hola buenos días, te explico, si hago esto, dentro del código del formulario me funciona, pero solo al hacer click en un botón, que no es lo que quiero, lo que quiero es que lo haga cuando carga la página.

He visto en los enlaces que me has indicado antes, hacer con una función tal que así, y en el textbox ponerle de origen lo siguiente: =PrecioDia([PreuDia])

Public Function PrecioDia(PreuDia As Currency) As Currency

PrecioDia = Nz(DLookup("preuDia", "DadesEmpleat", "DataInici>=#" & Forms![3-2-Total]![DiaIniciSetmanada] & "# AND DataFinal <#" & Forms![3-2-Total]![DiaFiSetmanada] & "#"), 0)

End Function

Al ejecutarlo en el textbox me sale lo siguiente #error.

Creo que el problema esta al definir la función, que no se que significa currency, ni lo que le envío a la función.

Un saludo y gracias.

Se me ha olvidado también comentar, que también quiero que filtre por IdEmpleat(campo tabla DadesEmpleat) con Empleats.IdEmpleat (esta en el mismo formulario(3-2-Total)).

Saludos y gracias de nuevo

Ahora que lo mencionas, la función está mal definida (no me había fijado en esa parte sólo en el código de dentro de ella).

Currency significa que el tipo de dato es "moneda"

En general, cuando declaras una función haces:

Public/Private NombreFuncion (parámetros de entrada) As Tipo Datos devuelto.

En tu caso debería ser:

Public Function PrecioDia(laFechaIni As Date, laFechaFin As Date) As Currency

PrecioDia = Nz(DLookup("preuDia", "DadesEmpleat", "DataInici>=#" & laFechaIni & "# AND DataFinal <#" & laFechaFin  & "#"), 0)

End Function

Y cuando la ejecutes, le pasas las dos fechas como parámetros:

1º/ Por código:

Me.Precio=PrecioDia(Me.DataInici, Me.DataFinal)

2º/ En el origen de control del cuadro de texto:

=PrecioDia([DataInici]; [DataFinal])

3º/ En una consulta:

PrecioDia: PrecioDia([DataInici]; [DataFinal])

Respuesta
1

Akai: Supongo que habrá otras formas de hacerlo, pero yo te sugiero el uso de un Recordset, para extraer los valores una vez localizado el Rango, donde está tu Fecha de sondeo.

El código que continua Presume que:

1.- Tienes un Formulrio con Un TextBox donde introduces la Fecha que se llame TxtFecha

2.- Tu Tabla se donde buscas se llama TuTablaDatos

Entonces, en el Evento AfterUpdate de ese RexTBox le pones>>

Private Sub TxtFecha_AfterUpdate()
Dim StrSQl As String
Dim Rst As DAO.Recordset
Dim FechaBusco As Date,PrimeraFecha As Date, SegundaFecha As date
FechaBusco = “#" & Format(Me.TxtFecha, "mm/dd/yyyy") & "#"
StrSQL = “SELECT * FROM TuTablaDatos;”
Set Rst = CurrentDB.OpenRecordset(StrSQL, dbopenSnapShot)
If Not Rst.EOF And Not Rst.BOF Then
    Rst.MoveLast
    Rst.MoveFirst
    Do While Not Rst.EOF
        PrimeraFecha = “#” & Format(Nz(Rst!DataInici,#1/1/1900#),”mm/dd/yyyy”) & “#”
        SegundaFecha = “#” & Format(Nz(Rst!DataFinal,#12/31/9999#)”mm/dd/yyyy”) & “#”
        If FechaBusco  >= PrimeraFecha  AND FechaBusco <=SegundaFecha Then
            ‘Aquí capturas los datos
             'Me.TBoxElqueSea = Rst!Setmanada
              '.........etc
            Exit Do
        End If
        Rst.MoveNext
        DoEvents
    Loop
Else
    MsgBox  “Este Recordset no tene Registros”,vbCritical,”NO HAY DATOS”
End If
End Sub

Lo he ido haciendo sin probarlo pero esa es la idea. Saludos >> Jacinto

Akai: Antes del End Sub no te olvides de cerrar el Recordset con

Rst.Close

Set Rst = Nothing

Ya me contarás. Saldos >> Jacinto

Akai: Situvieras dificultades, porque el tratamiento de afechas no fuera el adecuado sustituyes el Código por este otro.

Private Sub TxtFecha_AfterUpdate()
Dim StrSQl As String
Dim Rst As DAO.Recordset
Dim FechaBusco As Date,PrimeraFecha As Date, SegundaFecha As date
FechaBusco = FormatDateTime(Me.TxtFecha, vbShortDate)
StrSQL = “SELECT * FROM TuTablaDatos;”
Set Rst = CurrentDB.OpenRecordset(StrSQL, dbopenSnapShot)
If Not Rst.EOF And Not Rst.BOF Then
    Rst.MoveLast
    Rst.MoveFirst
    Do While Not Rst.EOF
        PrimeraFecha = Format(Nz(Rst!DataInici,#1/1/1900#),vbShortDate)
        SegundaFecha = Format(Nz(Rst!DataFinal,#12/31/9999#),vbShortDate)
        If FechaBusco  >= PrimeraFecha  AND FechaBusco <=SegundaFecha Then
            ‘Aquí capturas los datos
             'Me.TBoxElqueSea = Rst!Setmanada
              '.........etc
            Exit Do
        End If
        Rst.MoveNext
        DoEvents
    Loop
Else
    MsgBox  “Este Recordset no tene Registros”,vbCritical,”NO HAY DATOS”
End If
End Sub

Saludos >> jacinto

Excelente código, cuando llegue al curro lo probaré, se me olvido comentar, que cada empleado tiene un IdEmpleado, así que haría falta hacer el filtraje con la fecha (como has explicado) y además por el idEmpleado.

Saludos

Akai: Definitivamente si tienes que filtrar por el IdEmpleado y se llama así tanto en la Tabla como en el Formulario, has de filtrar en la Consulta, de modo que el código queda así.

Los de arriba los fuí escribiendo sobre la marcha y con prisa porque ya era tarde y las prisas suelen muy amigas de los errores.

Private Sub TxtFecha_AfterUpdate()
Dim StrSQl As String
Dim Rst As DAO.Recordset
Dim FechaBusco As Date,PrimeraFecha As Date, SegundaFecha As date
FechaBusco = FormatDateTime(Me.TxtFecha, vbShortDate)
StrSQL = “SELECT * FROM TuTablaDatos WHERE IdEmpleado = " & Me.IdEmpleado
Set Rst = CurrentDB.OpenRecordset(StrSQL, dbopenSnapShot)
If Not Rst.EOF And Not Rst.BOF Then
    Rst.MoveLast
    Rst.MoveFirst
    Do While Not Rst.EOF
        PrimeraFecha = FormatDateTime(Nz(Rst!DataInici,#1/1/1900#),vbShortDate)
        SegundaFecha = FormatDateTime(Nz(Rst!DataFinal,#12/31/9999#),vbShortDate)
        If FechaBusco  >= PrimeraFecha  AND FechaBusco <=SegundaFecha Then
            ‘Aquí capturas los datos
             'Me.TBoxElqueSea = Rst!Setmanada
              '.........etc
            Exit Do
        End If
        Rst.MoveNext
        DoEvents
    Loop
Else
    MsgBox  “Este Recordset no tene Registros”,vbCritical,”NO HAY DATOS”
End If
Rst.Close
Set Rst = Nothing
End Sub

Espero que a la tercera vaya la vencida. Saludos >> Jacinto

¡Gracias por la respuesta, pero seguiré intentándolo de la manera que dice el compañero Sveinbjorn, que me parece más sencillo que no meterme en bucles y demás.

Gracias y saludos :D

Respuesta
1

Como tienes mi correo, ¿puedes mandarme una copia con un par de registros inventados? Es para hacerme una idea de lo que quieres.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas