none
COMO OBTENER EL NUMERO DE REGISTRO O INDICE EN EL QUE SE ENCUENTRA UN PRODUCTO EN UNA TABLA

    Pregunta

  • Hola mi pregunta va formulada a cómo hago para obtener el índice del registro o sea la posición en la que está ubicado en una tabla, dentro de mi programa brindo algunas facilidades al usuario, en una tabla con sólo digitar parte del código puede encontrar un producto pero en ocasiones se necesita actualizar varios productos de la misma familia y eso lo hago de una forma más fácil localizando un registro X y luego moviéndome hacia el registro siguiente o anterior con botones, en la versión anterior de visual basic 6.0 lo hacía con un find pero ahora esta propiedad no está disponible o al menos es diferente para mysql por lo que pienso implantar un modo diferente, conociendo el índice del registro sumar uno o restar uno para moverme hacia adelante o hacia atrás.

    Les dejo parte del código que he implementado.

    Private Sub Adelante_Click(sender As Object, e As EventArgs) Handles Adelante.Click
            'BOTOM QUE UBICA EL SIGUIENTE ARTÍCULO DE LA TABLA ARTICULOS

            ConsultaSql = "Select * From Articulos order by Codigo_Articulo ASC"

            Try

                Dim Cadena_de_Conexion As String = "server=localhost; database=ciclo taller frank; user id=root; password=liberiano"

                ' Configuramos una conexión con el origen de datos.
                Using Conexion_a_la_Base As New MySqlConnection(Cadena_de_Conexion) 'Using Conexion_a_la_Base

                    'Crear DataTable
                    Dim Tabla_de_Articulos As New DataTable
                    ' crear adaptador
                    Using daDataAdapter As New MySqlDataAdapter(ConsultaSql, Conexion_a_la_Base)

                        Dim u As Integer = daDataAdapter.Fill(Tabla_de_Articulos)
                        If u > 0 Then
                            TextBox1.Text = Convert.ToString(Tabla_de_Articulos.Rows(0)("Codigo_Articulo"))
                            TextBox2.Text = Convert.ToString(Tabla_de_Articulos.Rows(0)("Nombre_Articulo"))
                            TextBox3.Text = Format(Convert.ToDouble(Tabla_de_Articulos.Rows(0)("Precio")), "##,##0.00")
                            TextBox4.Text = Convert.ToDouble(Tabla_de_Articulos.Rows(0)("Cantidad"))
                            TextBox5.Text = Convert.ToDouble(Tabla_de_Articulos.Rows(0)("Cantidad_Minima"))
                            TextBox6.Text = Convert.ToString(Tabla_de_Articulos.Rows(0)("Ubicacion"))
                            TextBox1.Focus()
                            Exit Try
                        Else
                            MsgBox("NO SE HAN CREADO ARTÍCULOS EN EL REGISTRO")
                        End If

                    End Using 'Using dataAdapter
                End Using 'Using Conexion_a_la_Base

            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub

    Gracias de antemano por su colaboración, punto y aparte no he logrado hacer una conexión a la base de datos en tiempo de diseño pero curiosamente si lo logro en tiempo de ejecución, no se sí tendrán por ahí algún ejemplo de como enlazar un elemento en tiempo de diseño, ya sea un datagridview o un bindingsource por ejemplo o sea agregar un origen de datos al proyecto, el error que me da es "NO SE PUEDE OBTENER EL GENERADOR DEL PROVEEDOR PARA EL PROVEEDOR DE DATOS LLAMADO MYSQL.DATA.MYSQLCLIENTE"

    miércoles, 30 de noviembre de 2016 22:31

Respuestas

  • Hola:
    En un Form como el de la imagen

    Copia y pega el siguiente codigo
    Option Strict On
    Option Explicit On
    Imports System.Data.SqlClient
    Public Class Form1
        'Variable para controlar el numero de registros
        Private miNumRegistros As Int32
        'Variable para controlar el registro Actual
        Private miRegActual As Int32
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            Dim msCadenaSQL As String = "Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True"
            Try
                Dim loDataTable As New DataTable
                Dim lsQuery As String = "SELECT CustomerID, City, Country FROM Customers"
                Using loConexion As New SqlConnection(msCadenaSQL)
                    Dim loDataAdapter As New SqlDataAdapter(lsQuery, loConexion)
                    loDataAdapter.Fill(loDataTable)
                End Using
                Me.DataGridView1.DataSource = loDataTable
                miNumRegistros = Me.DataGridView1.RowCount
                lP_Primero()
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Load", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
        Private Sub ToolStripBotones_ItemClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles ToolStripBotones.ItemClicked
            lP_Botones(CType(e.ClickedItem, ToolStripItem).Text)
        End Sub
        Private Sub lP_Botones(ByVal vsMenuItemText As String)
            Select Case (vsMenuItemText)
                Case "&Primero"
                    lP_Primero()
                Case "&Anterior"
                    lP_Anterior()
                Case "&Siguiente"
                    lP_Siguiente()
                Case "&Ultimo"
                    lP_Ultimo()
            End Select
        End Sub
        Private Sub lP_Primero()
            Me.ToolStripButtonPrimero.Enabled = False
            Me.ToolStripButtonAnterior.Enabled = False
            Me.ToolStripButtonSiguiente.Enabled = True
            Me.ToolStripButtonUltimo.Enabled = True
            miRegActual = 0
            Me.DataGridview1.CurrentCell = Me.DataGridview1.Item(0, miRegActual)
            lP_MostrarRegistro()
        End Sub
        Private Sub lP_Siguiente()
            Me.ToolStripButtonPrimero.Enabled = True
            Me.ToolStripButtonAnterior.Enabled = True
            miRegActual += 1
            If miRegActual = miNumRegistros - 1 Then
                Me.ToolStripButtonUltimo.Enabled = False
                Me.ToolStripButtonSiguiente.Enabled = False
            End If
            Me.DataGridview1.CurrentCell = Me.DataGridview1.Item(0, miRegActual)
            lP_MostrarRegistro()
        End Sub
        Private Sub lP_Ultimo()
            Me.ToolStripButtonPrimero.Enabled = True
            Me.ToolStripButtonAnterior.Enabled = True
            Me.ToolStripButtonSiguiente.Enabled = False
            Me.ToolStripButtonUltimo.Enabled = False
            miRegActual = miNumRegistros - 1
            Me.DataGridview1.CurrentCell = Me.DataGridview1.Item(0, miRegActual)
            lP_MostrarRegistro()
        End Sub
        Private Sub lP_Anterior()
            Me.ToolStripButtonSiguiente.Enabled = True
            Me.ToolStripButtonUltimo.Enabled = True
            miRegActual -= 1
            If miRegActual = 0 Then
                Me.ToolStripButtonPrimero.Enabled = False
                Me.ToolStripButtonAnterior.Enabled = False
            End If
            Me.DataGridview1.CurrentCell = Me.DataGridview1.Item(0, miRegActual)
            lP_MostrarRegistro()
        End Sub
        Private Sub lP_MostrarRegistro()
            Dim loFila As DataGridViewRow = Me.DataGridView1.CurrentRow()
            Me.txtCustomerID.Text = loFila.Cells("CustomerID").Value.ToString()
            Me.txtCity.Text = loFila.Cells("City").Value.ToString()
            Me.txtCountry.Text = Convert.ToString(loFila.Cells("Country").Value)
        End Sub

        Private Sub DataGridView1_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
            If e.RowIndex = -1 Then
                Return
            End If
            miRegActual = e.RowIndex
            If miRegActual = 0 Then
                Me.ToolStripButtonPrimero.Enabled = False
                Me.ToolStripButtonAnterior.Enabled = False
            End If
            If miRegActual = miNumRegistros Then
                Me.ToolStripButtonUltimo.Enabled = False
                Me.ToolStripButtonSiguiente.Enabled = False
            End If
            lP_MostrarRegistro()
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Frank Jarquin jueves, 1 de diciembre de 2016 15:50
    jueves, 1 de diciembre de 2016 9:05

Todas las respuestas

  • Buen dia, segun entiendo tu primer enunciado, lo que queres es por medio de unos botones adelatar o regresar un registro de tu colección de datos.

    En ese caso tu DataTable  (Tabla_de_Articulos) tiene una propiedad llamada rows.

    esa propiedad entre parentesís te maneja la posición de los registros.

    Ejemplo:

    Boton_Adelatar (on clic)

    IF Tabla_de_Articulos.Rows.Count - 1 <= (indice + 1) then

    TextBox1.Text = Convert.ToString(Tabla_de_Articulos.Rows(indice + 1)("Codigo_Articulo"))

    end if

    boton_regresar (on clic)

    IF (indice - 1) >= 0  then

    TextBox1.Text = Convert.ToString(Tabla_de_Articulos.Rows(indice - 1)("Codigo_Articulo"))

    end if

    en este caso tu variable indice es la que debe llevar el control de la posición de tus registros.

    tambien está la opción de que mostres los datos en un grid y que cuando hagan clic en alguna fila,

    pongas los datos en los textbox. Pero ya dependera del criterio de selección de tu query. 

    aprovechando podrias tambien cambiar la sentencia:

    Convert.ToString(Tabla_de_Articulos.Rows(indice - 1)("Codigo_Articulo")

    a esto:

    Tabla_de_Articulos.Rows(indice - 1)("Codigo_Articulo").ToString

    espero haberte ayudado. 

    saludos.


    Comparte los que sabes, pregunta lo que no

    jueves, 1 de diciembre de 2016 0:12
  • Gracias pero no me queda clara la solución  y posiblemente es que no especifiqué bien lo que estoy haciendo. Tengo un textbox en el formulario que lo paso como parametro a una consulta para que busque el artículo solicitado, en ese textbox se digita el código del artículo y en base a esa consulta cargo la información completa de ese artículo: ConsultaSql = "Select * from articulos where codigo_articulo = '" & textbox1.tex "'"

    aplicando la propiedad count sólo obtengo la cantidad de registros devueltos y no la posición del registro en la tabla, a partir de cargada la información de ese primer artículo necesito moverme hacia el siguiente registro en la tabla o hacia atrás según lo solicite el usuario y eso es lo que no logro aún.


    La pregunta sería ahora cómo obtengo ese valor de indice que me dice arriba que es el que va a llevar el control?
    jueves, 1 de diciembre de 2016 1:07
  • Hola:
    En un Form como el de la imagen

    Copia y pega el siguiente codigo
    Option Strict On
    Option Explicit On
    Imports System.Data.SqlClient
    Public Class Form1
        'Variable para controlar el numero de registros
        Private miNumRegistros As Int32
        'Variable para controlar el registro Actual
        Private miRegActual As Int32
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            Dim msCadenaSQL As String = "Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True"
            Try
                Dim loDataTable As New DataTable
                Dim lsQuery As String = "SELECT CustomerID, City, Country FROM Customers"
                Using loConexion As New SqlConnection(msCadenaSQL)
                    Dim loDataAdapter As New SqlDataAdapter(lsQuery, loConexion)
                    loDataAdapter.Fill(loDataTable)
                End Using
                Me.DataGridView1.DataSource = loDataTable
                miNumRegistros = Me.DataGridView1.RowCount
                lP_Primero()
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Load", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
        Private Sub ToolStripBotones_ItemClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles ToolStripBotones.ItemClicked
            lP_Botones(CType(e.ClickedItem, ToolStripItem).Text)
        End Sub
        Private Sub lP_Botones(ByVal vsMenuItemText As String)
            Select Case (vsMenuItemText)
                Case "&Primero"
                    lP_Primero()
                Case "&Anterior"
                    lP_Anterior()
                Case "&Siguiente"
                    lP_Siguiente()
                Case "&Ultimo"
                    lP_Ultimo()
            End Select
        End Sub
        Private Sub lP_Primero()
            Me.ToolStripButtonPrimero.Enabled = False
            Me.ToolStripButtonAnterior.Enabled = False
            Me.ToolStripButtonSiguiente.Enabled = True
            Me.ToolStripButtonUltimo.Enabled = True
            miRegActual = 0
            Me.DataGridview1.CurrentCell = Me.DataGridview1.Item(0, miRegActual)
            lP_MostrarRegistro()
        End Sub
        Private Sub lP_Siguiente()
            Me.ToolStripButtonPrimero.Enabled = True
            Me.ToolStripButtonAnterior.Enabled = True
            miRegActual += 1
            If miRegActual = miNumRegistros - 1 Then
                Me.ToolStripButtonUltimo.Enabled = False
                Me.ToolStripButtonSiguiente.Enabled = False
            End If
            Me.DataGridview1.CurrentCell = Me.DataGridview1.Item(0, miRegActual)
            lP_MostrarRegistro()
        End Sub
        Private Sub lP_Ultimo()
            Me.ToolStripButtonPrimero.Enabled = True
            Me.ToolStripButtonAnterior.Enabled = True
            Me.ToolStripButtonSiguiente.Enabled = False
            Me.ToolStripButtonUltimo.Enabled = False
            miRegActual = miNumRegistros - 1
            Me.DataGridview1.CurrentCell = Me.DataGridview1.Item(0, miRegActual)
            lP_MostrarRegistro()
        End Sub
        Private Sub lP_Anterior()
            Me.ToolStripButtonSiguiente.Enabled = True
            Me.ToolStripButtonUltimo.Enabled = True
            miRegActual -= 1
            If miRegActual = 0 Then
                Me.ToolStripButtonPrimero.Enabled = False
                Me.ToolStripButtonAnterior.Enabled = False
            End If
            Me.DataGridview1.CurrentCell = Me.DataGridview1.Item(0, miRegActual)
            lP_MostrarRegistro()
        End Sub
        Private Sub lP_MostrarRegistro()
            Dim loFila As DataGridViewRow = Me.DataGridView1.CurrentRow()
            Me.txtCustomerID.Text = loFila.Cells("CustomerID").Value.ToString()
            Me.txtCity.Text = loFila.Cells("City").Value.ToString()
            Me.txtCountry.Text = Convert.ToString(loFila.Cells("Country").Value)
        End Sub

        Private Sub DataGridView1_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
            If e.RowIndex = -1 Then
                Return
            End If
            miRegActual = e.RowIndex
            If miRegActual = 0 Then
                Me.ToolStripButtonPrimero.Enabled = False
                Me.ToolStripButtonAnterior.Enabled = False
            End If
            If miRegActual = miNumRegistros Then
                Me.ToolStripButtonUltimo.Enabled = False
                Me.ToolStripButtonSiguiente.Enabled = False
            End If
            lP_MostrarRegistro()
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos
    • Marcado como respuesta Frank Jarquin jueves, 1 de diciembre de 2016 15:50
    jueves, 1 de diciembre de 2016 9:05
  • Muchas gracias carlos por su valiosisima ayuda
    jueves, 1 de diciembre de 2016 15:50