Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-01-2016
Camilo Camilo is offline
Miembro
 
Registrado: jun 2007
Posts: 147
Poder: 17
Camilo Va por buen camino
"floating point division by zero" En unas maquinas si en unas maquinas no

Amigos foristas me sucede algo raro que no me había pasado antes y no encuentro nada parecido en red (Juro que he buscado).
Resulta que el dichoso error "floating point division by zero" me sale en algunas maquinas pero en otras no.

Resulta que tengo una form donde tengo varios procedimientos muy similares a este: de hecho este es uno de ellos:
Código Delphi [-]
Procedure TFVenta.SumaCantidad;
var
k, Suma: integer;
a, c, d: Extended;
begin
  d:= 0;
  a := StrToInt(StringGrid1.Cells[5, StringGrid1.Row]); // Precio
  c := StrToInt(Edit8.Text); //Cantidad
  d:=  (a*c); // Precio x Cantidad

StringGrid1.Cells[4, StringGrid1.Row]:=  Edit8.Text;  //CANTIDAD
StringGrid1.Cells[6, StringGrid1.Row]:=  FormatFloat('$ #0,.00',d);
StringGrid1.Cells[8, StringGrid1.Row]:= FloatToStr(d);

Suma := 0;
  StringGrid1.Cells[7, StringGrid1.Row]:= StringGrid1.Cells[1, StringGrid1.Row];
  for k := 0 to StringGrid1.RowCount - 1 do
    if k <= StringGrid1.RowCount - 1 then
      Suma := Suma + StrToIntdef(StringGrid1.Cells[8, k + 1], 0);
      Edit7.Text:=  FormatFloat('$ #0,.00', Suma);
      Edit5.Text:=  IntToStr(Suma);
end;
digamos unos 4 procedimiento muy similares que llamo desde algun boton para que se ejecute. Los nombres de las variables y la estructura misma del procedimiento en estos dias me pongo en el plan de cambiarlas para mejor comprension del codigo con alguna metodologia como "notación camello" o algo asi.
Bien pero el tema que quiero compartir con ustedes en la busqueda desesperada por cierto, de una solución es lo siguiente.

Cojo la base de datos y el ejecutable y lo llevo a una maquina (sucede como con unas 5 hasta ahora) y cuando lo ejecuto sale el error (la ejecucion es por ejemplo el llamado a la funcion). En casa y en la mayoria de las maquinas funciona perfectamente. me he dado a la tarea de evaluar cosas como sistema operativo y configuracion regional y nada. Lo que me tiene mas "Cabezon" es que en unas maquinas si funciona perfecto y en optras no aun siendo la misma base de datos y el mismo ejecutable.

Trabajo con dlphi XE y Firebird.

Gracias de antemano.

Última edición por Casimiro Notevi fecha: 20-01-2016 a las 10:16:47.
Responder Con Cita
  #2  
Antiguo 20-01-2016
Avatar de AzidRain
[AzidRain] AzidRain is offline
Miembro Premium
 
Registrado: sep 2005
Ubicación: Córdoba, Veracruz, México
Posts: 2.914
Poder: 21
AzidRain Va camino a la fama
Asegúrate de iniciar absolutamente todas las variables que intervienen antes de hacer cualquier cosa. El problema que tienes es que alguna no esta inicializada y recordemos que cuando eso pasa es imposible saber que valor le dará el sistema al momento de ejecutarse, normalmente es un valor pseudoaleatorio y en una de esas te toca un cero y eso te produce el error. De todos modos si no pones la totalidad del código lo demás es especular.
__________________
AKA "El animalito" ||Cordobés a mucha honra||
Responder Con Cita
  #3  
Antiguo 20-01-2016
Camilo Camilo is offline
Miembro
 
Registrado: jun 2007
Posts: 147
Poder: 17
Camilo Va por buen camino
Gracias amigo AzidRain por el tiempo que te tomas para ayudarme.
Con este codigo Llamo algunas funciones financieras que dan error en algunas maquinas. Se activa cuando rayamos un codigo de barras.

Código Delphi [-]
procedure TFVenta.Edit1Exit(Sender: TObject);
begin
if Trim(Edit1.Text) <> '' then
  // Esta lleno
  begin
  Actualiza;
  SumaCantidad;
  Impuesto;
  SumarImp;
  Subtotal;
  end
else
  // No esta lleno
end;

Las funciones son las siguientes:

Código Delphi [-]
Procedure TFVenta.Actualiza;
begin
with DataModule1.IBQInventarios do begin
  if active then Close; //Agregué aquí
  sql.Clear; // y aquí
  SQL.Add('Select * From INVENTARIO');
  SQL.Add('Where Codigo_Producto = '+QuotedStr(Edit1.Text));
  Open;
  if not IsEmpty then begin
StringGrid1.Row := StringGrid1.Rowcount - 1;
StringGrid1.Cells[0, StringGrid1.Row]:= fieldbyname('CODIGO_PRODUCTO').AsString;
StringGrid1.Cells[1, StringGrid1.Row]:= fieldbyname('NOMBRE_PRODUCTO').AsString;
StringGrid1.Cells[2, StringGrid1.Row]:= fieldbyname('REFERENCIA_PRODUCTO').AsString;
StringGrid1.Cells[3, StringGrid1.Row]:= fieldbyname('CATEGORIA').AsString;
StringGrid1.Cells[4, StringGrid1.Row]:= '1';   //CANTIDAD
StringGrid1.Cells[5, StringGrid1.Row]:= fieldbyname('PRECIO').AsString;

  Edit1.Clear;
  Edit1.SetFocus;
  StringGrid1.RowCount := StringGrid1.RowCount + 1;
  Sumar;
  Puntos;

  end else begin
  ShowMessage('PRODUCTO NO EXISTE EN INVENTARIO');
  Edit1.Clear;

  Edit1.SetFocus;
  end;
end;
end;


Código Delphi [-]
Procedure TFVenta.SumaCantidad;
var
k, Suma: integer;
a, c, d: Extended;
begin
  d:= 0;
  a := StrToInt(StringGrid1.Cells[5, StringGrid1.Row]); // Precio
  c := StrToInt(Edit8.Text); //Cantidad
  d:=  (a*c); // Precio x Cantidad

StringGrid1.Cells[4, StringGrid1.Row]:=  Edit8.Text;  //CANTIDAD
StringGrid1.Cells[6, StringGrid1.Row]:=  FormatFloat('$ #0,.00',d);
StringGrid1.Cells[8, StringGrid1.Row]:= FloatToStr(d);

Suma := 0;
  StringGrid1.Cells[7, StringGrid1.Row]:= StringGrid1.Cells[1, StringGrid1.Row];
  for k := 0 to StringGrid1.RowCount - 1 do
    if k <= StringGrid1.RowCount - 1 then
      Suma := Suma + StrToIntdef(StringGrid1.Cells[8, k + 1], 0);
      Edit7.Text:=  FormatFloat('$ #0,.00', Suma);
      Edit5.Text:=  IntToStr(Suma);
end;

Código Delphi [-]
Procedure TFVenta.Impuesto;
begin
DataModule1.IBQInvFact.Close;
DataModule1.IBQInvFact.ParamByName('Codigo').AsString := StringGrid1.Cells[0, StringGrid1.Row];
DataModule1.IBQInvFact.Open;
end;

Código Delphi [-]
Procedure TFVenta.SumarImp;
var
 a,b,c,d,e,f,z: Extended;
 j, Suma: integer;
begin
  z:= 0;
  a:= StrToInt(DbEdit2.Text);   //Iva
  b:= StrToInt(DbEdit3.Text);   //Otro_Imp
  c:= 1+((a+b)/100); //   Suma Impuestos
  d:= StrToInt(StringGrid1.Cells[5, StringGrid1.Row])* StrToInt(StringGrid1.Cells[4, StringGrid1.Row]); // Precio
  f:= d/c;
  z:= d-f;

  if z > 0 then

StringGrid1.Cells[7, StringGrid1.Row]:=  FormatFloat('#####', z)
else
  StringGrid1.Cells[7, StringGrid1.Row]:=  ('0');
Suma := 0;
  StringGrid1.Cells[7, StringGrid1.Row];
  for j := 0 to StringGrid1.RowCount - 1 do
    if j <= StringGrid1.RowCount - 1 then
      Suma := Suma + StrToIntdef(StringGrid1.Cells[7, j + 1], 0);
      Edit2.Text:=  FormatFloat('$ #0,.00', Suma);
      Edit14.Text:=  IntToStr(Suma);
end;

Código Delphi [-]
Procedure  TFVenta.Subtotal;
var
Precio, Impuesto, Resultado: Extended;
begin
Precio:= StrToInt(Edit5.Text);
Impuesto:= StrToInt(Edit14.Text);
Resultado:= ((Precio - Impuesto));
Edit4.text:= FormatFloat('$ #0,.00', Resultado);
Edit16.Text:=  FloatToStr(Resultado);
end;

Lo de las variables me suena muy logico. solo quiero si no es molestia que revises los codigos para que me ratifiques o como tu mismo dices, no especular.
Gracias amigo y a todos los que tengan a bien opinar y aportar sobre el tema.
Responder Con Cita
  #4  
Antiguo 20-01-2016
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Recuerda que Delphi tiene un muy buen depurador. ¿En qué línea te marca la excepción?
Responder Con Cita
  #5  
Antiguo 20-01-2016
Camilo Camilo is offline
Miembro
 
Registrado: jun 2007
Posts: 147
Poder: 17
Camilo Va por buen camino
Hola Al. No se cual linea es la del error; resulta que en la maquina donde tengo la fuente (Osea la mia) no da error por ningun lado, entonces voy a otras maquinas y ahi si bota el error. como alla ejecuto el programa no he tenido la oportunidad de ver ese detalle.
Lo que he intentado es inhabilitar partes de codigo donde creo puede estar el error pero igual me sigue saliendo y no he podido ver en donde esta.
En sintesis la depuracion en mimaquina no marca nada pero la ejecucion en algunas maquinas marca el error. en otras maquinas la ejecucion tampoco marca error.
Gracias
Responder Con Cita
  #6  
Antiguo 20-01-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
El error puede ser ocasionado por artículos que tienen precio cero. Y seguramente se produce aquí.
Código Delphi [-]
  z:= 0;
  a:= StrToInt(DbEdit2.Text);   //Iva
  b:= StrToInt(DbEdit3.Text);   //Otro_Imp
  c:= 1+((a+b)/100); //   Suma Impuestos
  d:= StrToInt(StringGrid1.Cells[5, StringGrid1.Row])* StrToInt(StringGrid1.Cells[4, StringGrid1.Row]); // Precio
  f:= d/c;
  z:= d-f;
Quiero decir que aparentemente el problema es según qué artículo se escoge, y no por la máquina donde se hace la prueba.
Responder Con Cita
  #7  
Antiguo 20-01-2016
Camilo Camilo is offline
Miembro
 
Registrado: jun 2007
Posts: 147
Poder: 17
Camilo Va por buen camino
Casimiro voy a revisar con muchos productos y te cuento. Gracias por tu interés.
Responder Con Cita
  #8  
Antiguo 20-01-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Yo creo que la excepción es muy clara:

Se produce cuando se divide un número por 0

La solución es revisar en el código donde se divida, sobre todo en donde los valores pueden venir de parte del usuario

Tenés dos alternativas, no permitir que se ingrese el 0 que va a terminar como divisor, o bien validar siempre el divisor y en lugar de dividir, cambiar el resultado por otro

Saludos
Responder Con Cita
  #9  
Antiguo 20-01-2016
Camilo Camilo is offline
Miembro
 
Registrado: jun 2007
Posts: 147
Poder: 17
Camilo Va por buen camino
gracias AgustinOrtu. tu respuesta es clara y te agradezco. ahora sigue la inquietud inicial. Incluso tal cual esta el codigo y las operaciones; ademas con la misma base y el mismo ejecutable, llamando los mismos productos (muchos de ellos para hacer pruebas). Por que en unas maquinas funciona perfectamente y en otras no?.
Sobre el aporte de casimiro debo anotar que en las maquinas que bota el error el soft no discrimina por producto es decir bota error con cualquiera y en las maquinas que no bota error tampoco discrimina producto, deja entrar cualquiera insisto bases iguales ejecutable igual.
Gracias

Última edición por Camilo fecha: 20-01-2016 a las 16:23:36.
Responder Con Cita
  #10  
Antiguo 20-01-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Camilo Ver Mensaje
gracias AgustinOrtu. tu respuesta es clara y te agradezco. ahora sigue ls inquietud inicial. Por que en unas maquinas funciona perfectamente y en otras no?. Gracias
Por lo que te he dicho antes, dependerá del artículo con el que hagas la prueba.
Responder Con Cita
  #11  
Antiguo 20-01-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Yo creo que la computadora tiene muy poco que ver

Mas bien la entrada de datos que es distinta. Uno tiende a poner solamente valores correctos cuando hace las pruebas rapidas pero es "dificil" romperlo
Responder Con Cita
  #12  
Antiguo 20-01-2016
Camilo Camilo is offline
Miembro
 
Registrado: jun 2007
Posts: 147
Poder: 17
Camilo Va por buen camino
Amigos del foro:
Solucionado (bueno eso creo). Por fin dejo de botar error en las otras maquinas (aunque solo probé en dos). Que hice??? seguí sus consejos y las cosas ahora funcionan bien, ademas el misterio de las maquinas embrujadas ya me va a dejar dormir tranquilo.
solución:
1) Cambie todos los tipos de datos de Extended a Currency. Ademas revise minuciosamente el código y reemplace los extended que correspondían tanto por Currency (los valores en moneda) como a Integer los valores como cantidades por ejemplo.
2) inicialice todas las variables. No estaba iniciando las variables de hecho las incluia en el "var" pero no las ponia a 0. (Aporte de AzidRain)

Como ejemplo de los procedimientos que cambie pongo uno solo a fin de no ocupar mucho espacio y como ejemplo de la socucion que le dimos a este lio.

Código Delphi [-]
Procedure TFVenta.SumaCantidad;
var
Suma, a, d: Currency;
c, k: Integer;
begin
a:= 0;
c:= 0;
d:=0;
  a := StrToCurrDef(StringGrid1.Cells[5, StringGrid1.Row],0); // Precio
  c := StrToIntDef(Edit8.Text,0); //Cantidad
  d:=  (a*c); // Precio x Cantidad

StringGrid1.Cells[4, StringGrid1.Row]:=  Edit8.Text;  //CANTIDAD
StringGrid1.Cells[6, StringGrid1.Row]:=  FormatCurr('$ #0,.00',d);
StringGrid1.Cells[8, StringGrid1.Row]:= CurrToStr(d);

Suma := 0;
  StringGrid1.Cells[7, StringGrid1.Row]:= StringGrid1.Cells[1, StringGrid1.Row];
  for k := 0 to StringGrid1.RowCount - 1 do
    if k <= StringGrid1.RowCount - 1 then
      Suma := Suma + StrToCurrDef(StringGrid1.Cells[8, k + 1],0);
      Edit7.Text:=  FormatCurr('$ #0,.00', Suma);
      Edit5.Text:=  CurrToStr(Suma);
end;

En cuanto a los de las maquinas embrujadas; creo que la intuición de un amigo llamado jose cuando plantea lo siguiente es valida y oportuna por demás

Cita:
Y en cuanto al error que te da en algunas máquinas podría proceder de la cadena de conversión a texto que te he comentado antes ó del viejo error de punto flotante que tenían los Pentium 4 y algún otro procesador. Dentro de Delphi hay una opción en el compilador para evitarlo. De todas formas si usas variables "currency"(son enteros) no tendría que darte el problema.
Asi las cosas, ahora funcina bien en todas partes. Un agradecimiento a AgustinOrtu, Casimiro Notevi, Al González, AzidRain y todo el foro que siempre tiene para mi una voz de aliento y sus aportes desinteresados y efectivos por demas.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
"Not a valid floating point value" david.rguez Varios 2 12-12-2007 14:42:57
""" is not a valid floating point value con edit Petolansa Varios 6 11-12-2007 01:07:13
"floating point overflow" en campocalculado ANXO Conexión con bases de datos 0 22-01-2006 17:59:58
deadlock en unas maquinas pero no en otras ??? DobleSiete Conexión con bases de datos 6 01-06-2005 15:12:58
Unas preguntas? Waldo Conexión con bases de datos 2 01-11-2003 07:45:50


La franja horaria es GMT +2. Ahora son las 04:34:46.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi