Una observación/pregunta.
Cuando haces una actualización como la que describes, en el fondo estás generando una consulta SQL por cada registro que recorres en el ciclo. ¿No te sería más eficiente hacerlo de un sólo golpe con un par de consultas:
Código SQL
[-]
update tabla
set subtotal = cant_comp*cost_unt*factor_desc/100
where subtotal = 1
Código SQL
[-]
update tabla
set subtotal = cant_comp*cost_unt*factor_desc/100
where subtotal <> 1
Claro que está el detalle aquí de que la condición incluye el campo que se actualiza pero esto lo podrías solventar añadiendo un campo bandera o reduciendo a una sóla consulta usando un condicional (no sé como sea el condicional en IB).
Además, dado que para la consulta SQL sólo necesitas un texto, puedes agregar la fórmula que desees en ejecución.
// Saludos