none
codigo de consulta a base de datos access desde vb.net RRS feed

  • Pregunta

  • Es una consulta de visual basic.net y access

       Friend Sub Cargar_Pais2()
            Dim cnn As New OleDbConnection(Ruta())  
            Dim reader As OleDbDataReader       
            Dim consulta As String = "Select Pais_Codigo, Pais_Descripcion from 002_TB_Pais where Pais_Descripcion LIKE '%" & Txt_Descripcion_Pais.Text & "%'" ' OR Pais_Codigo =" & Txt_Descripcion_Pais.Text
            Dim comando As New OleDbCommand(consulta, cnn)
            cnn.Open()  'abrimos la conexion
            reader = comando.ExecuteReader()
            If reader.Read() Then
                Me.Txt_Descripcion_Pais.Text() = reader.Item("Pais_Descripcion").ToString()
            Else
                MsgBox("Este codigo no pertenece a un pais.", MsgBoxStyle.Critical, "Informacion")
            End If
            reader.Close()
            cnn.Close()
        End Sub 
    
    Private Sub Txt_Descripcion_Pais_LostFocus(sender As Object, e As EventArgs) Handles Txt_Descripcion_Pais.LostFocus
            Call Cargar_Pais2()
        End Sub

    Tengo este código que funciona no me funciona muy bien.
    Lo que necesito es que consulte el dato que hay en el Txt_Descripcion_Pais.Text y que si el usuario coloca por ejemplo "64" busque en la tabla en el campo Pais_Codigo y traiga la descripción de ese campo a ese mismo textbox.
    Pero que si el usuario coloca la descripción y solo hay una coincidencia traiga la descripción o que habrá otro formulario llamado buscar si hay más de una coincidencia.

    Ejemplo:

    Datos de desconocer

    Plátano Maduro

    Plátano Verde

    Si el usuario colo "Plátano M" solamente, entonces debería completarse la descripción con la consulta, pero si el usuario coloca "Platano" debería abrirse otro formulario que tiene un datagridview para que el usuario elija cual escoger.

    por favor ayudarme con esta mejora, gracias de antemano

    miércoles, 3 de abril de 2019 2:15

Respuestas

  • Hola:
    Prueba algo como esto

    Option Strict On
    Option Explicit On
    Imports System.Data.OleDb
    Public Class Form1
        Private Sub btnBuscar_Click(sender As Object, e As EventArgs) Handles btnBuscar.Click
            Try
                Dim loDataTable As New DataTable
                Dim msCadenaACCESS As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Application.StartupPath & "\TU_BASE_DE_DATOS.accdb"
                Dim lsQuery As String = "SELECT Pais_Descripcion FROM 002_TB_Pais WHERE Pais_Codigo Like '%" & Me.txtBCodigo.Text & "%'"
                Using loConexion As New OleDbConnection(msCadenaACCESS)
                    Using loDataAdapter As New OleDbDataAdapter(lsQuery, loConexion)
                       loDataAdapter.Fill(loDataTable)
                    End Using
                End Using
                If loDataTable.Rows.Count = 0 Then
                    Me.Txt_Descripcion_Pais.Text() = ""
         ElseIf loDataTable.Rows.Count = 1 Then
                    Me.Txt_Descripcion_Pais.Text() = loDataTable.Rows(0).Item("Pais_Descripcion")
         Else
             'Mostrar Formulario con los datos de loDataTable
             'Doy por supuesto que controlas este paso, sino es asi, pregunta nueva
         End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
    End Class

    P.D.
    Estoy dando por supuesto que el campo Pais_Codigo es de tipo caracter, porque sino no se puede utilizar el operador Like.
    ¿Poque os cuesta tanto poner la estructura(s) de la(s) tabla(s) implicada(s)?

    Un saludo desde Bilbo
    Carlos


    miércoles, 3 de abril de 2019 21:32

Todas las respuestas

  • Hola  

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te hago la recomendación de ingresar al siguiente enlace en donde puedes encontrar una posible solución para tu problema.

    https://social.msdn.microsoft.com/Forums/es-ES/4ddbc347-8cb8-4c50-8e82-38459ddf5c2e/ayuda-filtro-buscar-en-vbnet-con-access?forum=vbes

    Gracias por usar los foros de MSDN.

    Carlos Ruiz
     ____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    miércoles, 3 de abril de 2019 15:20
  • Hola:
    Prueba algo como esto

    Option Strict On
    Option Explicit On
    Imports System.Data.OleDb
    Public Class Form1
        Private Sub btnBuscar_Click(sender As Object, e As EventArgs) Handles btnBuscar.Click
            Try
                Dim loDataTable As New DataTable
                Dim msCadenaACCESS As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Application.StartupPath & "\TU_BASE_DE_DATOS.accdb"
                Dim lsQuery As String = "SELECT Pais_Descripcion FROM 002_TB_Pais WHERE Pais_Codigo Like '%" & Me.txtBCodigo.Text & "%'"
                Using loConexion As New OleDbConnection(msCadenaACCESS)
                    Using loDataAdapter As New OleDbDataAdapter(lsQuery, loConexion)
                       loDataAdapter.Fill(loDataTable)
                    End Using
                End Using
                If loDataTable.Rows.Count = 0 Then
                    Me.Txt_Descripcion_Pais.Text() = ""
         ElseIf loDataTable.Rows.Count = 1 Then
                    Me.Txt_Descripcion_Pais.Text() = loDataTable.Rows(0).Item("Pais_Descripcion")
         Else
             'Mostrar Formulario con los datos de loDataTable
             'Doy por supuesto que controlas este paso, sino es asi, pregunta nueva
         End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
    End Class

    P.D.
    Estoy dando por supuesto que el campo Pais_Codigo es de tipo caracter, porque sino no se puede utilizar el operador Like.
    ¿Poque os cuesta tanto poner la estructura(s) de la(s) tabla(s) implicada(s)?

    Un saludo desde Bilbo
    Carlos


    miércoles, 3 de abril de 2019 21:32
  • Dim lsQuery As String = "SELECT Pais_Descripcion, Pais_Codigo FROM 002_TB_Pais2 WHERE Pais_Codigo = " & Txt_Codigo_Pais.Text & "OR Pais_Descripcion Like '%" & Me.Txt_Descripcion_Pais.Text & "%'"

    Mas o menos así es que debe ir la consulta pero no logro que funcione.

    Quiero que funcione si el usuario le pone el código o también la descripción que lo busque en la tabla por cualquier de las dos opciones.

    La estructura es de la base de datos es la siguiente

    Pais_Codigo es un numero (Pero puedo ponerlo como texto si es mejor)(Formato de Access)

    Pais_Descripcion es un texto corto (Formato de Access)

    miércoles, 3 de abril de 2019 23:28
  • Hola:
    Para el siguiente ejemplo, he creado una base de datos llmada prueba.accdb que contiene 1 tabla llamada 002_TB_Pais2 con los datos de la siguiente imagen


    Este ejemplo consta de 2 Forms como las siguientes imágenes

    Copia y pega el siguiente código

    Option Strict On
    Option Explicit On
    Imports System.Data.OleDb
    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.grbDatos.Enabled = False
        End Sub
        Private Sub btnBuscar_Click(sender As Object, e As EventArgs) Handles btnBuscar.Click
            Dim loDataTable As New DataTable
            Dim lbHayFiltro As Boolean = False
            Dim lsQuery As String = "SELECT Pais_Descripcion, Pais_Codigo FROM 002_TB_Pais2"
            If Me.txtBCodigo.Text.Length > 0 Then
                lbHayFiltro = True
                lsQuery &= " WHERE Pais_Codigo=" & Me.txtBCodigo.Text
            End If
            If Me.txtBDescripcion.Text.Length > 0 Then
                If lbHayFiltro = True Then
                    lsQuery &= " AND "
                Else
                    lsQuery &= " WHERE "
                End If
                lsQuery &= "Pais_Descripcion LIKE '%" & Me.txtBDescripcion.Text & "%'"
            End If
            Try
                Dim msCadenaACCESS As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Application.StartupPath & "\prueba.accdb"
                Using loConexion As New OleDbConnection(msCadenaACCESS)
                    Using loDataAdapter As New OleDbDataAdapter(lsQuery, loConexion)
                        loDataAdapter.Fill(loDataTable)
                    End Using
                End Using
                If loDataTable.Rows.Count = 0 Then
                    Me.txtCodigo.Text = ""
                    Me.txtDescripcion.Text = ""
                ElseIf loDataTable.Rows.Count = 1 Then
                    Me.txtCodigo.Text = CStr(loDataTable.Rows(0).Item("Pais_Codigo"))
                    Me.txtDescripcion.Text = CStr(loDataTable.Rows(0).Item("Pais_Descripcion"))
                Else
                    Using loForm As New Form2
                        loForm.Padre = Me
                        loForm.Paises = loDataTable
                        loForm.ShowDialog()
                    End Using
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message, "", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try
        End Sub
        Private Sub btnLimpiar_Click(sender As Object, e As EventArgs) Handles btnLimpiar.Click
            Me.txtBCodigo.Text = ""
            Me.txtBDescripcion.Text = ""
            Me.txtCodigo.Text = ""
            Me.txtDescripcion.Text = ""
        End Sub
    End Class

    Public Class Form2
        Public Property Paises As DataTable
        Public Property Padre As Form1
        Private Sub Form2_Load(sender As Object, e As EventArgs) Handles Me.Load
            Me.DataGridView1.AllowUserToAddRows = False
            Me.DataGridView1.DataSource = Paises
        End Sub

        Private Sub DataGridView1_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellClick
            If e.RowIndex = -1 Then
                Return
            End If
            Dim loFila As DataGridViewRow = Me.DataGridView1.CurrentRow()
            Padre.txtCodigo.Text = loFila.Cells("Pais_Codigo").Value.ToString
            Padre.txtDescripcion.Text = loFila.Cells("Pais_Descripcion").Value.ToString
            Me.Close()
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos


    jueves, 4 de abril de 2019 7:35