Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
Problema Con Control De Errores Y Return En Una Función
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Problema Con Control De Errores Y Return En Una Función 
 
Saludos al foro, aprovechando la cuarentena he retomado gambas y me he encontrado con un problema al que no encuentro una solución elegante.

Me explico, una función que realiza la carga de un componente (treeview, gridview, columnview) a partir de los datos de una base de datos. En el caso de que todo sea correcto retorna TRUE y sino FALSE.
Para controlar errores de programación utilizo Finally-Catch y además una variable boolean para controlar lógica de programa.

La función sería algo parecido a esto:


Private Function CargaTreeView() As Boolean
   'Realiza la carga del TreeView

   Dim hResult As Result
   Dim sSql As String
   Dim bControl As Boolean = True

   'Abrimos base de datos.
   If Not hConn.Opened Then hConn.Open()
   'Sentencia SQL
   sSql = "SELECT * FROM Tabla "
   hResult = hConn.Exec(sSql)

   'Cargamos resultado
   If hResult Then

      'Proceso de carga del control

   Else

      'Si no hay datos no hay carga
      bControl = False

   Endif

Finally
   hConn.Close()
   hResult = Null

   If Error.Code <= 0 Then Return bControl

Catch
   'Control de errores
   Message.Error("Error: " & Error.Text & gb.CrLf & "Módulo: " & Error.Where)
   Return False

End

 


El problema está en que, aunque no haya ningún error de programación dentro de la función, cuando llega a la linea: "If Error.Code <= 0 Then Return bControl" si existe un error heredado.
Viene de un "Try" del control TreeView, con debug obtengo:
     Error: 13: Null object
     Módulo: _TreeView_Item._AddChild.136

No se me ocurre más alternativa que, o bien incluir justo antes del "Finally" un Error.Clear(). Asumiendo que si llega hasta ahí la ejecución no hay error de programación. O parchear el código de los controles para limpiar los errores generados por "Try" y volver a construirlos. Ninguna de las dos me convence al 100%.

Subo una pequeña aplicación donde se ve el problema, tiene un control TreeView a la izquierda donde carga Autonomías-Provincias de España desde una base de datos SQLite. Cuando se selecciona una provincia carga un ColumnView con Poblaciones-Codigos postales-Direcciones. La función de carga del TreeView limpia el error del control antes del "Finally", la función de carga del ColumnView no, por tanto el "return" por defecto es False.

Estoy usando gambas 3.14.3. Cualquier sugerencia es bienvenida y gracias de antemano.
Un saludo. H.

 captura_de_pantalla_2020_04_26_13_20_26

Programa ejemplo:

CodPostal.zip
Descripción: Visualizar Codigos postales 
Descargar
Nombre del archivo: CodPostal.zip
Tamaño: 493.52 KB
Descargado: 88 veces
CodPostal.zip
Descripción: Visualizar Codigos postales 
Descargar
Nombre del archivo: CodPostal.zip
Tamaño: 493.52 KB
Descargado: 88 veces
CodPostal.zip
Descripción: Visualizar Codigos postales 
Descargar
Nombre del archivo: CodPostal.zip
Tamaño: 493.52 KB
Descargado: 88 veces

 



 
Harpo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Con Control De Errores Y Return En Una Función 
 
podrías hacer un video con el error y subirlo?
 




===================
Software libre, programación libre, vida libre es la Public function Libertad()as Invendible
Proyectos: VisorRV1960,Taller2015,Tanteador
https://sourceforge.net/u/v3ctor-full/profile/
Blog: http://novatocodegambas.blogspot.com.uy/
 
v3ctor - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Con Control De Errores Y Return En Una Función 
 
a ti te sale esta ventana en el error?


 no_hay_datos_para_la_provincia_04

el error lo tira en esta zona:

FMain.CargaColumnView.232: 13: Null object
FMain.CargaColumnView.233: _TreeView_Item._AddChild.136

 




===================
Software libre, programación libre, vida libre es la Public function Libertad()as Invendible
Proyectos: VisorRV1960,Taller2015,Tanteador
https://sourceforge.net/u/v3ctor-full/profile/
Blog: http://novatocodegambas.blogspot.com.uy/
 
última edición por v3ctor el Domingo, 26 Abril 2020, 13:45; editado 1 vez 
v3ctor - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Con Control De Errores Y Return En Una Función 
 
comenta todo el código de finality, y purga el error que hay primero
 




===================
Software libre, programación libre, vida libre es la Public function Libertad()as Invendible
Proyectos: VisorRV1960,Taller2015,Tanteador
https://sourceforge.net/u/v3ctor-full/profile/
Blog: http://novatocodegambas.blogspot.com.uy/
 
v3ctor - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Con Control De Errores Y Return En Una Función 
 
comente todas las lineas de finality y tira error: null key

 null_key

arregla eso primero
 




===================
Software libre, programación libre, vida libre es la Public function Libertad()as Invendible
Proyectos: VisorRV1960,Taller2015,Tanteador
https://sourceforge.net/u/v3ctor-full/profile/
Blog: http://novatocodegambas.blogspot.com.uy/
 
v3ctor - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Con Control De Errores Y Return En Una Función 
 
v3ctor escribió:  
a ti te sale esta ventana en el error?


 no_hay_datos_para_la_provincia_04

el error lo tira en esta zona:

FMain.CargaColumnView.232: 13: Null object
FMain.CargaColumnView.233: _TreeView_Item._AddChild.136


Gracias por tu interés Victor, esa ventana se produce al no devolver nada la función y por tanto toma valor por defecto: False. El mensaje lo lanza el evento Select del Treeview. El error "13: Null object" se produce internamente en el ColumnView, no en el programa ejemplo. Es el problema que señalo, un error que se produce internamente en un control y que "hereda" la aplicación que lo usa.
 



 
Harpo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Con Control De Errores Y Return En Una Función 
 
v3ctor escribió:  
comente todas las lineas de finality y tira error: null key

 null_key

arregla eso primero


Mis disculpas, hice todas las pruebas con una base de datos completa, para subir el programa tuve que eliminar muchos datos.
Para subsanar el error basta cambiar la linea 144: If hResult then
por:    If hResult.Available Then

Gracias por tu interés!
 



 
Harpo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Con Control De Errores Y Return En Una Función 
 
Hola Harpo.
El error sucede porque se levanta el evento treeview1_select() antes que el treeview tenga elementos, de ahi el null.
La solución es usar unas banderas, por ejemplo cargado = true una vez que cargaste el treeview y en el evento treeview_select pones un condicional
 IF cargado = true then

Saludos.
 



 
tincho - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Con Control De Errores Y Return En Una Función 
 
tincho escribió:  
Hola Harpo.
El error sucede porque se levanta el evento treeview1_select() antes que el treeview tenga elementos, de ahi el null.
La solución es usar unas banderas, por ejemplo cargado = true una vez que cargaste el treeview y en el evento treeview_select pones un condicional
 IF cargado = true then

Saludos.


Hola y gracias por la respuesta.
No veo lo que comentas. El evento TreeView1_Select() se dispara por primera vez al asignar: Key = "*" en el proceso de carga, y en el evento se controla que si TreeView.count = 1 no continue.
He probado a poner una bandera (bCargando = True) y no afecta

Por otro lado el error que existe al final del proceso de carga es: 13 - Null Object. en _TreeView_Item._AddChild.136
En el código fuente del control TreeView:

Public Sub _AddChild(sKey As String)

  If Not $aChildren Then $aChildren = New String[]
  $aChildren.Add(sKey)

  If $aChildren.Count = 1 Then
    Try Inc GetTree()._GetParentItem(Me)._GrandChildren
  Endif

End
 


El error que aparece en mi programa ejemplo viene del "Try" del código fuente anterior en el control TreeView. Probé a depurar el ejemplo que viene el código fuente de gambas y efectivamente da error "Null Object", intenta incrementar el contador de nodos hijos (_GrandChildren) del nodo padre del que estamos insertando (_GetParentItem(Me)) en el TreeView (GetTree()). Y lo hace solo para el primer nodo ($aChildren.Count = 1) que es el nodo Root y no tiene padre. De ahí el nulo. Si se comenta la linea del "Try" el control TreeView funciona perfectamente.

Quizá en este ejemplo se vea más claro que error es del control TreeView.

CargaTreeView.zip
Descripción:  
Descargar
Nombre del archivo: CargaTreeView.zip
Tamaño: 15.05 KB
Descargado: 81 veces
CargaTreeView.zip
Descripción:  
Descargar
Nombre del archivo: CargaTreeView.zip
Tamaño: 15.05 KB
Descargado: 81 veces
CargaTreeView.zip
Descripción:  
Descargar
Nombre del archivo: CargaTreeView.zip
Tamaño: 15.05 KB
Descargado: 81 veces

 



 
Harpo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Con Control De Errores Y Return En Una Función 
 
Hay que comprobar si hay error (si no es null) antes de poder ver si es > 0.
Public Sub btCargar_Click()

  With TreeView1
    .Add("*", "Nodo Root")
    .Add("Child1", "Hijo 1",, "*")
    .Add("Child1-1", "Sub Hijo 1-1",, "Child1")
    .Add("Child1-2", "Sub Hijo 1-2",, "Child1")
    .Add("Child1-3", "Sub Hijo 1-3",, "Child1")
    .Add("Child1-4", "Sub Hijo 1-4",, "Child1")

    .Add("Child2", "Hijo 2",, "*")
    .Add("Child2-1", "Sub Hijo 2-1",, "Child2")
    .Add("Child2-2", "Sub Hijo 2-2",, "Child2")
    .Add("Child2-3", "Sub Hijo 2-3",, "Child2")
    .Add("Child2-4", "Sub Hijo 2-4",, "Child2")
  End With

Finally
  If Error Then ' Agregue esto a tu código
    If Error.Code > 0 Then
      Message.Info("Error: " & Error.Text & gb.CrLf & "Módulo: " & Error.Where)
    Endif
  Endif ' Agregue esto a tu código

Catch
  Message.Error("Errorx: " & Error.Text & gb.CrLf & "Módulo: " & Error.Where)

End

Public Sub btSalir_Click()

  Me.Close()

End
 

Saludos.
 



 
tincho - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Control De Errores soplo General 0 Lunes, 14 Septiembre 2009, 17:19 Ver último mensaje
soplo
No hay nuevos mensajes Control De Errores Global GambasLinux Aplicaciones/Fragmentos de Código 5 Jueves, 25 Febrero 2010, 21:02 Ver último mensaje
fabianfv
No hay nuevos mensajes Control De Errores En Una Aplicación De C... Shell General 7 Jueves, 10 May 2018, 07:38 Ver último mensaje
Shell
No hay nuevos mensajes Función Return En Shell Bash Shell Shell Scripting 4 Martes, 06 Noviembre 2018, 12:07 Ver último mensaje
Shell
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron