Desbordamiento numerico

1,565 views
Skip to first unread message

acmc

unread,
May 11, 2012, 4:02:07 PM5/11/12
to publice...@googlegroups.com
Hola grupo,

Quisiera saber como puedo controlar el error de desbordamiento numerico, ya que tengo que guardar el valor de un campo producto de multiplicar otros dos campos y en ocasiones traen valores erroneos y para que no me ponga  "******** " en el campo prefiero que me ponga cero, pero como puedo saber cuando se desborde el valor?

Salu2!

ZeRoberto

unread,
May 11, 2012, 4:04:17 PM5/11/12
to publice...@googlegroups.com
Una respuesta un poco tonta

lcCalculo = Transform(lnResulado)
If "*" $ lcCalculo
lnResultdo = 0
EndIf

El 11/05/12, acmc <impre...@gmail.com> escribió:

Antonio.xt

unread,
May 11, 2012, 4:17:07 PM5/11/12
to publice...@googlegroups.com

El error de desbordamiento numerico se debe a que estas tratando de guardar en ese campo un numero con mayor cantidad de digitos al que tienes especificado en su estructura, es decir, tal vez ese campo lo tienes definido como numerico de 4 posiciones ó N(4), y el valor que intentas guardar es mayor a 9999, por eso pone asteriscos; en ese caso se resuelve ampliando la estructura del campo; pero, si el error es de uno de los 2 campos que multiplicas, ahi lo que puedes hacer es verificar que el valor de esos campos a multiplicar sea numericos con la funcion ISDIGIT(), aunque obiamente deben de ser numericos, o a menos que tambien sean calculados de otros datos que probablemente tambien vengan con errores.

Charles A. Moreno

GeoSys Diseño de Software

unread,
May 11, 2012, 4:47:35 PM5/11/12
to publice...@googlegroups.com
El error muchas veces se da, cuando una variable se divide entre otra variable con valor cero.

Un valor se puede multiplicar por cero, pero un valor no se puede dividir entre cero porque nos da error en este caso *******:

Ejemplos:

?(40*0) && = 0

?(40/0) && = *******

?(0*0) && = 0

?(0/0)  && *******

?(40/-89) && = -0.45 && Si alguno de los dos es negativo, no hay asteriscos.

Ejemplo de caída:

CREATE CURSOR otro (numero N(13,2))
APPEND BLANK
REPLACE numero with (40/0)

Mensaje: Numeric overflow. Data was lost.

¿Porqué?, porque como te mencionan los colegas, al querer remplazar un campo con una longitud mayor no alcanzaría y VFP da el mensaje de error.

Solución propuesta:

Verificar siempre que el dividendo y divisor tengan un valor positivo o negativo, pero nunca un valor cero, si cualquiera de los dos tiene un valor cero entonces asignar cero al resultado, para que a la hora de remplazar no intente remplazar en el campo los asteriscos y se.nos caiga por el desbordamiento numérico.




Saludos

Anthony Contreras Perata

Costa Rica

acmc

unread,
May 11, 2012, 5:26:58 PM5/11/12
to publice...@googlegroups.com
Yo no diria tonta.. mas bien ingeniosa.. sera cosa de probar grs!!

acmc

unread,
May 11, 2012, 5:28:40 PM5/11/12
to publice...@googlegroups.com
Gracias Charles.. 

Es correcto lo que dices, el campo es mas chico al valor calculado, pense que se podria hacer como un manejador de excepción para este tipo de error en particular

acmc

unread,
May 11, 2012, 5:29:49 PM5/11/12
to publice...@googlegroups.com
Estoy de acuerdo José.. tendré que validar los valores de los campos antes de hacer la operación para que no me de este error.

Salu2!!

Walter R. Ojeda Valiente

unread,
May 11, 2012, 5:31:59 PM5/11/12
to publice...@googlegroups.com
La alternativa es que aumentes el tamaño del campo, siempre que tal cosa sea posible.

Saludos.

Walter.




Date: Fri, 11 May 2012 14:29:49 -0700
From: impre...@gmail.com
To: publice...@googlegroups.com
Subject: Re: [vfp] Re: Desbordamiento numerico
Reply all
Reply to author
Forward
0 new messages