Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: mdg en 26 Agosto 2007, 21:55 pm



Título: Bucles.
Publicado por: mdg en 26 Agosto 2007, 21:55 pm
Hola amigos!


Tengo en una misma rutina dos bucles, o almenos es lo que intento, uno para recorrer los rst de una tabla e insertar los registros en un listview y otro para hacer correr un progressbar pero no logro hacer que marche, aver si pueden echarme una mano y decirme donde tengo el error:


Dim cuantoshay As Integer
Dim contadorfor As Integer
Dim lrg As Double
Dim intv As Double
Dim ctat As Integer
Dim prct As Integer
Dim sql As String
Dim rst As DAO.Recordset
Dim lstitem As ListItem
Dim indice As Long
Dim empresa As Integer

indice = indice + 1
empresa = Mid(Val(MDIForm1.lblempresa.Caption), 1, 4)
Me.ListView1.View = 3

DBpath = App.Path & "\Datos\tablas.mdb"
 strsql = "SELECT * FROM tbl_empleados where empresa=" & empresa
  Set db = DBEngine.OpenDatabase(DBpath, False, False, ";pwd=" & MiPass)
    Set rst = db.OpenRecordset(strsql)
 
rst.MoveFirst
 rst.MoveLast

cuantoshay = rst.RecordCount

For contadorfor = 0 To cuantoshay - 1

'ACA RECORRO LOS RST Y LOS INSERTO EN EL LISTVIEW PERO SOLO
ME INSERTA EL PRIMERO Y LUEGO NADA
Do Until rst.EOF
Set lstitem = Me.ListView1.ListItems.Add(indice, , rst("legajo"))
    ListView1.ListItems(indice).ListSubItems.Add , , Me.txtconcepto.Text
    ListView1.ListItems(indice).ListSubItems.Add , , Me.lblconcepto.Caption
rst.MoveNext
Loop
   
 

Me.lblporcentaje.Visible = True
Me.progreso.Visible = True

lrg = Me.ancho.Width 'para el ancho total al que debe llegar la barra de progres
intv = lrg / cuantoshay 'valor por cada archivo

            ctat = ctat + 1 'valor 1
            prct = (ctat / cuantoshay) * 100 'porcentaje 1
           
            Me.progreso.Visible = True
            Me.progreso.Width = ctat * intv 'el progreso es desde 1 * intv
            Me.lblporcentaje.Caption = prct & " %" 'muestra el porcentaje transcurrido
           
Next

La barra corre bien por que inserte un msgbox antes del next para constatar que no tuviera el problema ahi pero no, asi que no logro dar con la solucion, por otro lado tambien intente hacer los dos procesos por separado pero en caso de que se produsca un error o inconveniento uno de los procesos terminaria antes que el otro y no se veria profesional, desde ya muchas gracias por su ayuda y por su atencion.


Título: Re: Bucles.
Publicado por: cobein en 27 Agosto 2007, 08:33 am
Bueno en realidad no estoy seguro pero mira esto

rst.MoveFirst 
 rst.MoveLast

^^^^^ En realidad me parece que te carga elultimo registro y nada mas, tendrias que mover el puntero al principio creo.

cuantoshay = rst.RecordCount

For contadorfor = 0 To cuantoshay - 1

'ACA RECORRO LOS RST Y LOS INSERTO EN EL LISTVIEW PERO SOLO
ME INSERTA EL PRIMERO Y LUEGO NADA
Do Until rst.EOF
Set lstitem = Me.ListView1.ListItems.Add(indice, , rst("legajo"))
    ListView1.ListItems(indice).ListSubItems.Add , , Me.txtconcepto.Text
    ListView1.ListItems(indice).ListSubItems.Add , , Me.lblconcepto.Caption
rst.MoveNext
Loop
   
 

Me.lblporcentaje.Visible = True
Me.progreso.Visible = True

lrg = Me.ancho.Width 'para el ancho total al que debe llegar la barra de progres
intv = lrg / cuantoshay 'valor por cada archivo

            ctat = ctat + 1 'valor 1
            prct = (ctat / cuantoshay) * 100 'porcentaje 1
           
            Me.progreso.Visible = True
            Me.progreso.Width = ctat * intv 'el progreso es desde 1 * intv
            Me.lblporcentaje.Caption = prct & " %" 'muestra el porcentaje transcurrido
           
Next


En cuanto al resto del codigo que sugiero que lo mires bien por que esta mal,  tenes un for que va de 0 hasta EOF-1 y dentro de eso un loop que va de BOF a EOF, lo que quiere decir que vas a hacer andar el loop tantas veces como registros tengas.


Título: Re: Bucles.
Publicado por: elmaro en 27 Agosto 2007, 20:08 pm
cobein seguramente lo de

Código:
rst.MoveFirst 
 rst.MoveLast

es para depsues poder utilizar el recordcount, ya que en algunas webs dice q folo funciona cuando se esta en el ultimo registro, tonces hay que hacer un rst.MoveLast y que a veces ni asi funciona
yo creo q todo es mie*da, y utilizo algo mas sencillo

asi que mdg utiliza esto para contar los registros, seguro y rapido

Código:
rst.Close
rst.Open "select count(*) from TABLA WHERE= condiciones", cnn, adOpenDynamic, adLockOptimistic
TotalReg = Val(rst.GetString)

la variable TotalReg contiene la cantidad de registros.

espero te sirva, adios


Título: Re: Bucles.
Publicado por: mdg en 28 Agosto 2007, 02:57 am
Hola muchachos, gracias a ambos, elmaro , gracias por pasarme el codigo para contar registros me viene al pelo,gracias a sus sugerencias pude solucionar la cuestion asi:

Dim cuantoshay As Integer
Dim contadorfor As Integer
Dim lrg As Double
Dim intv As Double
Dim ctat As Integer
Dim prct As Integer
Dim sql As String
Dim rst As DAO.Recordset
Dim lstitem As ListItem
Dim indice As Long

Me.ListView1.View = 3
indice = indice + 1
DBpath = App.Path & "\Datos\tablas.mdb"
 strsql = "SELECT * FROM tbl_empleados"
  Set db = DBEngine.OpenDatabase(DBpath, False, False, ";pwd=" & MiPass)
    Set rst = db.OpenRecordset(strsql)
   
    'Movemos el foco de los registros del inicio al fin
    'con el objeto de contarlos lugo
   
    rst.MoveFirst
     rst.MoveLast
     
     'Volvemos a mover el foco al primer registro
       rst.MoveFirst
     
     
cuantoshay = rst.RecordCount

For contadorfor = 0 To cuantoshay - 1

Me.lblporcentaje.Visible = True
Me.progreso.Visible = True

lrg = Me.ancho.Width 'para el ancho total al que debe llegar la barra de progres
intv = lrg / cuantoshay 'valor por cada archivo

            ctat = ctat + 1 'valor 1
            prct = (ctat / cuantoshay) * 100 'porcentaje 1
           
            Me.progreso.Visible = True
            Me.progreso.Width = ctat * intv 'el progreso es desde 1 * intv
            Me.lblporcentaje.Caption = prct & " %" 'muestra el porcentaje transcurrido
           
           
                           
Set lstitem = Me.ListView1.ListItems.Add(indice, , rst("legajo"))
       

rst.MoveNext

Next

Osea movia el registro del primero al ultimo para contarlos y luego lo muevo nuevamente al principio antes de comenzar el bucle, gracias nuevamente y pueden cerrar el tema.-


Título: Re: Bucles.
Publicado por: elmaro en 28 Agosto 2007, 15:54 pm
me alegro por ti
cualquier duda pregunta :)