Hola.
Le explicación que di corre para cualquier base de datos, no hay restricción por el motor que uses.
Otro punto. Sobre el diseño de la tabla no veo necesario que esa sea la estructura. Bien podria ser:
ID----Detalle----Movim
1____Compra___ 100
2____Venta_____-50
3____Venta_____-20
Incluso si no quieres usar el signo negativo tendrías entonces que preguntar por el campo Detalle pero mejor es usar el signo.
Como fuere, siguiendo tu table, para armar el informe que quieres tendrías que hacerlo con un Stored Procedure o alli si usando ADO para armar el campo de saldos ya que tendrías que recorrer cada registro. Lo haremos con ADO:
Haces tu consulta normal pero agregas el campo Saldo
rs.Open (" Select ID, Detalle, Ingresos, Salidas, ' ' as Saldo "), dB, adOpenDynamic, adLockPessimistic
y luego vas llenando en el campo Saldo los saldos.
<<<< Aqui el código sugerido >>>
If rs.RecordCount > 0 Then
For i = 1 To rs.RecordCount
If Val(rs!Ingresos) > 0 Then Movimiento = Val(rs!Ingresos) Else Movimiento = Val(rs!Egresos)
If i = 1 Then
rs!SALDO.Value = Movimiento + SaldoPrevio '<-- esto si usas rango de fechas y ya traes un saldo previo
NuevoSaldo = Movimiento + SaldoPrevio
Else
rs!SALDO.Value = Movimiento + NuevoSaldo
NuevoSaldo = Movimiento + NuevoSaldo
End If
rs.Update
rs.MoveNext
Next i
End If
y luego llena el grid o reporte con el rs y listo.