Spanish TABLA SQL datos fantasma

Discussion in 'Spanish Forum' started by VictorTandil, Sep 15, 2019.

  1. VictorTandil

    VictorTandil Member Licensed 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:

    Code:
    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...

    Code:
    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 ?
     
  2. José J. Aguilar

    José J. Aguilar Well-Known Member Licensed User

    Has probado a listar esos datos a ver qué sale con un SELECT?
    Code:
    "SELECT * FROM POINTS WHERE (SPEED > 120) AND (SPEED <=180)"
     
  3. VictorTandil

    VictorTandil Member Licensed 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:

    Code:
    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

    Code:
    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)>0And ((Round2(Punto.Get("SPEED"), 0))<=50Then
                        V1 = V1 + 
    1
                    
    End If
                       
                    
    If (Round2(Punto.Get("SPEED"), 0)>50And ((Round2(Punto.Get("SPEED"), 0))<=75Then
                        V2 = V2 + 
    1
                    
    End If
               
                    
    If (Round2(Punto.Get("SPEED"), 0)>75And ((Round2(Punto.Get("SPEED"), 0))<=90Then
                        V3 = V3 + 
    1
                    
    End If
               
                    
    If (Round2(Punto.Get("SPEED"), 0)>90And ((Round2(Punto.Get("SPEED"), 0))<=120Then
                        V4 = V4 + 
    1
                    
    End If
                       
                    
    If (Round2(Punto.Get("SPEED"), 0)>120And ((Round2(Punto.Get("SPEED"), 0))<=180Then
                        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.-
     
  4. José J. Aguilar

    José J. Aguilar Well-Known Member Licensed 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.
     
  5. VictorTandil

    VictorTandil Member Licensed User

    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.

    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
     
  6. José J. Aguilar

    José J. Aguilar Well-Known Member Licensed User

    No, me refiero a qué salida da el select que te puse en el segundo post
     
  7. IdasI4A

    IdasI4A Member Licensed User

    ¿Como tienes definida la columna SPEED en la tabla?
    En el código pones
    Code:
    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.
     
    José J. Aguilar likes this.
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice