Hola
Aqui Hell_Raiser tiene razon, en parte.
Si haces una consulta y luego cierras el query los datos se perderan, salvo que los guardes en algun sitio, por eso te recomendo Hell_Raiser el uso de otro query.
Bien, si te empeñas en usar solo uno, entonces tienes que guardar los datos en algun sitio.
clave y costoac son datos sacados de la consulta, si la cierras los pierdes, entonces como recogerlos, pues con una variable.
Código Delphi
[-]
Var
Clave : String;
costoac: Real;
begin
Zcompras.SQL.Text:= 'SELECT Cantidad, CostoF, Subtotal, CostoAc,Clave FROM compras ';
Zcompras.open;
if( Edit3.Text<> '') then
begin
cantidad:= Zcompras.Fields[0].AsInteger;
precio:= Zcompras.Fields[1].AsFloat;
sub:= Zcompras.Fields[2].AsFloat;
anterior:= Zcompras.Fields[3].AsFloat;
clave:=Zcompras.Fields[4].asString;
distribuir:=strtofloat(Edit3.Text);
porcentaje:=(Precio/Updatesub)*100;
miparte:=(distribuir*porcentaje)/100;
CostoNuevo:=miparte/cantidad;
costoac:=trunc(anterior+CostoNuevo);
Zcompras.SQL.Text:= ' update compras set CostoAc = :costoac WHERE Clave = :clave';
Zcompras.ParamByName('costoac').AsFloat:= costoac;
Zcompras.ParamByName('clave').AsFloat:= clave;
Zcompras.ExecSQL;
end;
end;
Revisalo, veras que hay mucho menos codigo y esta mas legible.
Ademas solo usas un query.
Saludos