Se puede hacer de mil formas. Por ejemplo, supongamos que tengo una tabla con los datos de los proveedores (para el ejemplo, lo tengo hecho con Clientes, ventas, Detalleventa, etc pero sería exactamente igual) y tengo un formulario Ventas con un subformulario DetalleVenta donde voy anotando las ventas que le hago
En esta caso, a Alfreds le he hecho 4 ventas, el 5 registro es a Antonio. Vamos a suponer que un buen día ( y nunca mejor dicho) un cliente viene a pagarte algo. Lo elegirías en un formulario
En el combinado sólo aparecen aquellos que tienen pendiente algo que pagarte(por si quieres "hacerle" una visita, pero que parezca un accidente). Elijo a uno y se abre el formulario entregas(basado en la tabla Facturas) con los diferentes importes que tiene pendiente de pagar.
Anoto la cantidad que me da y pulso Compensar y me queda como
Es decir, con esos 300, ha cancelado la primera factura, la segunda(por eso están marcadas como canceladas) y quedan pendientes 149 euros de la tercera.
Si pasan unos días y vuelve a darte algo más ¡ Bendito sea Dios !, cuando elijas ese cliente, ya solo te muestra lo pendiente
Anotaría la entrega, etc...
Y así, tanto en la tabla Facturas, (que para tí sería la de Compras) tengo lo que le he vendido(comprado), como en la tabla Entregas(pagos) tendría lo que me ha ido dando y lo que le queda por entregar. Y todas la ventas, se van acumulando sin problemas.
El código del evento Al hacer clic del botón Compensar es
Private Sub Compensar_Click()
DoCmd.SetWarnings False
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("importe", "facturas", "idfactura<=" & Me.IdFactura & "")
If Resto >= 0 Then
Cancelada = True
DoCmd.GoToRecord , , acNext
ElseIf Resto < 0 Then
Exit Sub
End If
Next
End Sub