Spanish TABLA SQL datos fantasma

VictorTandil

Member
Licensed User
Longtime User
Hola, tengo una tabla de posiciones GPS, con LAT, LON, SPEED, etc. El problema es que al intentar categorizar los datos de las velocidades, se me arrojan resultados "fantasmas" que salen del rango de la tabla. Por ejemplo:

B4X:
Dim V1, V2, V3, V4, V5, Total_Puntos As Float = 0
    V1 = Round(Starter.SQL1.ExecQuerySingleResult("SELECT COUNT(SPEED) FROM POINTS WHERE (SPEED > 0) AND (SPEED <=50)"))
    V2 = Round(Starter.SQL1.ExecQuerySingleResult("SELECT COUNT(SPEED) FROM POINTS WHERE (SPEED > 50) AND (SPEED <=75)"))
    V3 = Round(Starter.SQL1.ExecQuerySingleResult("SELECT COUNT(SPEED) FROM POINTS WHERE (SPEED > 75) AND (SPEED <=90)"))
    V4 = Round(Starter.SQL1.ExecQuerySingleResult("SELECT COUNT(SPEED) FROM POINTS WHERE (SPEED > 90) AND (SPEED <=120)"))
    V5 = Round(Starter.SQL1.ExecQuerySingleResult("SELECT COUNT(SPEED) FROM POINTS WHERE (SPEED > 120) AND (SPEED <=180)"))
    Total_Puntos = Round(Starter.SQL1.ExecQuerySingleResult("SELECT COUNT(SPEED) FROM POINTS WHERE (SPEED > 0)"))

Tiro un LOG de los valores...

B4X:
Log("V1: " & V1)
    Log("V2: " & V2)
    Log("V3: " & V3)
    Log("V4: " & V4)
    Log("V5: " & V5)
    Log("TP: " & Total_Puntos)

y arrojan:
V1: 12530
V2: 717
V3: 0
V4: 0
V5: 2699
TP: 13247

V1 a V4 tiran bien los datos, pero V5 da 2699 puntos entre 120 y 180 km/h que superan la cantidad total de puntos de la tabla, porque si sumamos V1 a V4 estan perfectamente los puntos totales. Entonces, de donde salen los puntos de V5? y no solo eso, sino que el vehiculo nunca anduvo a esa velocidad.

No logro descifrar el error, alguien que se de cuenta ?
 

josejad

Expert
Licensed User
Longtime User
Has probado a listar esos datos a ver qué sale con un SELECT?
B4X:
"SELECT * FROM POINTS WHERE (SPEED > 120) AND (SPEED <=180)"
 

VictorTandil

Member
Licensed User
Longtime User
De hecho cargo todos los datos en una lista y recorro los datos uno a uno y muestran bien los resultados, pero nunca aparecen esos 2699 puntos ni las velocidades. Por ahora lo he solucionado de esa forma, es muy extraño, pero es la unica forma que funcione correctamente. Aqui se ve el codigo:

B4X:
Sub Load_Points
    If File.Exists(File.DirInternal, "POINTS.LST") Then       
        PolyList.Initialize
        Dim Cursor1 As Cursor
        Cursor1 = SQL1.ExecQuery("SELECT HORA, LAT, LON, SPEED, SIGNAL FROM POINTS")
        If Cursor1.RowCount > 0 Then
            For i = 0 To Cursor1.RowCount - 1
                Cursor1.Position = i
                Dim Punto As Map = CreateMap("HORA" : Cursor1.GetString("HORA"), "LAT" : Cursor1.GetString("LAT"), "LON" : Cursor1.GetString("LON"), "SPEED" : Cursor1.GetString("SPEED"), "SIGNAL" : Cursor1.GetString("SIGNAL"))
                PolyList.Add(Punto)
            Next
        Else
            
        End If       
        Cursor1.Close       
    Else
        ToastMessageShow("Error loading points list", False)
    End If
End Sub


B4X:
Dim V1, V2, V3, V4, V5, Total_Puntos As Float = 0
    If Starter.PolyList.IsInitialized = True Then
        Dim Punto As Map
        Punto.Initialize
        Total_Puntos = Starter.PolyList.Size
               
        For i = 0 To Starter.PolyList.Size - 1
                Punto = Starter.PolyList.Get(i)
                If (Round2(Punto.Get("SPEED"), 0)>0) And ((Round2(Punto.Get("SPEED"), 0))<=50) Then
                    V1 = V1 + 1
                End If
                   
                If (Round2(Punto.Get("SPEED"), 0)>50) And ((Round2(Punto.Get("SPEED"), 0))<=75) Then
                    V2 = V2 + 1
                End If
           
                If (Round2(Punto.Get("SPEED"), 0)>75) And ((Round2(Punto.Get("SPEED"), 0))<=90) Then
                    V3 = V3 + 1
                End If
           
                If (Round2(Punto.Get("SPEED"), 0)>90) And ((Round2(Punto.Get("SPEED"), 0))<=120) Then
                    V4 = V4 + 1
                End If
                   
                If (Round2(Punto.Get("SPEED"), 0)>120) And ((Round2(Punto.Get("SPEED"), 0))<=180) Then
                    V5 = V5 + 1
                End If              
        Next
    Else
        LogColor("POLYLIST NOT INITIALIZED!", Colors.Red)
    End If

Gracias Jose por tu respuesta y si logras ver la diferencia me gustaria saberla para futuros usos. Un abrazo.-
 

josejad

Expert
Licensed User
Longtime User
Es decir, que el SELECT no muestra datos, pero el SELECT COUNT sí da una cantidad?
Por cierto, no entiendo por qué redondeas el resultado de COUNT si debe dar un número entero.
 

VictorTandil

Member
Licensed User
Longtime User
Es decir, que el SELECT no muestra datos, pero el SELECT COUNT sí da una cantidad?

Claro. Este SELECT ... Cursor1 = SQL1.ExecQuery("SELECT HORA, LAT, LON, SPEED, SIGNAL FROM POINTS") da los registros correctos, sin puntos de mas, pero cargados en una lista.

Por cierto, no entiendo por qué redondeas el resultado de COUNT si debe dar un número entero.

Sabia que me ibas a decir eso jajja pero probe tantas cosas que al final quedaron ahi, ya los saque. En fin, a esos puntos de mas que aparecen no les encuentro explicación ya que filtrando por velocidad y listando uno a uno nunca aparecen.

Tambien lei que el COUNT da registro Null y vacios, pero en este caso no cumplirian con la condicion de velocidad, asique no son registros vacios que esta contando
 

josejad

Expert
Licensed User
Longtime User
No, me refiero a qué salida da el select que te puse en el segundo post
 

IdasI4A

Active Member
Licensed User
Longtime User
¿Como tienes definida la columna SPEED en la tabla?
En el código pones
B4X:
Cursor1.GetString("SPEED")
Si SPEED es una columna tipo String entonces, por ejemplo, la velocidad "15" esta entre "120" y "180", pues como STRING es "120"<"15"<"180", y de hay los resultados fantamas.
Tendrías que definir la velocidad com INTEGER.
 
Top