Te actualiza sólo 1 registro porque no recorres la query que trae los datos.
Yo usaría 2 querys, 1 para recorrer la tabla y otra para actualizar los datos.
La primera tendría como código SQL "fijo" lo siguiente:
Código SQL
[-]
SELECT CANTIDAD FROM DETALLE_FACTURAS WHERE (COD_FACT=:ParCOD_FACT) AND (CODIGO = :ParCODIGO)
NOTA: Si solamente te hace falta el campo CANTIDAD, no hagas un SELECT *
y la segunda tendría este código
Código SQL
[-]
UPDATE STOCK SET CANTIDAD=CANTIDAD-:ParCANTIDAD WHERE (COD_STOCK= :ParCODIGO)
Y en delphi
Código Delphi
[-]
procedure TF_FACTURACION.GUARDARClick(Sender: TObject);
begin
DM.Q_FACTURACION.Post;
DM.Transaction.CommitRetaining;
DM.CONSULTA.CLOSE;
DM.CONSULTA.ParamByName('ParCOD_FACT').AsString := COD_FACT.Text;
DM.CONSULTA.ParamByName('ParCODIGO').AsString := CODIGO2.Text;
DM.CONSULTA.Open;
while not(DM.CONSULTA.Eof)do
begin
DM.CONSULTA2.CLOSE;
DM.CONSULTA2.ParamByName('ParCODIGO').AsString := CODIGO2.Text;
DM.CONSULTA2.ParamByName('ParCANTIDAD').AsFloat := DM.CONSULTA.FieldByName('CANTIDAD').AsFloat;
DM.CONSULTA2.ExecSQL;
DM.CONSULTA.Next;
end;
end;