Spanish Mostrar mensajes de un .db al hacer click en listview B4A

iRobotD

New Member
Buenas,

soy nuevo en este mundillo y tengo un problema con mi código. Expongo la situación:

Estoy trabajando en una aplicación de listados de fallos. A través de una base de datos .db muestro en un list view los fallos. Mi problema es que cuando hago clic encima de un item del list view quiero que se me muestren 2 msgbox uno indicando la causa del fallo y otro indicando la solución (ambos datos causa y solución también están en la base de datos).

Adjunto mi código:

B4X:
Sub Carga_BD_en_ListView_Fallos
    'Limpia el ListaFallos
    ListaFallos.Clear
    
    'Carga toda la tabla tipos de la db errores.db en registroFallos
    registroFallos = SQL1.ExecQuery("SELECT ID, Codigo, Mensaje, Causa, Solucion FROM ListaErrores WHERE id BETWEEN 1 AND 413")

    For n = 0 To registroFallos.RowCount - 1
        registroFallos.Position = n
    
        'Se asigna a cada String declarado a donde hace referencia en la tabla SQL
        codigo = registroFallos.GetString("Codigo"):
        mensaje = registroFallos.GetString("Mensaje"):
        causa = registroFallos.GetString("Causa"):
        solucion = registroFallos.GetString("Solucion"):
        id = registroFallos.GetInt("ID"):
        
        ListaFallos.AddTwoLinesAndBitmap(codigo, mensaje, LoadBitmap(File.DirAssets,"robotlist.png"))
        ListaFallos.SingleLineLayout.ItemHeight = 90
        ListaFallos.SingleLineLayout.Label.TextSize = 20
        ListaFallos.SingleLineLayout.Label.TextColor = Colors.Black
        ListaFallos.SingleLineLayout.Label.Color = Colors.White
    Next
End Sub


Sub ListaFallos_ItemClick (Position As Int, Value As Object)

    Select Position
        
        '----------------------------------------------------------------------------------------------------------------------
        Case 0
                respuesta = Msgbox2(causa , codigo,"", "Solución","", LoadBitmap(File.DirAssets,"robotlist.png"))
                
                If respuesta = DialogResponse.CANCEL Then
                respuesta = Msgbox2(solucion, codigo, "Salir", "","", LoadBitmap(File.DirAssets,"robotlist.png"))   
        End If
        '----------------------------------------------------------------------------------------------------------------------
                    
    End Select

End Sub

Con este código solo me muestra el último causa/solución de mi .db alguien sabria decirme como hacer un bucle para que vaya relacionando cada error con su causa y solución al hacer clic??

gracias.
 

J M Movilla Cuadrado

Member
Licensed User
A mi entender, la subrutina Carga_BD_en_ListView_Fallos está bien configurada, por lo que el ListView debe quedar relleno con los 413 items (suponiendo que ID no tenga saltos vacíos...)

Por tanto el fallo ha de estar en la presentación del ListView, que sólo permite la visualización del último item.
 

iRobotD

New Member
A mi entender, la subrutina Carga_BD_en_ListView_Fallos está bien configurada, por lo que el ListView debe quedar relleno con los 413 items (suponiendo que ID no tenga saltos vacíos...)

Por tanto el fallo ha de estar en la presentación del ListView, que sólo permite la visualización del último item.

Buenas, gracias por contestar tan rápido. Sí, el ListView se rellena correctamente con los 413 errores. El problema es en el evento de hacer clic en un item del list view, no sé como hacer que para el item1 de listview me saque un msgbox con la causa1 y solucion1 de la base de datos..
 

J M Movilla Cuadrado

Member
Licensed User
Asigna a una variable x el valor del codigo en la fila de ListaFallos que hayas seleccionado, y busca o filtra en registroFallos "WHERE codigo = " & x
 

iRobotD

New Member
Asigna a una variable x el valor del codigo en la fila de ListaFallos que hayas seleccionado, y busca o filtra en registroFallos "WHERE codigo = " & x

Perdona J M no entiendo muy bien que quieres decir.. podrías acompañarmelo de un ejemplo? Llevo poco en esto y hay cosas que aun se me escapan.. gracias
 

IdasI4A

Active Member
Licensed User
Longtime User
Te adjunto un ejemplo modificando un poco tus funciones.
B4X:
Sub Carga_BD_en_ListView_Fallos
    'Limpia el ListaFallos
    Dim registroFallos As Cursor
    Dim Codigo, Mensaje As String
    Dim N, ID As Int
    
    ListaFallos.Clear
    
    'Carga toda la tabla tipos de la db errores.db en registroFallos
    registroFallos = SQL1.ExecQuery("SELECT ID, Codigo, Mensaje, Causa, Solucion FROM ListaErrores WHERE id BETWEEN 1 AND 413")

    For n = 0 To registroFallos.RowCount - 1
        registroFallos.Position = n
    
        'Se asigna a cada String declarado a donde hace referencia en la tabla SQL
        Codigo = registroFallos.GetString("Codigo")
        Mensaje = registroFallos.GetString("Mensaje")
        ID = registroFallos.GetInt("ID")
        
        ListaFallos.AddTwoLinesAndBitmap2(Codigo, Mensaje, LoadBitmap(File.DirAssets,"robotlist.png"),ID)
        ListaFallos.SingleLineLayout.ItemHeight = 90
        ListaFallos.SingleLineLayout.Label.TextSize = 20
        ListaFallos.SingleLineLayout.Label.TextColor = Colors.Black
        ListaFallos.SingleLineLayout.Label.Color = Colors.White
    Next
    registroFallos.Close
End Sub

He usuado ListaFallos.AddTwoLinesAndBitmap2 en vez de ListaFallos.AddTwoLinesAndBitmap, para asignar el id a cada linea

B4X:
Sub ListaFallos_ItemClick (Position As Int, Value As Object)
    Dim registroFallos As Cursor
    Dim Codigo,  Causa, Solucion As String
    Dim  ID, respuesta As Int
    
    ID=Value
    
    registroFallos = SQL1.ExecQuery("SELECT ID, Codigo, Mensaje, Causa, Solucion FROM ListaErrores WHERE id =" & ID)
    If registroFallos.RowCount=0 Then
        registroFallos.Close
        Return
    End If
    registroFallos.Position=0
    Codigo = registroFallos.GetString("Codigo"):
    Causa = registroFallos.GetString("Causa"):
    Solucion = registroFallos.GetString("Solucion"):
        
    respuesta = Msgbox2(Causa , Codigo,"", "Solución","", LoadBitmap(File.DirAssets,"robotlist.png"))
      
    If respuesta = DialogResponse.CANCEL Then
        respuesta = Msgbox2(Solucion, Codigo, "Salir", "","", LoadBitmap(File.DirAssets,"robotlist.png"))
    End If

End Sub

Y aqui al hacer click en una linea recupero el id y con ese id recupero toda la información necesaria de la base de datos.
 

iRobotD

New Member
Muchas gracias, era justo lo que necesitaba. No había tenido en cuenta cambiar AddTwoLinesAndBitmap por AddTwoLinesAndBitmap2. Mil gracias.
 
Top