FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Una curiosa curiosidad
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Una curiosa curiosidad
Posted: Wed Oct 05, 2011 07:36 AM
Hola a todos:

Teniendo un bucle tal que asi:
Code (fw): Select all Collapse
SELECT (cAli)
GO TOP
DO WHILE !Eof()
聽 聽nPrecio:= Importe/ Cantidad 聽 聽 聽 聽 聽 聽 // <strong>(*)</strong>
聽 聽REPLACE Precio WITH nPrecio
聽 聽SKIP
ENDDO


Cuando en la linea (*) Importe sea cero entonces sera llamado el controlador de errores porque se habra producido una division por cero. En el controlador de errores (errorsys) el error sera tratado, y el tratamiento por defecto ser谩 devolver cero como resultado de la division y no habra pasado nada.... pero SI HABRA PASADO Y MUCHO, y es que la velocidad del proceso se resentira mucho, si hay muchas iteraciones del bucle en las que sucede eso. Para solucionarlo, mejor controlar antes el valor de Importe y si es cero entonces no hacer la division:

Code (fw): Select all Collapse
SELECT (cAli)
GO TOP
DO WHILE !Eof()
聽 聽IF Importe == 0
 聽 聽 聽nPrecio:= 0
聽 聽ELSE
聽 聽 聽 nPrecio:= Importe/ Cantidad
聽 聽ENDIF 聽 
聽 聽REPLACE Precio WITH nPrecio
聽 聽SKIP
ENDDO


S贸lo era una curiosidad.

Saludos
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Una curiosa curiosidad
Posted: Wed Oct 05, 2011 09:33 AM

Y muy util, gracias! :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 731
Joined: Fri Oct 07, 2005 07:42 AM
Re: Una curiosa curiosidad
Posted: Wed Oct 05, 2011 11:34 AM

Muy 煤til.

Saludos

Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: Una curiosa curiosidad
Posted: Wed Oct 05, 2011 02:16 PM

sip, muy buena optimizaci贸n.
gracias por el tips.

salu2

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: Una curiosa curiosidad
Posted: Fri Oct 28, 2011 02:54 PM
Una vuelta de tuerca a lo anterior puede ser la siguiente:

Imag铆nense que no hemos protegido "manualmente" nuestro codigo contra las divisiones por cero; imag铆nense que tienen un c贸digo cr铆tico que de ninguna manera debe fallar y por eso lo protegemos con un BEGIN SEQUENCE:

Code (fw): Select all Collapse
bErrorBlock:= ErrorBlock( {|oError| Break(oError) } )
BEGIN SEQUENCE
聽 聽...(1)
RECOVER USING oError
聽 聽...(2)
END
ErrorBlock(bErrorBlock)


Pues bien, lo anterior provocar谩 una deviaci贸n del flujo hacia el RECOVER si en las operaciones del ...(1) hay una operacion de division por cero, porque el tratamiento por defecto (ErrorSys) de la division por cero no se aplica aqui.

La soluci贸n es:
Code (fw): Select all Collapse
bErrorBlock:= ErrorBlock( {|oError| If(oError:GenCode == EG_ZERODIV, 0, Break(oError)) ) )
BEGIN SEQUENCE
聽 聽...(1)
RECOVER USING oError
聽 聽...(2)
END
ErrorBlock(bErrorBlock)



Saludos a todos
Posts: 731
Joined: Fri Oct 07, 2005 07:42 AM
Re: Una curiosa curiosidad
Posted: Thu Jan 05, 2012 11:51 AM
hmpaquito , muy buen tip!!!
Me ha solucionado un problema que estaba entre quitar el try/catch o recorrer cientos de lineas por el tema de la divisi贸n por cero.
Tu soluci贸n me ha ido de perlas.

Gracias
Saludos

Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: Una curiosa curiosidad
Posted: Thu Jan 05, 2012 12:23 PM
Rafa,

thefull wrote:hmpaquito , muy buen tip!!!
Me ha solucionado un problema que estaba entre quitar el try/catch o recorrer cientos de lineas por el tema de la divisi贸n por cero.
Tu soluci贸n me ha ido de perlas.
Gracias


Nada comparado con el el beneficio que yo he tenido con tus aportes; sin ir mas lejos TUtilPrn/TImprime estan en la base de todas mis impresiones.

Gracias a ti.

Saludos

Continue the discussion