Page 1 of 1

Recuperar error de un alias cerrado

Posted: Tue Jul 28, 2020 11:41 am
by AngelSalom
Hola amigos, estoy tratando de resolver un tema que no sé si tiene solución.
En alguna parte del programa y realizando ciertas combinaciones tengo usuarios que consiguen generar un error al cerrar una tabla en pleno proceso, error que no he conseguido reproducir por lo que entiendo que se deberá a características de los equipos en los que estén instalados (antivirus, cortes de red, etc.)

La pregunta es si es posible "recuperar" la aplicación tras un error de este tipo, como por ejemplo en el que genero en este código cerrando la tabla en medio de un bucle

Code: Select all

#include "fivewin.ch"

Function Main()
Local nTot:=0

  Use Customer
  while !Customer->(eof())
    nTot++
    Customer->(DbSkip())

    If nTot=5
      Close Customer
    Endif
  Enddo

  ? nTot

Return (nil)  
Gracias!

Re: Recuperar error de un alias cerrado

Posted: Tue Jul 28, 2020 11:57 am
by hmpaquito
Hola Ángel,

Intuyo que el problema está en tu programa y no en los equipos.
También creo que el error es debido a que cuando el programa está en un bucle, el usuario hace algo con el ratón, con el teclado, etc... que desvía la ejecución a otra parte del programa. Allí se cierran tablas, incluida la que comentas y de vuelta al bucle sobreviene el crash.

¿ Qué hacer ? Por supuesto, no parchear, buscando soluciones de recuperacion de la aplicacion tras el error, sino ir a la raiz del problema. Y ahi la solucion puede pasar porque en un bucle inhabilites el uso de las ventanas de detrás. Yo tengo algo asi haciendo que los browses no se pinten (evento paint) si una variable publica se esta ejecutando. Se me muestra la pantalla del browse en blanco, pero me ahorro problemas de reposiconamiento y otros.

Espero que te sirva.

Salu2

Re: Recuperar error de un alias cerrado

Posted: Tue Jul 28, 2020 1:47 pm
by karinha
Intenta asi:

Code: Select all

#include "fivewin.ch"

FUNCTION MAIN()

   LOCAL NTOT := 0

   USE CUSTOMER
   GO TOP

   WHILE .NOT. CUSTOMER->( EOF() )

      SYSREFRESH()

      NTOT++

      CUSTOMER->( DBSKIP() )

      IF NTOT == 5

         EXIT

      ENDIF

   ENDDO

   ? NTOT

   IF NTOT = 5

      CLOSE CUSTOMER

      NTOT := 0

   ENDIF

RETURN NIL
 

Re: Recuperar error de un alias cerrado

Posted: Wed Jul 29, 2020 10:31 pm
by xmanuel

Code: Select all

#include "fivewin.ch"

Function Main()
Local nTot:=0
local cAlias  // <----

  Use Customer

  cAlias := alias()  // <----

  while select( cAlias ) != 0 .and. !Customer->(eof())  // <----
    nTot++
    Customer->(DbSkip())

    If nTot=5
      Close Customer
    Endif
  Enddo

  ? nTot

Return (nil)