Restar registro anterior en consulta Access

En una consulta necesito restar a un registro el anterior. Es decir, necesitaría algo así:

¿Cómo puedo hacerlo?

2 respuestas

Respuesta
2

Con consulta necesitas un campo id correlativo tal que así:

Entonces la consulta es esta:

Si no puedes modificar la tabla creo que lo tendrías que hacer con VBA, que es sencillo de todos modos.

Hola. A ver si me puedes aclarar como hacerlo. Tal como me has indicado he creado dos tablas (tabla1 y tabla1_1) con la misma estructura:

Quiero crear una consulta que me dé el siguiente resultado (no es necesario actualizar ninguna tabla, con la visual que te indique me vale):

¿Cómo sería la consulta?

Gracias :)

No me expliqué bien, disculpa. No es necesario crear la segunda tabla; yo solamente he creado una: "Tabla1", que es la que tú tienes. Eso sí, he tenido que crear el campo "Id".

Entonces creo la consulta. Lo que hago es "añadir" dos veces la Tabla1; realmente añado la tabla1 y una copia de ella misma que access bautiza como "Tabla1_1". El ejemplo que he puesto arriba es con consulta de actualización, si lo que quieres es que sea de selección también lo puedes hacer, por ejemplo así:

Respuesta

Oscar: Ignoro si lo podrás hacer en una Consulta aunque creo que no.

Yo lo haría con un Recordset "Directo" sobre la Tabla, tal como como te escribo a Continuación.

He respetado tus Nombres de Campo, pero a la Tabla le he llamado TblDatos y ha de tener un Campo que sea autonumérico o similar para poder ordenar de modo ASCENDENTE.

Function TablaTblDatos() 'Confecciona Tabla TblDatos
Dim QryDatos As String
Dim RstDatos As DAO.Recordset
Dim NumAnterior As Double, NumActual As Double
Dim RegistroActual As Integer, RegDatos As Integer, FilaNumero As Integer
'Campos Numeracion >> Resta
On Error GoTo TablaTblDatos_TratamientoErrores
'Pongo las Variables a cero
QryDatos = ""
NumAnterior = 0
NumActual = 0
RegistroActual = 0
RegDatos = 0
FilaNumero = 0
'En modo Dynaset el de Escritura
QryDatos = "SELECT * FROM TblDatos ORDER BY NumFila ASC"
Set RstDatos = CurrentDb.OpenRecordset(QryDatos, dbOpenDynaset)
RstDatos.MoveLast
RstDatos.MoveFirst
RegDatos = RstDatos.RecordCount
If Not (RstDatos.EOF And RstDatos.BOF) Then
        Do While Not RstDatos.EOF
                RegistroActual = RstDatos.AbsolutePosition + 1
                'Si el Registro Actual es el Primero no podrá moverse al anterior y dará Error "No hay ningún Registro activo"
                If RegistroActual = 1 Then
                        With RstDatos
                                .Edit
                                        !Resta = 0
                                .Update
                        End With
                Else  'Si el registro Actual no es el Primero
                       RstDatos.MovePrevious
                        'Tomo el valor del Campo Numeración Anerior
                        NumAnterior = RstDatos!Numeracion
                        RstDatos.MoveNext
                        NumActual = RstDatos!Numeracion
                        With RstDatos
                                .Edit
                                        !Resta = NumActual - NumAnterior
                                .Update
                        End With
                End If
                RstDatos.MoveNext
                'Si con el MoveNext he llegado al Ultimo Registro salgo: OJO HE DE GRABAR DATOS EN TDatos
                RegistroActual = RstDatos.AbsolutePosition + 1
                'Llegando al Final del Recordset no podrá mover a la próxima Fila y dará Error.
                If RstDatos.AbsolutePosition + 1 = RegDatos Then
                        With RstDatos
                                .Edit
                                        !Resta = RstDatos!Numeracion - NumActual
                                .Update
                        End With
                        Exit Do
                Else
                End If
        Loop
Else
        MsgBox "Parece extraño pero la Tabla TblDatos está vacía", vbCritical, "RECORDSET VACIO"
End If
'Si está abierto el Recordset RstDatos lo cierro
If Not RstDatos Is Nothing Then
        RstDatos.Close
        Set RstDatos = Nothing
End If
MsgBox "Se han Efectuado las Restas en la Tabla Indicada", vbInformation, "CALCULOS EFECTUADOS"
TablaTblDatos_Salir:
On Error GoTo 0
Exit Function
TablaTblDatos_TratamientoErrores:
MsgBox "Error " & Err.Number & " en Funcion.: TablaTblDatos de Documento VBA: XxxxYyyyZzzz (" & Err.Description & ")"
Resume TablaTblDatos_Salir
End Function 'TablaTblDatos

Esta Función puede estar en el Modulo asociado al Formulario o en un Modulo standard.

La has de llamar desde donde y cuando quieras, pero para hacer las Pruebas pones un Botón que se llame >> BtnTblDatos y éste Código

Private Sub BtnTblDatos_Click()
Call TablaTblDatos
End Sub

Debes Obtener algo así:

Mis saludos >> Jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas