Calculo serie temporal en access

Tengo una tabla access con los datos siguientes:

Nombre fecha (en semana) peso Dif

Paco 2 55

Paco 3 54 -1

Paco 6 56 +2

Luisa 2 50

Luisa                     4                                52                 +2

Luisa                     7                               49                  -3

Necesito que en otra columna me dé la diferencia (en + o -) de los pesos refereidos a la semana anterior. En el ejempo de arriba obtener la columna Dif

2 Respuestas

Respuesta
4

Te aconsejaría que con esos campos hicieras un formulario tabular y llámalo por ejemplo Pesos. En vista diseño del formulario pon el cursor encima del cuadro de texto Dif y dale al botón derecho del ratón. Pulsa Propiedades, y en la solapa Eventos, haz clic en el evento Al recibir el enfoque. Te aparecerán, a la derecha dos botones. Pulsa el de los tres puntos horizontales . Te aparecerá

En la ventana de la izquierda elige Generador de código y Acepta. Se abrirá la ventan del editor de VB y entre Private sub Dif_GotFocus y End Sub escribe

If IsNull(DLast("peso", "pesos", "nombre=forms!pesos!nombre")) Then
Dif = 0
Else
Dif = Peso - Nz(DLast("peso", "pesos", "nombre=forms!pesos!nombre"))
End If

En las Propiedades del ese mismo cuadro de texto, en la solapa Datos. En Habilitado pon Si y en Bloqueado pon Si(así no se puede hurgar en él)

Con lo cual, cuando escribas un nombre en el formulario, si es la primera vez que lo escribes, la diferencia será cero, después, cada vez que lo anotes te hallará la diferencia con respecto a la última vez que lo pesaste.

Cualquier aclaración me lo dices

Muchas gracias por tu respuesta. Pero necesito los datos en una consulta para poder trabajarlos después.

Pero, si los datos te los guarda en la Tabla Origen del formulario. Vamos a ver si me explico., supongamos que la tabla se llama Pesos, y tiene lo campos Nombre, Semana, Peso Y Dif. Con ellos crea, con el asistente un formulario tabular. Cada cuadro de texto tendrá su origen de control en los campos de la tabla, y si haces lo que t señalé, en el cuadro de texto Dif, te aparecerá el valor y quedará guardado en el campo Dif.

Aunque en el formulario primero pongas Pilar, 23, 54 si es el primero Dif será cero y te lo guardará. Si después pones Juan como es la primera vez su dif será también 0. El día que vuelvas a pesar a Pilar, te comparará el peso que estás anotando, con el que tenía la última que la pesaste, y t pondrá, por ejemplo Dif=20 (que horror, que no se entere Pilar). Una vez que lo tienes en las tablas puedes hacer las consultas que quieras.

De todas formas, si quieres, repito, si quieres, o bien me dices tu correo, o si no quieres que se enteren de tu email, escríbeme a [email protected] y t mando un ejemplo.

Respuesta
2

Yo te propongo otra opción, para calcular las diferencias en una consulta y no necesitar guardar en la tabla la diferencia.

1º/ Inserta un módulo nuevo en tu BD, y le pegas esta función:

'---------------------------------------------------------------------------------------
' Procedimiento: fncDiferencia
' Autor: Sveinbjorn para www.todoexpertos.com
' Fecha: 10/12/2015
' Descripción: Calcula la diferencia entre un valor y el mismo valor del registro anterior
'---------------------------------------------------------------------------------------
Public Function fncDiferencia(elNombre As String, laFecha As Integer) As Double
Dim rst As Recordset
Dim miSQL As String
Dim miPeso As Double, miPesoAnt As Double
fncDiferencia = 0
miSQL = "SELECT * " _
        & "FROM [TDatos] " _
        & "WHERE Nombre='" & elNombre & "' AND Fecha<=" & laFecha & " " _
        & "ORDER BY Fecha ASC"
Set rst = CurrentDb.OpenRecordset(miSQL, dbOpenDynaset)
'Si no devuelve valores
If rst.RecordCount = 0 Then GoTo Salida
'Si es el primer registro
rst.MoveLast
If rst.AbsolutePosition = 0 Then GoTo Salida
'Si no
miPeso = rst("Peso")
rst.MovePrevious
miPesoAnt = rst("Peso")
'Realizas el cálculo
fncDiferencia = miPeso - miPesoAnt
Salida:
    rst.Close
    Set rst = Nothing
End Function

El único cambio que has de hacer es reemplazar TDatos por el nombre de tu tabla, y si los nombres de tus campos no son Nombre, Fecha y Peso, también los has dereemplazar.

2º/ Crea una cosnulta sobre tu tabla, con los campos Nombre, Fecha y Peso, y añade, una nueva columna con este encabezado:

Dif: fncDiferencia([Nombre];[Fecha])

3º/ Guardas la consulta y listo!


Visítanos: http://nksvaccessolutions.com/Foro/ 

Y si quieres almacenar la diferencia en la tabla, también puedes, lo único que has de hacer es poner en el evento "Después de actualizar" del campo "peso" esto:

Me.Dif=fncDiferencia(Me.Nombre,Me.Fecha)

Buenas. Muchas gracias por tu respuesta y por la rapidez en la misma.

La he probado y al ejecutar la consulta en el campo dif    me aparece  #Error   y no sé por qué puede ser.  Al introducir la fórmula no ha dado ningún error.  El módulo está copiado literalmente de tu respuesta y los campos y la tabla se llaman igual.

Si me dejas una dirección de correo te puedo enviar la bd de ejemplo con la que trabajo; la real llevará muchos datos.

Gracias de nuevo

¿Te da algún error de compilación? ¿Has modificado los nombres de la tabla y campos en la fórmula? Yo la he probado y no da ningún error.

Aquí te dejo el archivo que hice para probarla: http://www.filebig.net/files/zjqdhHu8K6 

Mi correo es: [email protected]

Envíala comprimida, y en el asunto por tu nombre de usuario.

¡Gracias! de nuevo

Ahora funciona.  Antes tenía la fecha en formato fecha corta, no en semana.

Voy a probarla con muchos datos.

Muchas gracias de nuevo. Con personas tan amables y generosas como tú da gusto trabajar en Access

He revisado tu BD y no te funciona por varios motivos:

1º/ El campo por el que se ordena ha de ser único, por eso cuando tienes varios registros para una misma semana hace "cosas raras"

2º/ Si modificas la función, cambiando el tipo de dato del parámetro "laFecha" de Entero a Fecha, funciona, pero en tu caso, tienes que tener también en cuenta la hora.

3º/ Deberías eliminar los campos sin fecha, para que no te salga #Error en el campo Dif. Si necesitas, por el motivo que sea, mantenerlos en la tabla, crea primero una consulta en la que filtres la tabla por los valores no nulos, y luego calcula las diferencias a partir de esa consulta. Para ello deberás cambiar en la función el nombre de la tabla por el de la consulta.

4º/ Deberías mirar cómo es la sintaxis de las consultas SQL, porque veo que no la tienes clara.

Dicho esto, te devuelvo tu archivo con la función modificada para que le pases como parámetro el campo que quieres tener en cuenta para realizar la diferencia, y así evitarte tener que hacer una función para cada uno. http://www.filebig.net/files/ps7C9HVhPp 

Un saludo.

PD: Sería de agradecer si te replanteases la puntuación de la respuesta, je je je


Visítanos: http://nksvaccessolutions.com/Foro/ 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas