Spanish [SOLUCIONADO] Duda sobre hilo de ejecucion de rutinas

Edu Portu

Member
Licensed User
Longtime User
Tengo una rutina que le paso un usuario y contraseña tecleados y tiene que consultar en una BD Remota los datos de usuario y contraseña y devolverme True o False segun sean o no correctos

Este es mas o menos el codigo

B4X:
'Aqui hay que hacer una cobsulta JSON al servidor para ver si estamos identificados
Sub Consulta_Correcta(IDB As String, IDU As String, IDP As String) As Boolean
    Dim AccesoValido As Boolean
    AccesoValido = False
   
    'Comprobamos si se puede escribir en la memoria externa
    If Not(File.ExternalWritable) Then
        ToastMessageShow("No se pueden descargar las rutas", True)
    Else
        'Comprobamos si tenemos conexion a internet
        Dim server As ServerSocket 'Add a reference to the network library
        server.Initialize(0, "")
        If server.GetMyIP = "127.0.0.1" Then  'this is the local host address
            'ToastMessageShow("No se puede autentificar. Compruebe conexión.", True)
        Else
            'Accedemos al base de datos para coger los datos
            Dim job As HttpJob
            Dim Query As String = "SELECT * FROM buzones WHERE (IDBUZON = '" & IDBuzon & "')"
            job.Initialize(ID_BUZON, Me)
            job.PostString("http://www.xxx.com/privado/xxx.php", Query)

            Wait For (job) JobDone(job As HttpJob)
            
            If job.Success Then
                Log(job.GetString)
                Msgbox(IDB & ":" & ServerBuzon & " - " & IDU & ":" & ServerUsuario & " - " & IDP & ":" & ServerPass, "CONSULTA SQL")
                'Aqui tendriamos que comprobar que es correcta la informacion y poner AccesoValido=True o False
                
            End If
            job.Release
        End If
    End If
    
    Return AccesoValido
End Sub



Sub JobDone(Job As HttpJob)
    If Job.Success Then
        Dim res As String
        res = Job.GetString
        Dim parser As JSONParser
        parser.Initialize(res)
        Select Job.JobName
            Case ID_BUZON
                Dim PARTIDOS As List
                PARTIDOS = parser.NextArray 'returns a list with maps
                If PARTIDOS.Size = 1 Then 'Solo tiene que haber un registro con esa ID
                    
                    Dim m As Map
                    m = PARTIDOS.Get(0)
                    'Tratamos el campo FECHA Y HORA
                    ServerUsuario = m.Get("IDUsuario")
                    ServerPass = m.Get("IDPass")
                End If
                DoEvents
        End Select
    Else
        ToastMessageShow("Error: " & Job.ErrorMessage, True)
    End If
    ProgressDialogHide
    Job.Release

End Sub

El problema es que las rutinas funcionan bien, pero cuando intento poner a la rutina Consulta_Correcta que devuelva un valor boolean me da el error:

B4A Versión: 8.50
Parseando código. Error
Error al analizar el programa.
Descripción del error: El tipo devuelto por las rutinas resumibles debe ser ResumableSub (o nada).
Ha ocurrido un error en la línea: 174 (Main)
Sub Consulta_Correcta(IDB As String, IDU As String, IDP As String) As Boolean

que no se lo que significa

Saludos y Gracias
 
Last edited:

Edu Portu

Member
Licensed User
Longtime User
Al final parece ser que las rutinas RESUMIBLES (que tienen wait for) no pueden devolver valores, asi que lo he solucionado metiendo todo el codigo en el boton que llamaba a esta rutina.

Muchas gracias
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Al final parece ser que las rutinas RESUMIBLES (que tienen wait for) no pueden devolver valores, asi que lo he solucionado metiendo todo el codigo en el boton que llamaba a esta rutina.

Muchas gracias
Hola Edu:

Si que se puede, lo que pasa que en la llamada tienes que hacer algo como lo que pongo mas abajo y en el Sub no devolver un boolean si no un ResumableSub

Por ejemplo algo asi:

B4X:
Dim bf2 As ResumableSub = Consulta_Correcta(Valor para IDB, Valor paraIDU, Valor paraIDP ) 
Wait For (bf2) complete (Resultado As Boolean)
 if Resultado then
' ''''''''''''''
''''''''''
 end if    


' En tu rutina cambiar el boolean por ResumableSub

 
Sub Consulta_Correcta(IDB As String, IDU As String, IDP As String) As ResumableSub

'''''''''''''''''
'''''''''''''''

Saludos
 

Edu Portu

Member
Licensed User
Longtime User
Muchas gracias por la rapida respuesta, al final lo habia resuelto poniendo todo el codigo en la tecla de AUTENTIFICAR, algo asi:

B4X:
Sub btnIden_Click
   Dim Identificado As Boolean = False
 
   btnIden.Enabled = False

   If ((edIDBuzon.Text<>"") And (edIDUsuario.Text<>"") And (edPass.Text<>"")) Then
       'Conectamos con la BD para solicitar los datos de autentificacion
     
       'Comprobamos si se puede escribir en la memoria externa
       If Not(File.ExternalWritable) Then
           ToastMessageShow("No se puede autentificar. Compruebe conexión.", True)
       Else
           'Comprobamos si tenemos conexion a internet
           Dim server As ServerSocket 'Add a reference to the network library
           server.Initialize(0, "")
           If server.GetMyIP = "127.0.0.1" Then  'this is the local host address
               'ToastMessageShow("No se puede autentificar. Compruebe conexión.", True)
           Else
               'Accedemos al base de datos para coger los datos
               Dim job As HttpJob
               Dim Query As String = "SELECT * FROM buzones WHERE (IDBUZON = '" & edIDBuzon.Text & "')"
               job.Initialize("", Me)
               job.PostString("http://www.siguealburro.com/privado/sab.php", Query)

               Wait For (job) JobDone(job As HttpJob)
         
               If job.Success Then
                   'Msgbox(job.GetString, "LOG")
                 
                   Dim parser As JSONParser
                   parser.Initialize(job.GetString)
                   Dim DATOS As List
                   DATOS = parser.NextArray 'returns a list with maps
                   If DATOS.Size = 1 Then 'Solo tiene que haber un registro con esa ID
                       Dim m As Map
                       m = DATOS.Get(0)
                       'Tratamos el campo FECHA Y HORA
                       ServerBuzon = m.Get("IDBuzon")
                       ServerUsuario = m.Get("IDUsuario")
                       ServerPass = m.Get("IDPass")
                       'Msgbox(ServerBuzon & " - " & ServerUsuario & " - " & ServerPass, "CONSULTA SQL")
                   End If
                   DoEvents
                   'Msgbox(edIDBuzon.Text & ":" & ServerBuzon & " - " & edIDUsuario.Text & ":" & ServerUsuario & " - " & edPass.Text & ":" & ServerPass, "COMPARACION")
                   If ((ServerBuzon = edIDBuzon.Text) And (ServerUsuario = edIDUsuario.Text) And (ServerPass = edPass.Text)) Then
                       'Guardamos los datos en la BD para futuras veces
                       IDBuzon = edIDBuzon.Text
                       IDUsuario = edIDUsuario.Text
                       IDPass = edPass.Text
                       funciones.EscConfig
                       Identificado = True
                   End If
               Else
                   ToastMessageShow("Error: " & job.ErrorMessage, True)
               End If
               job.Release
           End If
       End If

   End If
 
   If Identificado Then
       pnlIden.RemoveView
       'La identificacion ha sido correcta asi que aqui cargamos la pantalla de inicio
       lblNombreBuzon.Initialize("")
       ....
   Else
       ToastMessageShow("Error al identificar", True)
       btnIden.Enabled = True
   End If

End Sub

No se si es muy correcto a nivel de programacion, pero parece que funciona. De todas maneras probare tambien lo que me comentas.

Saludos y muchas gracias por la colaboracion.
 
Top