Unir campos con fechas en un nuevo campo

Mi problemilla en consulta de access "Tengo 4 campos con fechas, quiero que en un campo nuevo me ponga la más actual de las 4 contando que hay muchos campos vacíos.

2 respuestas

Respuesta
1

No dices si ese "campo nuevo" va a estar en la tabla o en la consulta. Tampoco dices si alguna de las fechas podría ser superior a la del sistema. Así que voy a explicarte lo de los cuatro campos y luego en función de lo que me digas cambio aquí o allá.

Si tengo la tabla

Con ella hago una consulta de unión como

De forma que cuando la abro

Es decir, me los ha puesto en "vertical"

Con ella construyo una consulta

Le he puesto lo de Max, por si todas las fechas fueran menores que la del sistema. Si pudiera haber más altas bastaría con cambiar el campo Fecha por

Menor:Date()-fecha

Y agrupar por mínimo.

Cuando la abro

La cantidad más aproximada a la fecha del sistema en cada registro. Lo de Máx es porque en realidad las fecha son números.

Hola Julián, para aclarar mi pregunta,  es un campo nuevo más en la misma consulta

Ante de nada, cuando vayas a "colgar" una imagen, no la pegues, ya que luego apenas se puede ampliar y no se ve nada. Pulsa

Dicho esto, reconozco que las consultas no me gustan, prefiero el lenguaje VB. Si tengo la tabla 1 como

Creo una consulta de la forma

Donde le digo que no tenga en cuenta los nulos, ya que mientras estén vacíos no sirven para nada. De forma que me queda

Como supongo que los datos los metes a través de un formulario.

Cuando el cursor llegue al control Mascercano( aunque podría ser en cualquier otro evento

Me pone su valor máximo, lo mismo que en los otros registros

En este caso, en el evento Al recibir el enfoque le tengo puesto

Private Sub MasCercano_GotFocus()
MasCercano = DMax("fechaefecto1", "consulta1", "codigo=" & Me.Codigo & "")
End Sub

Y a medida que fueras poniendo registros, cuando el cursor llegara al control Mascercano te iría poniendo el valor más cercano a la fecha del sistema.

Respuesta
1

No necesita tanta vuelta para esto están los array. Observe este ejemplo donde lo hago mediante una función:

TABLA

DISEÑO DE LA CONSULTA

Observe como convierto las fechas a número para pasarlas a la función, como está retorna un número que es una fecha, con la función cdate() la convierto en fecha.

RESULTADO DE LA CONSULTA

Observe que en último registro el campo3 no tiene fecha, esto se remedia con la función NZ()

CÓDIGO DE LA FUNCIÓN

Public Function vrMaximo(ParamArray ArrayNums() As Variant) As Long
'Función para obtener el número mayor en un array
'Preparado por: EDUARDO PEREZ FERNANDEZ
 'Fecha: 21/03/2022
 'Ejemplo de llamada: VrMaximo(5,2,1,4)  --- Retorna 5
 '                    Para fechas se deben convertir a número
    Dim vntElem As Variant
    For Each vntElem In ArrayNums
     If vntElem > vrMaximo Then vrMaximo = vntElem
    Next
End Function

Veo que se está complicando,, si quiere solicite el ejemplo a [email protected] favor anotar en el asunto la consulta. Si fuera en un formulario igualmente se puede utilizar la función, se obtiene el mismo resultado.

Muchas gracias a los dos voy a compartir la consulta que ya funciona bien

quedaría así:

Fecha_efectos: CFecha(vrMaximo(CDoble(Nz([FEEFECTOS01]));CDoble(Nz([FEEFECTOS02]));CDoble(Nz([FEEFECTOS03]));CDoble(Nz([FEEFECTOS04]));CDoble(Nz([FEEFECTOS05]));CDoble(Nz([FEEFECTOS06]))))

Hay un pequeño detalle, que no sé si se podría arreglar, sustituir en la consulta los campos vacíos para que no salga 0:00:00

ejem:

Adicionando IIF() se soluciona, algo como:

vrmayor: SiInm(CFecha(vrMaximo(CDoble(Nz([campo1]));CDoble(Nz([campo2]));CDoble(Nz([campo3]));CDoble(Nz(([campo4])))))=0;"";CFecha(vrMaximo(CDoble(Nz([campo1]));CDoble(Nz([campo2]));CDoble(Nz([campo3]));CDoble(Nz(([campo4]))))))

Esto deja en blanco el mayor valor.

mil gracias Eduardo

De nada, menos mal tomó el camino correcto. Lo felicito

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas