Spanish B4XTables: ¿Cómo poder comparar dos tablas para resaltar en una de ellas las filas que existen en la otra?

Gabino A. de la Gala

Active Member
Licensed User
Longtime User
Buenas noches.

Estoy haciendo pruebas con el CreateView para filtrar el contenido de una tabla en función del registro seleccionado en otra. Para ello aplico como filtro del createview que tengan el mismo valor en los campos, artículo y unidades (que son por los que realmente necesito comparar). Y el filtrado lo hace bien, pero no tengo muy claro como saber desde programa realmente si ha encontrado registros o no en la segunda tabla.

Quizás no sea ni necesario utilizar el create view...

O sea, lo que necesito es poder "puntear" que todos los registros de la tabla1 están en la tabla2 y sino están todos, entonces resaltar con un color diferente los registros de la tabla1 que no estén en la tabla2.

Espero haberme explicado.
 

José J. Aguilar

Expert
Licensed User
Hola Gabino:

No pillo lo del CreateView (creo que es para crear algún tipo de filtro? No lo he usado)

Te adjunto un pequeño ejemplo sin probar mucho, a ver si te vale.

Basado en:

V1.15 - New BuildQuery method. This method can be used to get the SQL query that was used to set the table data with the current state and filter.
Usage example:
B4X:
Dim o() As Object = B4XTable1.BuildQuery(False) 'True to include the page LIMIT in the query.
Dim rs As ResultSet = B4XTable1.sql1.ExecQuery2(o(0), o(1))
Do While rs.NextRow
Log(rs.GetString(B4XTable1.GetColumn("State").SQLID))
Loop
rs.Close
[code]

https://www.b4x.com/android/forum/threads/solved-how-to-change-the-color-of-a-b4xtable-row-according-to-content-and-then-disable-it.115988/post-724866

No está muy probado, y tendrías que controlar cosas como por ejemplo que haya más de una página (en ese caso da error), pero ya eso te lo dejo a tí, jeje... suponiendo que sea esto lo que necesites.

1640809822578.png
 

Attachments

  • Tablas.zip
    9.2 KB · Views: 33
Last edited:

Gabino A. de la Gala

Active Member
Licensed User
Longtime User
Muchas gracias @José J. Aguilar. He estado probando tu ejemplo, pero me he encontrado con algún problema cuando la b4xtable tiene diferentes páginas, ya que aparentemente lanza una excepción al intentar cambiar el color de fondo de una fila que no está visible.

Lo estoy intentando hacer con la librería de B4XTableSelections que parece que se encarga de todo.

Adjunto ejemplo que permite definir un número de campos variable para las comparaciones.
 

Attachments

  • B4XTablesBuscandoRegistrosEnOtra.zip
    5.6 KB · Views: 30

Gabino A. de la Gala

Active Member
Licensed User
Longtime User
Una vuelta de tuerca más utilizando la posibilidad que nos brindan las B4XTables de acceder a los datos como si de una tabla de una base de datos se tratara.
En lugar de utilizar un for para ir recorriendo las diferentes rows hasta encontrar la deseada, lo hacemos lanzando un sql con la condición en el where que necesitemos en cada momento.
Supongo que será más eficiente cuando las tablas a comparar tengan muchos registros. (;-) @José J. Aguilar)

B4X:
' Procedimiento para localizar fácilemente las diferencias entre dos tablas pudiendo definir el campo/campos por los que realizar las validaciones
Private Sub CompararTablasV2(t1 As B4XTable, t2 As B4XTable, fields As List)
    B4XTableSelections1.Clear
    Dim nRow, nField As Int
    Dim Encontrado As Boolean
    ' Obtengo todos los registros de la tabla "origen"
    Dim rs1 As ResultSet = t1.sql1.ExecQuery("select * from data")
    nRow = 0
    ' Recorro todas las filas de la tabla origen para buscarlas en la t2 y si no las encuentro, entonces las resalto para localizar más fácilmente las diferencias...
    Do While rs1.NextRow
        nRow = nRow +1
        Dim sql As String
        'Construyo la parte del where del sql recorriendo todos los campos que se pasaron como parámetro
        For nField = 0 To fields.Size-1
            If sql.Length > 0 Then sql = sql & " and "
            sql = sql & t2.GetColumn(fields.get(nField)).SQLID & "= '" & rs1.GetString(t1.GetColumn(fields.get(nField)).SQLID) & "'"
        Next
        ' Ahora construyo el resto del sql
        sql = "select * from data where " & sql
        ' Lo lanzo...
        Dim rs2 As ResultSet = t2.sql1.ExecQuery(sql)
        ' Y si me devuelve registros es que lo encontré
        Encontrado = rs2.NextRow
        ' Si no lo encontré, entonces es cuando resalto la fila correspondiente...
        If Not(Encontrado) Then B4XTableSelections1.CellClicked(fields.get(0).As(String), nRow)
    Loop
End Sub
 
Top