Spanish Como leer un campo MSSQL Server boolean en B4J ?

MauSan

New Member
Licensed User
Hola a todos, esperando que esten todos bien, les pido ayuda.
Se que es algo que seguramente es algo sencillo pero no encuentro respuesta al problema que me ha surgido, estoy haciendo una aplicacion en B4J para la lectur de una tabla
en MS SQL Server y tengo un campo tipo Bit, solo que al intentar asignar dicho campo a una variable pues no se como asignarlo, y he hecho busquedas en los foros, pero no
he podido encontrar la repuesta, les agradezco de antemano la ayuda.

He aqui el codigo:
B4J 8.30


Lee_Notificaciones_Enviar:
Sub Lee_Notificaciones_Enviar As ResumableSub
    Dim qry_Notificaciones_A_Enviar As StringBuilder
    Dim nRow As Int = 0
    
    
    Log("   - Entrando a Lee_Notificaciones_Enviar")

    Log_Datos.Add("   - Entrando a Lee_Notificaciones_Enviar")
    
    DateTime.DateFormat = "dd/MM/yyyy"
    
    qry_Notificaciones_A_Enviar.Initialize
    
    qry_Notificaciones_A_Enviar.Append("Select * ")
    qry_Notificaciones_A_Enviar.Append("From Con_Notificaciones ")
    qry_Notificaciones_A_Enviar.Append("Where Enviar = 1 ")
    
    '......................................................................................
    ' Leemos la Tabla
    '......................................................................................
    Dim SenderFilter As Object = SQLDB.ExecQueryAsync("SQL", qry_Notificaciones_A_Enviar, Null)
    
    Wait For (SenderFilter) SQL_QueryComplete (Success As Boolean, rsNotificaciones_Enviar As ResultSet )
    
    'Dim Result As DBResult = reqManager.HandleJob(Job)

    
    If Success Then
        
        nServicios = nServicios + 1
        
        
        Do While rsNotificaciones_Enviar.NextRow
          
            nRow = nRow + 1
    
            Log_Datos.Add( "   Datos de la Solicitud encontrados, Reg_Number: " & nRow )
            Log("   Datos para envío contrados, Registros: " & nRow )
                
            '...........................................................................
            ' Se enviaran los correos de los registros leidos, ya que en el
            ' query se filtra por el campo Enviar Correo
            '...........................................................................
            Try

                mFila_Id = rsNotificaciones_Enviar.GetString("Fila_Id")
                mTema    = rsNotificaciones_Enviar.GetString("Tema")
                mMensaje = rsNotificaciones_Enviar.GetString("Mensaje")
                mCategoria_Nombre = rsNotificaciones_Enviar.GetString("Categoria_Nombre")
                mRepetir_Envio = rsNotificaciones_Enviar.GetInt("Repetir_Envio")
                
                Log("mRepetir_Envio: " & mRepetir_Envio )
                                
                '..............................................................
            
                wait for (Envia_Notificacion(mTema, mCategoria_Nombre, mMensaje, False)) Complete (Result As Object)
                
                wait for ( Cierra_Notificacion ) Complete (Result As Object)

            Catch
                
                Log("Error al leer campos de tabla: " & LastException)
                
            End Try
            
        Loop
        
    Else

        Log("Error de lectura de query: " & LastException)
        
    End If
    
    
    Return Null
    
End Sub

La tabla en MSSQL Server tiene como valor por omision Falso (0)
la variable mRepetir_Envio está declarada como boolean

En la linea de lectura intento leer con GetInt (probé con los otros métodos) pero de cualquier modo me da el error mostrado abajo.


Y el Error que obtengo en el catch es el siguiente:

Error al leer campos de tabla: (RuntimeException) java.lang.RuntimeException: Cannot parse: 0 as boolean

Si tienen alguna idea, se los agradeceré.

Saludos
 

oparra

Well-Known Member
Licensed User
No indicas el tipo que es mRepetir_Envio.

prueba esto te puede ayudar (Rutina IIF).

Dim mRepetir_Envio As Boolean = IIF(rsNotificaciones_Enviar.GetString("Repetir_Envio").ToLowerCase, true, false)

o

Dim mRepetir_Envio As String= IIF(rsNotificaciones_Enviar.GetString("Repetir_Envio").ToLowerCase, "true", "false")

o

Dim mRepetir_Envio As Boolean = rsNotificaciones_Enviar.GetString("Repetir_Envio").ToLowerCase


B4X:
Public Sub IIF(InputQuestion As Boolean, OutputTrue As Object, OutputFalse As Object) As Object
    If InputQuestion Then Return OutputTrue Else Return OutputFalse
End Sub
 

MauSan

New Member
Licensed User
Hola oparra, gracias por tu respuesta y tu tiempo.

Probando las opciones que sugeriste, ninguna me dió resultado (la variable mRepetir_Envio esta declarada como boolean que menciono en el post anterior), pero haciendo un log directo al campo del resultset, lo lee como entero dando un 0 (el valor por omision en la tabla es falso), lo que hice fué modificar tu rutina IIF de la siguiente manera:

Rutina IIF2:
Public Sub IIF2(InputQuestion As Int, OutputTrue As Object, OutputFalse As Object) As Object
    
    If InputQuestion = 1 Then Return OutputTrue Else Return OutputFalse
    
End Sub

Me parece una buena opción para éstos casos y gracias nuevamente, saludos
 

oparra

Well-Known Member
Licensed User
puedes envías la condiciones en forma directa a la rutina IIF e incluso con AND u OR sin modificar la rutina

Intenta este ejemplo:

Return un boolean

mRepetir_Envio = IIF(rsNotificaciones_Enviar.GetInt("Repetir_Envio") = 1, true, false)

o return un string

mRepetir_Envio = IIF(rsNotificaciones_Enviar.GetInt("Repetir_Envio") = 1, "Si", "No")

Esta rutina es muy usada para varias soluciones de condiciones IF.

Asi puedes usar la rutina y veras lo util que es:

c = IIF( a = 1 And b = 2, 1+2, 2-1)

en lo personal yo la ocupo mucho esta y otras rutinas que muchos en foro piden que sea parte del core de B4X.


Saludos
 
Last edited:

MauSan

New Member
Licensed User
Excelente !
Muchas gracias por la ayuda oparra, sin duda muy útil ésta rutina.

La probaré como mencionas.

Saludos
 
Top