MoveFirst, MoveLast, etc.

Colapsar
X
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar todos
nuevos mensajes

  • MoveFirst, MoveLast, etc.

    Hola de nuevo.
    Ya está aquí vuestra pesadilla.
    En esta ocasión quería pedir vuestra ayuda para generar los eventos de movimiento a través de los registros de un recordset.
    Ocurre que no encuentro el equivalente a estos eventos en VB .NET
    Os prometo que antes de decidirme a daros de nuevo el "coñazo" he buscado por la red, pero no encuentro nada. Bueno, a lo mejor es que no he buscado en los lugares apropiados, pero os prometo que lo he intentado.
    Saludos a todos y gracias por vuestra ayuda.

  • #2
    ¿Eventos?, MoveFirst, MoveNext, ...son métodos del objeto ADODB.Recorset, si coninuas usando ADODB, los tendrás, pon un ejemplo del código para ver cual es el problema.
    Una visita a las Normas del foro nunca viene mal

    Comentario


    • #3
      Muchas gracias por atenderme de nuevo Gilman.
      Código:
       'Esta es la cadena de conexion que utilizo.
      'La base de datos es Acces 2016.
      'Provider= Microsoft.ACE.OLEDB.12.0; Data Source = C:\Academia\Academia.accdb; Persist Security Info = False
      
      'y esta la sql con la que selecciono los datos.
          Private Sub buscar()
              cmd.Connection = conn
              cmd.CommandType = CommandType.Text
              If conn.State = ConnectionState.Closed Then
                  conn.Open()
              End If
              cargaCursos()
              cSql = "SELECT Alumnos.idAlumno, Alumnos.Nombre, Alumnos.Apellidos, Alumnos.Movil, Alumnos.Padres, Alumnos.Email, "
              cSql += "Alumnos.Nacimiento , Alumnos.Alta, Alumnos.Notas, "
              cSql += "Alumnos.CuotaMes, Alumnos.Activo, Alumnos.Curso, Alumnos.IniL, Alumnos.FinL, "
              cSql += "Alumnos.Matematicas, Alumnos.Lengua, Alumnos.Ingles, Alumnos.Sociales, Alumnos.Naturales, Alumnos.NaturalSciences, "
              cSql += "Alumnos.SocialSciences, Alumnos.Frances,  Alumnos.BiologiaGeologia, Alumnos.LenguaLiteratura, Alumnos.GeografiaHistoria, "
              cSql += "Alumnos.Lun, Alumnos.Mar, Alumnos.Mie, Alumnos.Jue, Alumnos.Vie, Alumnos.NombrePadres "
              cSql += "FROM Alumnos "
      
              If porApe = True Then
                  cSql += "WHERE Alumnos.Apellidos LIKE'" & Trim(buscaApe) & "%' "
                  cSql += "ORDER BY Alumnos.Apellidos"
      
              End If
      
              If porNum = True Then
                  cSql += "WHERE Alumnos.idAlumno = " & CInt(buscado)
                  cSql += " ORDER BY Alumnos.idAlumno"
              End If
              cmd.CommandText = cSql
      Esto me selecciona los datos sin ningún problema.
      Lo que yo deseo es que, una vez seleccionado el registro correspondiente, pueda moverme por el recorset para ir viendo los demás registros..
      Con VB6 lo hago sin ningún problema, pero con NET no acabo de dar con el método.
      Muchísimas gracias por tu ayuda y saludos.

      Comentario


      • #4
        El código no está completo, además no veo las definiciones de los objetos cmd y conn, así que no se puede saber si sigues usando ADODB o no, si sigues usando ADODB, el método cmb.Execute te devolverá un objeto de tipo ADODB.Recordset de solo lectura, sobre el que se pueden ejecutar los métodos MoveFirst, MoveNext etc.
        Pon el código completo y la definición del los objetos con los que accedes a los datos para poder ser mas concreto.

        Una visita a las Normas del foro nunca viene mal

        Comentario


        • #5
          Gracias de nuevo Gilman por tu paciencia.
          Te adjuntoel código completo del procedimiento de búsqueda, así como del módulo FUNCIONES en dónde defino la conexión
          Código:
          'EN EL MODULO FUNCIONES DEFINO EL MODELO DE CONEXION
          ________________________________________________________________________________________________________________________________________________
          Imports System
          Imports System.Data
          Imports System.Data.SqlClient
          Imports System.Data.OleDb  'Permite el manejo de BBDD Acces
          ________________________________________________________________________________________________________________________________________________
          Module Funciones
          
           Public conn As New OleDb.OleDbConnection("Provider= Microsoft.ACE.OLEDB.12.0; Data Source = C:\Academia\Academia.accdb; Persist Security Info = False")
           Public cmd As New OleDb.OleDbCommand
           Public dr As OleDb.OleDbDataReader
           _______________________________________________________________________________________________________________________________________________
          
              Public Sub conectarse()
                  Dim conexion As New OleDbConnection
                  conexion.ConnectionString = "Provider= Microsoft.ACE.OLEDB.12.0; Data Source = C:\Academia\Academia.accdb; Persist Security Info = False"
                   Try
                      conn.Open()
                  Catch ex As Exception
                      MsgBox(ex.ToString)
                  End Try
              End Sub
          End Module
          
          '================================================================================================================================================
          
          
          'CON ESTE PROCEDIMIENTO BUSCO Y CARGO LOS DATOS DEL ALUMNO
          
              Private Sub buscar()
                  cmd.Connection = conn
                  cmd.CommandType = CommandType.Text
                  If conn.State = ConnectionState.Closed Then
                      conn.Open()
                  End If
                  cargaCursos()
                  cSql = "SELECT Alumnos.idAlumno, Alumnos.Nombre, Alumnos.Apellidos, Alumnos.Movil, Alumnos.Padres, Alumnos.Email, "
                  cSql += "Alumnos.Nacimiento , Alumnos.Alta, Alumnos.Notas, "
                  cSql += "Alumnos.CuotaMes, Alumnos.Activo, Alumnos.Curso, Alumnos.IniL, Alumnos.FinL, "
                  cSql += "Alumnos.Matematicas, Alumnos.Lengua, Alumnos.Ingles, Alumnos.Sociales, Alumnos.Naturales, Alumnos.NaturalSciences, "
                  cSql += "Alumnos.SocialSciences, Alumnos.Frances,  Alumnos.BiologiaGeologia, Alumnos.LenguaLiteratura, Alumnos.GeografiaHistoria, "
                  cSql += "Alumnos.Lun, Alumnos.Mar, Alumnos.Mie, Alumnos.Jue, Alumnos.Vie, Alumnos.NombrePadres "
                  cSql += "FROM Alumnos "
          
                  If porApe = True Then
                      cSql += "WHERE Alumnos.Apellidos LIKE'" & Trim(buscaApe) & "%' "
                      cSql += "ORDER BY Alumnos.Apellidos"
          
                  End If
          
                  If porNum = True Then
                      cSql += "WHERE Alumnos.idAlumno = " & CInt(buscado)
                      cSql += " ORDER BY Alumnos.idAlumno"
                  End If
                  cmd.CommandText = cSql
                  Me.dtpNacido.CustomForma
                  Try
                      dr = cmd.ExecuteReader
                      dr.Read()
                      If dr.HasRows = True Then
                          txtIdAlumno.Text = CStr(dr(0))
                          If dr(1).ToString <> "" Then txtNombre.Text = Trim(dr(1)).ToString & " "
                          If dr(2).ToString <> "" Then txtApellidos.Text = Trim(dr(2)).ToString & " "
                          If dr(3).ToString <> "" Then mskMovil.Text = Trim(dr(3)).ToString & " "
                          If dr(4).ToString <> "" Then mskPadres.Text = Trim(dr(4)).ToString & " "
                          If dr(5).ToString <> "" Then txtEmail.Text = Trim(dr(5)).ToString & " "
                          dtpNacido.Text = "#" & Format(dr(6), "dd/MM/yyyy") & "#" & " "
          
                          If dr(7).ToString <> "" Then
                              dtpAlta.Text = "#" & Format(dr(7), "dd/MM/yyyy") & "#" & " "
                          End If
          
                          If dr(8).ToString <> "" Then txtNotas.Text = Trim(dr(8)).ToString & " "
                          txtCuota.Text = Val(dr(9))
                          txtCuotaMensual.Text = Val(dr(9))
          
                          If dr(10) = 0 Then
                              chkActivo.Checked = False
                          Else
                              chkActivo.Checked = True
                          End If
                          If dr(11).ToString <> "" Then cboCurso.Text = Trim(dr(11)).ToString & " "
                          If dr(12).ToString <> "" Then mskIL.Text = Trim(dr(12)).ToString & " "
                          If dr(13).ToString <> "" Then mskFL.Text = Trim(dr(13)).ToString & " "
          
                          If dr(14) = 0 Then
                              chkMatematicas.Checked = False
                          Else
                              chkMatematicas.Checked = True
                          End If
                          If dr(15) = 0 Then
                              chkLengua.Checked = False
                          Else
                              chkLengua.Checked = True
                          End If
                          If dr(16) = 0 Then
                              chkIngles.Checked = False
                          Else
                              chkIngles.Checked = True
                          End If
                          If dr(17) = 0 Then
                              chkSociales.Checked = False
                          Else
                              chkSociales.Checked = True
                          End If
                          If dr(18) = 0 Then
                              chkNaturales.Checked = False
                          Else
                              chkNaturales.Checked = True
                          End If
                          If dr(19) = 0 Then
                              chkNaturalSciences.Checked = False
                          Else
                              chkNaturalSciences.Checked = True
                          End If
                          If dr(20) = 0 Then
                              chkSocialSciences.Checked = False
                          Else
                              chkSocialSciences.Checked = True
                          End If
                          If dr(21) = 0 Then
                              chkFrances.Checked = False
                          Else
                              chkFrances.Checked = True
                          End If
          
                          If dr(22) = 0 Then
                              chkBioGeo.Checked = False
                          Else
                              chkBioGeo.Checked = True
                          End If
          
                          If dr(23) = 0 Then
                              chkLenguaLit.Checked = False
                          Else
                              chkLenguaLit.Checked = True
                          End If
                          If dr(24) = 0 Then
                              chkGeoHistoria.Checked = False
                          Else
                              chkGeoHistoria.Checked = True
                          End If
          
                          If dr(25) = 0 Then
                              chkLun.Checked = False
                          Else
                              chkLun.Checked = True
                          End If
          
                          If dr(26) = 0 Then
                              chkMar.Checked = False
                          Else
                              chkMar.Checked = True
                          End If
          
                          If dr(27) = 0 Then
                              chkMie.Checked = False
                          Else
                              chkMie.Checked = True
                          End If
          
                          If dr(28) = 0 Then
                              chkJue.Checked = False
                          Else
                              chkJue.Checked = True
                          End If
          
                          If dr(29) = 0 Then
                              chkVie.Checked = False
                          Else
                              chkVie.Checked = True
                          End If
                          If dr(30).ToString <> "" Then txtNombrePadres.Text = dr(30).ToString
                          lblEdad.Text = DateDiff("yyyy", dtpNacido.Value, Date.Now) & " "
                          lblTitular.Text = (Trim(txtNombre.Text) & " " & Trim(txtApellidos.Text)) & " "
                          '  lblNivel.Text = Microsoft.VisualBasic.Left(CStr(dr(14).ToString), 25) & " "
                          txtIdAlumno.Focus()
                      Else
                          MsgBox("No se encuentran registros")
                          dr.Close()
                          'limpiar()
                          If buscado >= 0 Then txtIdAlumno.Text = buscado - 1
                          If buscado <= 0 Then txtIdAlumno.Text = buscado + 1
                          txtIdAlumno.Focus()
                      End If
                  Catch ex As Exception
                      MsgBox(ex.ToString)
                  End Try
                  dr.Close()
          
                  Dim cobrosAlumno As Double
                  cSql = "SELECT Alumnos.idAlumno, Alumnos.Nombre, Alumnos.Apellidos, CuotasMes.Ene, CuotasMes.Feb, CuotasMes.Mar, "
                  cSql += "CuotasMes.Abr, CuotasMes.May, CuotasMes.Jun, CuotasMes.Jul, CuotasMes.Ago, CuotasMes.Sep, CuotasMes.Oct, "
                  cSql += "CuotasMes.Nov, CuotasMes.Dic, CuotasMes.TotalCobrado "
                  cSql += "FROM Alumnos INNER JOIN CuotasMes ON Alumnos.idAlumno = CuotasMes.IdAlumno "
                  cSql += "WHERE Alumnos.idAlumno =" & Val(txtIdAlumno.Text)
                  cmd.CommandText = cSql
                  Try
                      dr = cmd.ExecuteReader
                      dr.Read()
                      If dr.HasRows = True Then
                          txtEne.Text = dr(3).ToString
                          txtFeb.Text = dr(4).ToString
                          txtMar.Text = dr(5).ToString
                          txtAbr.Text = dr(6).ToString
                          txtMay.Text = dr(7).ToString
                          txtJun.Text = dr(8).ToString
                          txtJul.Text = dr(9).ToString
                          txtAgo.Text = dr(10).ToString
                          txtSep.Text = dr(11).ToString
                          txtOct.Text = dr(12).ToString
                          txtNov.Text = dr(13).ToString
                          txtDic.Text = dr(14).ToString
                          For i = 3 To 14
                              If IsDBNull(dr(i)) = False Then
                                  cobrosAlumno += Val(dr(i))
                              End If
                          Next
                          txtTotalCobrado.Text = Format(cobrosAlumno, "###,###").ToString & " "
                      End If
                  Catch ex As Exception
                      MsgBox(ex.ToString)
                  End Try
                  dr.Close()
                  notas()
                  colorPagos()
              End Sub

          Comentario


          • #6
            Los DataReader son como los Recordset de tipo AdoForwardOnly que solo permiten moverse hacía delante con MoveNext en este caso con Read que devuelve True si está sobre un registro o False si no está sobre un registro (el antigo EOF a True)

            Si quieres moverte libremente por los registros devueltos por una SQL deberás usar un objeto de tipo DataTable

            Código:
                Private Sub Ejemplo()
                    Dim cSql As String
            
                    cmd.Connection = conn
                    cmd.CommandType = CommandType.Text
                    If conn.State = ConnectionState.Closed Then
                        conn.Open()
                    End If
                    cSql = "SELECT Alumnos.idAlumno, Alumnos.Nombre, Alumnos.Apellidos, Alumnos.Movil, Alumnos.Padres, Alumnos.Email, "
                    cSql += "Alumnos.Nacimiento , Alumnos.Alta, Alumnos.Notas, "
                    cSql += "Alumnos.CuotaMes, Alumnos.Activo, Alumnos.Curso, Alumnos.IniL, Alumnos.FinL, "
                    cSql += "Alumnos.Matematicas, Alumnos.Lengua, Alumnos.Ingles, Alumnos.Sociales, Alumnos.Naturales, Alumnos.NaturalSciences, "
                    cSql += "Alumnos.SocialSciences, Alumnos.Frances,  Alumnos.BiologiaGeologia, Alumnos.LenguaLiteratura, Alumnos.GeografiaHistoria, "
                    cSql += "Alumnos.Lun, Alumnos.Mar, Alumnos.Mie, Alumnos.Jue, Alumnos.Vie, Alumnos.NombrePadres "
                    cSql += "FROM Alumnos "
            
                    If porApe = True Then
                        cSql += "WHERE Alumnos.Apellidos LIKE'" & Trim(buscaApe) & "%' "
                        cSql += "ORDER BY Alumnos.Apellidos"
            
                    End If
            
                    If porNum = True Then
                        cSql += "WHERE Alumnos.idAlumno = " & CInt(buscado)
                        cSql += " ORDER BY Alumnos.idAlumno"
                    End If
                    cmd.CommandText = cSql
                    'Para llenar la tabla se usan un DataAdapter asociado al comando que devuelve los registros
            
                    Dim DA As New OleDb.OleDbDataAdapter(cmd)
                    Dim T As New DataTable
                    DA.Fill(T)
            
                    MsgBox(T.Rows.Count & " registros devueltos")
                    'Para acceder a un dato del registro n, n empieza en 0
                    'T.Rows(n)("Campo")
                    'Para recorrer la tabla:
            
                    For Each r As DataRow In T.Rows
                        msgbox(r("iDalumno") & ", " & r("Nombre") & " " & r("Apellidos")
                    Next
                End Sub
            Se pueden hacer mas cosas, como crear DataSets con Tablas relacionadas, filtrar los datos dentro de las tablas, pero el tema de ADONet es muy largo como para tratarlo en un post
            Una visita a las Normas del foro nunca viene mal

            Comentario


            • #7
              Muchísimas gracias de nuevo por tu inestimable ayuda.
              Perdona por no haberte respondido antes, pero has ahora no he podido hacerlo.
              Voy a ponerme con lo que me has aportado y te contaré cómo va.
              Saludos

              Comentario


              • #8
                Hola de nuevo Gilman (y también a los demás)
                He adaptado el código que me enviaste modificado y todo funciona muy bien.
                Pero hay una cosa que no acabo de dar con ello y es, precisamente, la razón de mi post original.
                ¿Cómo hago para moverme por los registros hacia adelante y hacia atrás?
                Perdona mi cabeza dura, pero estoy desde ayer dándole vueltas y no lo acabo de ver.
                Si tienes paciencia (y ganas) te agradecería que me explicaras como hacerlo.
                Muchas gracias y saludos muy cordiales.

                Comentario


                • #9
                  Para movernos por los distintos registros de las tablas podemos usar una variable para indicar en que fila estamos, así si la tabla ya está cargada y tiene registros (DT.Rows>0), si I=0 entonces DT.Rows(i) será lo equivalente a .MoveFirst, i+=1 equivale a MoveNext, i-=1 a MovePrevious y i=DT.Rows.Count -1 lo equivalente a MoveLast
                  Una visita a las Normas del foro nunca viene mal

                  Comentario


                  • #10
                    Hola otra vez (estoy escondido debajo de la cama por vergüenza)
                    Verás Gilman, he entendido perfectamente lo que me has explicado con respecto a la filosofía del movimiento entre registros, pero lo que no acabo de comprender es como ir a un registro determinado.
                    Esto me explicabas tú:
                    'Para acceder a un dato del registro n, n empieza en 0
                    'T.Rows(n)("Campo")

                    No acabo de comprender la sintaxis de este comando. Me explico:
                    Si le digo T.Rows(3), por ejemplo, me da error.
                    Si le digo T.Rows(3)("idAlumno") tambien me da error.

                    Tengo definida una variable en la que almaceno el número de la fila en que se encuentra llamada "fila" como Integer
                    En el botón de "REGISTRO SIGUIENTE", si pongo fila+=1 y luego T.Rows(fila) también me arroja un error.
                    ¿Qué es lo que no he entendido?

                    ¡Que rabia! Con lo fácil que me resultaba esto en VB6.0
                    Claro que la filosofía de NET es totalmente diferente y tendré que estudiar mucho más para ir avanzado.

                    Bueno, perdona mi torpeza y entendería perfectamente que me mandaras a la porra.
                    Saludos de nuevo.
                    Última edición por MiguelPG; 28-10-2018, 07:53 PM.

                    Comentario


                    • #11
                      No entiendo que error te dá.
                      Crea un proyecto de tipo consola y prueba el siguiente código
                      Código:
                          Sub Main()
                      
                              Dim dt As DataTable
                              CargarDatos(dt)
                              Dim i As Integer
                              'dt tiene 4 filas
                              Console.WriteLine("la tabla tiene " & dt.Rows.Count & " filas")
                              i = 0
                              'dt.rows(i) es el primer registro
                              Console.WriteLine("el primer registro es " & dt.Rows(i)("Id") & " " & dt.Rows(i)("Nombre"))
                              'nos movemos al siguiente registro
                              i += 1
                              Console.WriteLine("el siguiente registro es " & dt.Rows(i)("Id") & " " & dt.Rows(i)("Nombre"))
                              'nos movemos al último
                              i = dt.Rows.Count - 1
                              Console.WriteLine("el último registro es " & dt.Rows(i)("Id") & " " & dt.Rows(i)("Nombre"))
                              'nos movemos al anterior
                              i -= 1
                              Console.WriteLine("el registro anterior es " & dt.Rows(i)("Id") & " " & dt.Rows(i)("Nombre"))
                              'si nos posicionamos en un registro que no existe se produce un error
                              'hay que recordar que empezamos a contar en 0 luego d
                      
                              i = dt.Rows.Count
                              Try
                                  Console.WriteLine("el registro la posición " & dt.Rows.Count & " es " & dt.Rows(i)("Id") & " " & dt.Rows(i)("Nombre"))
                      
                              Catch ex As Exception
                                  Console.WriteLine("No existe un registro en la posición " & dt.Rows.Count)
                      
                              End Try
                              Console.ReadLine()
                      
                      
                      
                          End Sub
                      
                          Private Sub CargarDatos(ByRef dt As DataTable)
                              dt = New DataTable
                              Dim dc As DataColumn
                              dc = New DataColumn("Id")
                              dt.Columns.Add(dc)
                              dc = New DataColumn("Nombre")
                              dt.Columns.Add(dc)
                              Dim dr As DataRow
                              dr = dt.NewRow()
                              dr("Id") = 1
                              dr("Nombre") = "Alberto"
                              dt.Rows.Add(dr)
                              dr = dt.NewRow()
                              dr("Id") = 2
                              dr("Nombre") = "Pedro"
                              dt.Rows.Add(dr)
                              dr = dt.NewRow()
                              dr("Id") = 3
                              dr("Nombre") = "Luis"
                              dt.Rows.Add(dr)
                              dr = dt.NewRow()
                              dr("Id") = 4
                              dr("Nombre") = "Alfonso"
                              dt.Rows.Add(dr)
                      
                          End Sub
                      Como no puedo poner un enlace a datos, el procedimiento CargarDatos se encarga de crear una tabla con dos campos "Id" y "Nombre" y llenarla con 4 registros, sería lo equivalente a
                      Código:
                               Dim DA As New OleDb.OleDbDataAdapter(cmd)        
                               Dim T As New DataTable        
                               DA.Fill(T)
                      en el ejemplo anterior
                      Una visita a las Normas del foro nunca viene mal

                      Comentario


                      • #12
                        Otra vez muchas gracias por tu ayuda.
                        He visto el ejemplo y creo que, ahora si, he comprendido la sintaxis.
                        Lamentablemente ahora mismo no puedo probarlo porque me encuentro de viaje (y para más INRI por el norte de España).
                        ¡Que nevadas más "majas"!
                        En cuanto vuelva a casa, en unos dos o tres días espero, me pondré con ello y te contaré.
                        No te imaginas cuantas ganas tengo.
                        Saludos

                        Comentario

                        Trabajando...
                        X