PDA

Ver la Versión Completa : campos calculado "Stack over Flow"


chileno
31-08-2006, 18:02:00
hola de nuevo!!!

esto se me escapa de mis manos asi que recurro a todos que me hechen una mano, la situcion es la sgte:


procedure TDM.tbPrecioCalcFields(DataSet: TDataSet);
begin
if not (DataSet.State = dsInsert) then
begin
DataSet.FieldByName('Total_Cargos').Value := tbCargos.FieldByName('embalaje').Value + tbCargos.FieldByName('comision').Value +
tbCargos.FieldByName('otros').Value +
ObtenerValor(Dataset.FieldByName('id_tipo_precio').Value);
DataSet.FieldByName('Precio_Venta').Value := ((tbUnidad_Venta.FieldValues['Costo'] * DataSet.FieldByName('Total_Cargos').Value)/100) +
tbUnidad_Venta.FieldValues['Costo'];
DataSet.FieldByName('embalaje').Value := (tbUnidad_Venta.FieldValues['Costo'] * tbCargos.FieldByName('embalaje').Value)/100;
DataSet.FieldByName('comision').Value := (tbUnidad_Venta.FieldValues['Costo'] * tbCargos.FieldByName('comision').Value)/100;
DataSet.FieldByName('otros').Value := (tbUnidad_Venta.FieldValues['Costo'] * tbCargos.FieldByName('otros').Value)/100;
DM.miSQL.Close;
DM.miSQL.SQL.Clear;
DM.miSQL.SQL.Add('select transporte from tipo_precio where id_tipo_precio = ' + floattostr(Dataset.FieldByName('id_tipo_precio').Value));
DM.miSQL.Open;
DataSet.FieldByName('trasporte').Value := (tbUnidad_Venta.FieldValues['Costo'] * DM.miSQL.Fields[0].Value)/100;
DM.miSQL.Close;
DM.miSQL.SQL.Clear;
DM.miSQL.SQL.Add('select utilidad from tipo_precio where id_tipo_precio = ' + floattostr(Dataset.FieldByName('id_tipo_precio').Value));
DM.miSQL.Open;
DataSet.FieldByName('utilidad').Value := (tbUnidad_Venta.FieldValues['Costo'] * DM.miSQL.Fields[0].Value)/100;
end;


el problema surge cuando modifico el campo atravez de un campo de busqueda asoaciado a un dbgrid y me lanza el sgte mensaje "Stack over Flow".... cualquier sugerencia es de ayuda !!!

Héctor Randolph
31-08-2006, 18:33:41
Seguramente el evento tbPrecio.OnCalcFields se está llamando recursivamente y se desborda la pila.

Una posible solución es que dentro del código desactives el evento para que no se dispare nuevamente al modificar la tabla de precios.


procedure TDM.tbPrecioCalcFields(DataSet: TDataSet);
begin
tbPrecio.OnCalcFiels:=nil;//desactivas el evento para evitar recursividad

{....tú código ....}

tbPrecio.OnCalcFields:=tbPrecioCalcFields;//Lo activas nuevamente antes de salir
end;



Saludos

ramiretor
31-08-2006, 18:50:07
Hola
¿Estás seguro de no hacer una división sobre cero o algo similar?

Saludos

chileno
31-08-2006, 18:50:49
hola hector....

donde estas para invitarte una cerveza bien helada......:D

era justo lo que necesitaba...gracias:)

Héctor Randolph
31-08-2006, 19:49:52
donde estas para invitarte una cerveza bien helada......


Gracias, tomaré una bien helada a tu salud. Así me la recetó el doctor ;)