Casimiro, creo que este ejemplo en particular lo puedo resolver definiendo claves unicas en Firebird, con esto evito que se duplique la factura en la tabla nomina.
Como expuse anteriormente, esto es solo un ejemplo. En la realidad si pudiese darse que una factura este en dos nomina distintas, pero en este caso la condicion sería que la sumatoria de los montos de la tabla nomina no puede ser mayor a el valor de la factura.
Las tablas estan difinidas como sigue:
Facturas:
-id_factura
-rut
-total
...
Nomina
-id_nomina
-id_factura
-monto
...
Si llevamos esto a SQL, para listar las facturas que no tienen nomina, o que su monto en monina sea menor que el monto de la fatura, lo realizo con un procedimiento almacenado.
Código SQL
[-]
for select f.id_factura, rut, total from facturas into :id_factura, :rut, :total do
begin
select sum(monto) monto_total from nomina where id_factura =:id_factura
into : monto_total
suspend;
end
Donde id_factura, rut, total y monto_total son parametro de salida.
De esta forma aparecería la factura 2, si es que la sumatoria de los montos en la nomina es menor que el total de la factura.
Sin embargo, sigue el problema original, en caso de tener 2 o más usuario intentanto asociar la misma factura a una nomina, previmente con el mismo listado.
Con la clave unica no puedo resover esto.
Alguna idea?