none
problema de while y for each vb.net RRS feed

  • Pregunta

  • hola nuevamente

    tengo problema con los bucles while y for each.

    Tengo el siguiente codigo:

     

     Dim dato1, dato2, existe As Integer
                Dim sql As String = "select cod_suc from ruta"
                Dim coma As New OdbcCommand(sql, Globals.CONEXION)
                Dim dr As OdbcDataReader
                Globals.CONEXION.Open()
                dr = coma.ExecuteReader
                While dr.Read
    
                    For Each item As ListViewItem In listViewCrearRutas.Items
                      
                      
                        dato1 = CInt(item.Text)
                        dato2 = CInt(item.SubItems(3).Text)
                        existe = Convert.ToInt32(dr("cod_suc"))
                        MsgBox(dato1)
                        MsgBox(existe)
                        If existe <> dato1 Then
                     
                            MsgBox("no existe")
                        Else
                            MsgBox("Existe")
                        End If
                     
                    Next
                End While
    

     

    voy guardando en una variable llamada existe que me guarda el cod_suc y despues busco con el for each en un listview en la primer columna el cod_suc que lo guardo en la variable dato1.

    Pero a la hora de entrar en el IF la primera vez me dice que la variable existe es = a la variable dato1, pero como estoy adentro del for each la variable existe siempre queda del mismo valor porq no entra en el while.

    Mi pregunta es cmo puedo hacer para que pase una vez por for each y entre al while y asi sucesivamente 

    lunes, 3 de octubre de 2011 21:20

Respuestas

  • lo unico que quiero hacer es que me valla tomando lso datos de la primer columna del listview y valla verificando si existe en la base de datos,

    pero si quieres lograr esto lo estas encarando de forma incorrecta, no haces un while y un for each para esto, lo que debes recorrer solo es la lista y lanzar una query por cada item del listbox consultando si existe en la tabla el valor que esta en el listview

    usarias algo como esto

     

    [ADO.NET] Parte 5 - Ejemplos Simples Operaciones CRUD

    veras alli el metodo Exists() este devuelve dado un codigo o id si existe en la tabla

     

    usarias algo como esto

    For Each item As ListViewItem In listViewCrearRutas.Items
      
    	Dim dato1 As Integer = CInt(item.Text)
    	Dim dato2 As Integer = CInt(item.SubItems(3).Text)
    	
    	If Existe(dato1) Then
    		MsgBox("no existe")
    	Else
    		MsgBox("Existe")
    	End If
     
    Next
    


    con un metodo como este

    Private Function Existe(codsuc As Integer) As Boolean
    
    	Globals.CONEXION.Open()
    	
    	Dim sql As String = "select COUNT(*) from ruta WHERE cod_suc = ?"
    	Dim coma As New OdbcCommand(sql, Globals.CONEXION)
    	coma.Parameters.AddWithValue("?", codsuc)
    
    	Dim cant As Integer = coma.ExecuteScalar()
    	
    	Globals.CONEXION.Close()
    	
    	If cant > 0 Then
    		Return True
    	Else
    		Return False
    	End If 
    	
    	
    End Sub
    

    por supuesto quizas debas adaptarlo algo mas, pero la idea es que solo recorres el control y validas por cada uno si esta presente en la tabla de tu db

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 3 de octubre de 2011 23:57

Todas las respuestas

  • Hola,

    En el bucle For each tienes que ejecutar Exit For

      For Each item As ListViewItem In listViewCrearRutas.Items
                      
                      
                        dato1 = CInt(item.Text)
                        dato2 = CInt(item.SubItems(3).Text)
                        existe = Convert.ToInt32(dr("cod_suc"))                    
                        If (existe = dato1) Then
                          Exit For
                           
                        End If
                     
                    Next
    

    Saludos,


    phurtado
    lunes, 3 de octubre de 2011 22:24
  • hola pedro, habia probado pero nada ç, me sigue manteniendo el valor de la variable existe que esta dentro de while :(
    lunes, 3 de octubre de 2011 22:30
  • Hola,

    Perdona pero es que no me di cuenta  donde estabas leyendo el dato.

     While dr.Read
    
                     Dim existe as Integer = Convert.ToInt32(dr("cod_suc"))
                    For Each item As ListViewItem In listViewCrearRutas.Items
                      
                      
                        dato1 = CInt(item.Text)
                        dato2 = CInt(item.SubItems(3).Text)
                        
                       
                        If (existe=  dato1) Then
                               Exit For
                        End If
                     
                    Next
                End While
    

    Saludos,


    phurtado
    lunes, 3 de octubre de 2011 22:33
  • lo mismo :S
    lunes, 3 de octubre de 2011 22:38
  • Hola,

    Pero existe es igual a dato1. Eso se cumple ? Porque si se cumple sale del bucle for y lee el siguiente registro. es dato1 o es dato2?

    Saludos,


    phurtado
    lunes, 3 de octubre de 2011 22:52
  • dice q no existe porq dato1 es siempre igual, 
    lunes, 3 de octubre de 2011 22:59
  • Hola,

    Pero no tendrías que agregar un dato al ListView una vez que no exista o eso lo tienes precargado desde otro sitio. Piensa en lo que te estoy comentando. Que pasa que en todo el ListView tienes los mismos datos.

    Saludos,


    phurtado
    lunes, 3 de octubre de 2011 23:01
  • la cosa es asi, yo tengo datos en el listview, lo unico que quiero hacer es que me valla tomando lso datos de la primer columna del listview y valla verificando si existe en la base de datos, por eso cree la variable existe que la igualo a la columna cod_suc de la tabla ruta.

    Pero al hacer while dr.read me iguala la variable existe con el dato de la columna pero una vez entrado al for each no vuelve al while entonces la variable existe tiene siempre el mismo valor, no me sigue leyendo con dr.read

    lunes, 3 de octubre de 2011 23:10
  • Hola, 

    Pero entonces no veo los dos bucles.

    1. Tu recorres tus items.

    2. Lees de la base de datos por el valor del Item.

    3. Preguntas por HasRows del objeto DataReader.

    Si existe haces una cosa en caso contrario otra.

    No necesitas dos bucles, necesitas cambiar la sentencia sql para que filtre por el valor del item del ListView.

     

     

    Saludos,

     


    phurtado
    lunes, 3 de octubre de 2011 23:18
  • lo unico que quiero hacer es que me valla tomando lso datos de la primer columna del listview y valla verificando si existe en la base de datos,

    pero si quieres lograr esto lo estas encarando de forma incorrecta, no haces un while y un for each para esto, lo que debes recorrer solo es la lista y lanzar una query por cada item del listbox consultando si existe en la tabla el valor que esta en el listview

    usarias algo como esto

     

    [ADO.NET] Parte 5 - Ejemplos Simples Operaciones CRUD

    veras alli el metodo Exists() este devuelve dado un codigo o id si existe en la tabla

     

    usarias algo como esto

    For Each item As ListViewItem In listViewCrearRutas.Items
      
    	Dim dato1 As Integer = CInt(item.Text)
    	Dim dato2 As Integer = CInt(item.SubItems(3).Text)
    	
    	If Existe(dato1) Then
    		MsgBox("no existe")
    	Else
    		MsgBox("Existe")
    	End If
     
    Next
    


    con un metodo como este

    Private Function Existe(codsuc As Integer) As Boolean
    
    	Globals.CONEXION.Open()
    	
    	Dim sql As String = "select COUNT(*) from ruta WHERE cod_suc = ?"
    	Dim coma As New OdbcCommand(sql, Globals.CONEXION)
    	coma.Parameters.AddWithValue("?", codsuc)
    
    	Dim cant As Integer = coma.ExecuteScalar()
    	
    	Globals.CONEXION.Close()
    	
    	If cant > 0 Then
    		Return True
    	Else
    		Return False
    	End If 
    	
    	
    End Sub
    

    por supuesto quizas debas adaptarlo algo mas, pero la idea es que solo recorres el control y validas por cada uno si esta presente en la tabla de tu db

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 3 de octubre de 2011 23:57