Una curiosa curiosidad

Una curiosa curiosidad

Postby hmpaquito » Wed Oct 05, 2011 7:36 am

Hola a todos:

Teniendo un bucle tal que asi:
Code: Select all  Expand view

SELECT (cAli)
GO TOP
DO WHILE !Eof()
   nPrecio:= Importe/ Cantidad             // (*)
   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: Select all  Expand view

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
Last edited by hmpaquito on Wed Oct 05, 2011 11:54 am, edited 2 times in total.
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: Una curiosa curiosidad

Postby Antonio Linares » Wed Oct 05, 2011 9:33 am

Y muy util, gracias! :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41321
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Una curiosa curiosidad

Postby thefull » Wed Oct 05, 2011 11:34 am

Muy útil.
Saludos
Rafa Carmona ( rafa.thefullARROBAgmail.com___quitalineas__)
User avatar
thefull
 
Posts: 729
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona

Re: Una curiosa curiosidad

Postby carlos vargas » Wed Oct 05, 2011 2:16 pm

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

salu2
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1688
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Una curiosa curiosidad

Postby hmpaquito » Fri Oct 28, 2011 2: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: Select all  Expand view

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: Select all  Expand view

bErrorBlock:= ErrorBlock( {|oError| If(oError:GenCode == EG_ZERODIV, 0, Break(oError)) ) )
BEGIN SEQUENCE
   ...(1)
RECOVER USING oError
   ...(2)
END
ErrorBlock(bErrorBlock)
 



Saludos a todos
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: Una curiosa curiosidad

Postby thefull » 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__)
User avatar
thefull
 
Posts: 729
Joined: Fri Oct 07, 2005 7:42 am
Location: Barcelona

Re: Una curiosa curiosidad

Postby hmpaquito » 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
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 7 guests