Hugo, por si te puede dar una idea. Pero es en Access. Si tengo un formulario donde voy vendiendo a los clientes

Puedes ver que hay cuatro facturas de ventas, 3 a un cliente y una a otro. Como vender es fácil, lo verdaderamente difícil es cobrar, tengo un formulario Entregas, por si algún día, ojalá, a un cliente le dé el arrebato de darme algo de dinero. Hay que cuidarlo porque de esos no hay muchos. Abro el formulario Entregas y busco ese cliente.

Me dice que me debe 555,10 euros y como te decía, en un memento de debilidad decide darme 300. Lo escribo en Entrega y pulso el botón Compensar. En ese momento

Me dice que aún me debe 255,10, que ha cancelado la primera factura, que de esos 300 le han sobrado 182 y que con esos ha compensado parte de la segunda pero que aún le quedan 22 euros( amén de los 233,1)
Pasan unos días y a ese cliente le da por traerme más dinero ( ya te dije que hay que cuidarlo que de esos hay pocos). Abro el formulario Entregas, localizo ese cliente y ya no me aparecen las facturas canceladas

Anoto lo que me da, en este caso 100 euros y pulso el botón de compensar y me lo deja como

Es decir, compenso lo que quedaba pendiente y como le sobraron 78 euros los descontó de la tercera y ahora sólo me debe 155, 10, que quizá algún día lo cobre. Y si en el ínterin le has ido vendiendo va añadiendo las nuevas facturas al formulario.
En este caso, repito, en este caso el código del botón es
Private Sub Compensar_Click()
DoCmd.SetWarnings False
DeudaPendiente = DeudaPendiente - Entrega
DoCmd.RunSQL "insert into entregas(idcliente,fechaentrega,entrega)values(idcliente,date(),entrega)"
DoCmd.GoToRecord , , acFirst
Dim i As Integer
For i = 1 To Me.Recordset.RecordCount
Resto = DSum("entrega", "entregas", "idcliente=" & Me.IdCliente & "") - DSum("totalventa", "ventas", "idventa<=" & Me.IdVenta & " and idcliente=" & Me.IdCliente & "")
If Resto >= 0 Then
Cancelada = True
DoCmd.GoToRecord , , acNext
ElseIf Resto < 0 Then
Exit Sub
End If
Next
End Sub
Como te decía es por si te puede dar una idea.