Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

arrelialp

Visual Basic 2008 Relacionar três ComboBoxes [RESOLVIDO]

Mensagens Recomendadas

arrelialp

Olá, Viva a todos. Estou com muitas dificuldades em relacionar 3 ComboBoxes, ligadas a tabelas que estão relacionadas em SQL Server 2008. As minhas dificuldades começam logo no preenchimento da 1.ª ComboBox numérica, pois não consigo que o 1.º item da selecção seja branco ou contenha uma frase “Seleccione N.º”, por exemplo. Alguém me pode ajudar?

O problema é o seguinte,

Três Tabelas:

1.) ManutencaoFuncionarios[iD_Funcionario (int); Nome(nvarchar(255)); Apelido(nvarchar(255)); Numero_Funcionario(int)]

2.) ManutencaoViaturas[iD_Viatura(int); Matricula(nvarchar(255))]

3.) FuncionariosViaturas[iD_Funcionario_Viatura(int); ID_Funcionario(int); ID_Viatura(int)]

Três ComboBoxes:

1.) ComboBoxNumeroFuncionario, na qual devem aparecer os números de funcionários;

2.) ComboBoxNomeFuncionario, na qual devem aparecer os Nomes e os Apelidos dos funcionários;

3.) ComboBoxMatricula, na qual devem aparecer as matrículas que estão na tabela ManutencaoViaturas.

Agora a selecção nas diferentes ComboBoxes deve ser realizada da seguinte forma:

1.) Se seleccionar o Número de Funcionário na 1.ª ComboBox deve mostrar o Nome e Apelido do Funcionário na 2.ª e a Matricula ou Matriculas na 3.ª, caso o funcionário tenha viatura ou viaturas, da tabela FuncionariosViaturas relacionada, depois, com a de ManutencaoViaturas;

2.) Se seleccionar um nome (Nome + Apelido) na 2.ª ComboBox, deve mostrar o Numero de funcionário na 1.ª e as respectivas matriculas na 3.ª, caso o funcionário tenha viatura(s);

3.) Se seleccionar a matricula na 3.ª ComboBox, ComboBoxMatricula, deverá mostrar o número do funcionário correspondente na 1.ª e o nome e respectivo apelido na 2.ª.

O meu muito obrigado desde já.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
arrelialp

... já carrego os dados para as três ComboBoxes quando o form é carregado...

Só falta o mais difícil  :wallbash:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Andrepereira9

Adicionar os dados na respectivas combobox, no inicio do programa

Dim id_func As Integer
    Dim id_viatura As Integer

Private Sub Teste_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'Vai verificar o ultimo ID introduzido na tabela ManutencaoFuncionarios

        'Ligar à Base de Dados
        Dim myConnectionString As String = _
        "Data Source=.\SQLEXPRESS;AttachDbFilename='INTRODUZ AQUI O CAMINHO PARA A BASE DE DADOS';Integrated Security=True;User Instance=True"

        ' Indicação do código 
        Dim sql As String = "SELECT MAX(ID_Funcionario) FROM ManutencaoFuncionarios"

        ' Cria uma nova ligação à base de dados
        Dim connection As New SqlConnection(myConnectionString)

        ' Criação do comando indicando a instrução e a ligação
        Dim command As New SqlCommand(sql, connection)

        ' Abre a ligação
        connection.Open()

        Dim total As Integer = command.ExecuteScalar()
        id_func = total

        ' Fecha a ligação e limpa as variáveis
        connection.Close()
        connection = Nothing
        command = Nothing

        'Introdução do numero de funcionario na comboBox1 e Apelido e nome na 2

        For id_f As Integer = 1 To id_func
            'Ligar à Base de Dados
            Dim myConnectionString2 As String = _
            "Data Source=.\SQLEXPRESS;AttachDbFilename='INTRODUZ AQUI O CAMINHO PARA A BASE DE DADOS';Integrated Security=True;User Instance=True"


            Dim sql2 As String = "SELECT * FROM ManutencaoFuncionarios where ID_Funcionario = @id_f"


            Dim connection2 As New SqlConnection(myConnectionString2)


            Dim command2 As New SqlCommand(sql2, connection2)

            command2.Parameters.Add("@id_f", SqlDbType.VarChar).Value = id_f

            ' Abre a ligação
            connection2.Open()


            Dim reader As String = command2.ExecuteScalar()

            Dim reader1 As SqlDataReader = command2.ExecuteReader()

            ' Caso existam rows (linhas)
            If reader1.HasRows Then

                While reader1.Read()
                    ComboBoxNumeroFuncionario.Items.Add(reader1.Item("Numero_Funcionario"))
                    ComboBoxNomeFuncionario.Items.Add(reader1.Item("Nome") + "  " + reader1.Item("Apelido"))

                End While
            End If

            ' Fecha a ligação e limpa as variáveis
            connection2.Close()
            connection2 = Nothing
            command2 = Nothing

        Next

        'Fazer o mesmo para a ComboBoxMatricula


        'Ligar à Base de Dados
        Dim myConnectionString3 As String = _
        "Data Source=.\SQLEXPRESS;AttachDbFilename='INTRODUZ AQUI O CAMINHO PARA A BASE DE DADOS';Integrated Security=True;User Instance=True"

        ' Indicação do código 
        Dim sql3 As String = "SELECT MAX(ID_Viatura) FROM ManutencaoViaturas"

        ' Cria uma nova ligação à base de dados
        Dim connection3 As New SqlConnection(myConnectionString3)

        ' Criação do comando indicando a instrução e a ligação
        Dim command3 As New SqlCommand(sql3, connection3)

        ' Abre a ligação
        connection3.Open()

        total = command3.ExecuteScalar()
        id_viatura = total

        ' Fecha a ligação e limpa as variáveis
        connection3.Close()
        connection3 = Nothing
        command3 = Nothing


        'Introdução da matricula na combobox3

        For id_v As Integer = 1 To id_viatura
            'Ligar à Base de Dados
            Dim myConnectionString4 As String = _
            "Data Source=.\SQLEXPRESS;AttachDbFilename='INTRODUZ AQUI O CAMINHO PARA A BASE DE DADOS';Integrated Security=True;User Instance=True"


            Dim sql4 As String = "SELECT * FROM ManutencaoViaturas where ID_Viatura = @id_v"

            ' Cria uma nova ligação à base de dados
            Dim connection4 As New SqlConnection(myConnectionString4)

            ' Criação do comando indicando a instrução e a ligação
            Dim command4 As New SqlCommand(sql4, connection4)

            command4.Parameters.Add("@id_v", SqlDbType.VarChar).Value = id_v

            ' Abre a ligação
            connection4.Open()

            ' Executa o comando colocando num SqlDataReader os resultados
            Dim reader2 As String = command4.ExecuteScalar()

            Dim reader3 As SqlDataReader = command4.ExecuteReader()


            If reader3.HasRows Then

                While reader3.Read()
                    ComboBoxMatricula.Items.Add(reader3.Item("Matricula"))
                End While
            End If

            ' Fecha a ligação e limpa as variáveis
            connection4.Close()
            connection4 = Nothing
            command4 = Nothing

        Next

    End Sub

Para a primeira combobox

    Private Sub ComboBoxNumeroFuncionario_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBoxNumeroFuncionario.SelectedIndexChanged
        ComboBoxNomeFuncionario.items.clear()
        ComboBoxMatricula.Items.Clear()

        ComboBoxNomeFuncionario.text = ""
        ComboBoxMatricula.text = ""

        Dim id_funcionario As Integer

        'Selecionar o nome e apelido do funcionario e apresentar no combo box2

        'Ligar à Base de Dados
        Dim myConnectionString As String = _
        "Data Source=.\SQLEXPRESS;AttachDbFilename='INTRODUZ AQUI O CAMINHO PARA A BASE DE DADOS';Integrated Security=True;User Instance=True"


        Dim sql As String = "SELECT * FROM ManutencaoFuncionarios where Numero_Funcionario = @func"

        ' Cria uma nova ligação à base de dados
        Dim connection As New SqlConnection(myConnectionString)

        ' Criação do comando indicando a instrução e a ligação
        Dim command As New SqlCommand(sql, connection)

        command.Parameters.Add("@func", SqlDbType.VarChar).Value = ComboBoxNumeroFuncionario.Text

        ' Abre a ligação
        connection.Open()

        ' Executa o comando colocando num SqlDataReader os resultados
        Dim reader As String = command.ExecuteScalar()

        Dim reader1 As SqlDataReader = command.ExecuteReader()


        If reader1.HasRows Then


            While reader1.Read()
                id_funcionario = reader1.Item("ID_Funcionario")
                ComboBoxNomeFuncionario.Items.Add(reader1.Item("Nome") + "  " + reader1.Item("Apelido"))
            End While
        End If

        ' Fecha a ligação e limpa as variáveis
        connection.Close()
        connection = Nothing
        command = Nothing



        Dim id_viatura_f As Integer

        'Selecionar o ID da viatura associada ao funcionario

        'Ligar à Base de Dados
        Dim myConnectionString2 As String = _
        "Data Source=.\SQLEXPRESS;AttachDbFilename='INTRODUZ AQUI O CAMINHO PARA A BASE DE DADOS';Integrated Security=True;User Instance=True"


        Dim sql2 As String = "SELECT ID_Viatura FROM FuncionariosViaturas where ID_Funcionario = @id"

        ' Cria uma nova ligação à base de dados
        Dim connection2 As New SqlConnection(myConnectionString2)

        ' Criação do comando indicando a instrução e a ligação
        Dim command2 As New SqlCommand(sql2, connection2)

        command2.Parameters.Add("@id", SqlDbType.VarChar).Value = id_funcionario

        ' Abre a ligação
        connection2.Open()

        ' Executa o comando colocando num SqlDataReader os resultados
        Dim reader2 As String = command2.ExecuteScalar()

        Dim reader3 As SqlDataReader = command2.ExecuteReader()

        ' Caso existam rows (linhas)
        If reader3.HasRows Then


            While reader3.Read()
                id_viatura_f = reader3.Item("ID_Viatura")

                'Ligar à Base de Dados
                Dim myConnectionString3 As String = _
                "Data Source=.\SQLEXPRESS;AttachDbFilename='INTRODUZ AQUI O CAMINHO PARA A BASE DE DADOS';Integrated Security=True;User Instance=True"


                Dim sql3 As String = "SELECT Matricula FROM ManutencaoViaturas where ID_Viatura = @id_v"

                ' Cria uma nova ligação à base de dados
                Dim connection3 As New SqlConnection(myConnectionString3)

                ' Criação do comando indicando a instrução e a ligação
                Dim command3 As New SqlCommand(sql3, connection3)

                command3.Parameters.Add("@id_v", SqlDbType.VarChar).Value = id_viatura_f

                ' Abre a ligação
                connection3.Open()

                ' Executa o comando colocando num SqlDataReader os resultados
                Dim reader4 As String = command3.ExecuteScalar()

                Dim reader5 As SqlDataReader = command3.ExecuteReader()

                ' Caso existam rows (linhas)
                If reader5.HasRows Then

                    While reader5.Read()
                        ComboBoxMatricula.items.add(reader5.Item("Matricula"))

                    End While
                End If

                ' Fecha a ligação e limpa as variáveis
                connection3.Close()
                connection3 = Nothing
                command3 = Nothing
            End While
        End If

        ' Fecha a ligação e limpa as variáveis
        connection2.Close()
        connection2 = Nothing
        command2 = Nothing
    End Sub

Para a segunda combobox

 Private Sub ComboBoxNomeFuncionario_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBoxNomeFuncionario.SelectedIndexChanged
        ComboBoxNumeroFuncionario.Items.Clear()
        ComboBoxMatricula.Items.Clear()

        ComboBoxNumeroFuncionario.Text = ""
        ComboBoxMatricula.Text = ""

        Dim id_funcionario As Integer


        Dim vetor As Object
        Dim nome As String
        Dim apelido As String

        vetor = Split(ComboBoxNomeFuncionario.Text, " ")


        nome = vetor(0)
        apelido = vetor(1)



        'Selecionar o numero do funcionario e apresentar na combobox1

        'Ligar à Base de Dados
        Dim myConnectionString As String = _
        "Data Source=.\SQLEXPRESS;AttachDbFilename='INTRODUZ AQUI O CAMINHO PARA A BASE DE DADOS';Integrated Security=True;User Instance=True"


        Dim sql As String = "SELECT * FROM ManutencaoFuncionarios where Nome = @nom and Apelido = @apelid"

        ' Cria uma nova ligação à base de dados
        Dim connection As New SqlConnection(myConnectionString)

        ' Criação do comando indicando a instrução e a ligação
        Dim command As New SqlCommand(sql, connection)

        command.Parameters.Add("@nom", SqlDbType.VarChar).Value = nome
        command.Parameters.Add("@apelid", SqlDbType.VarChar).Value = apelido

        ' Abre a ligação
        connection.Open()

        ' Executa o comando colocando num SqlDataReader os resultados
        Dim reader As String = command.ExecuteScalar()

        Dim reader1 As SqlDataReader = command.ExecuteReader()

        ' Caso existam rows (linhas)
        If reader1.HasRows Then

            While reader1.Read()
                id_funcionario = reader1.Item("ID_Funcionario")
                ComboBoxNumeroFuncionario.Items.Add(reader1.Item("Numero_Funcionario"))
            End While
        End If

        ' Fecha a ligação e limpa as variáveis
        connection.Close()
        connection = Nothing
        command = Nothing



        Dim id_viatura_f As Integer

        'Selecionar o ID da viatura associada ao funcionario

        'Ligar à Base de Dados
        Dim myConnectionString2 As String = _
        "Data Source=.\SQLEXPRESS;AttachDbFilename='INTRODUZ AQUI O CAMINHO PARA A BASE DE DADOS';Integrated Security=True;User Instance=True"


        Dim sql2 As String = "SELECT ID_Viatura FROM FuncionariosViaturas where ID_Funcionario = @id"

        ' Cria uma nova ligação à base de dados
        Dim connection2 As New SqlConnection(myConnectionString2)

        ' Criação do comando indicando a instrução e a ligação
        Dim command2 As New SqlCommand(sql2, connection2)

        command2.Parameters.Add("@id", SqlDbType.VarChar).Value = id_funcionario

        ' Abre a ligação
        connection2.Open()

        ' Executa o comando colocando num SqlDataReader os resultados
        Dim reader2 As String = command2.ExecuteScalar()

        Dim reader3 As SqlDataReader = command2.ExecuteReader()

        ' Caso existam rows (linhas)
        If reader3.HasRows Then

            While reader3.Read()
                id_viatura_f = reader3.Item("ID_Viatura")

                'Ligar à Base de Dados
                Dim myConnectionString3 As String = _
                "Data Source=.\SQLEXPRESS;AttachDbFilename='INTRODUZ AQUI O CAMINHO PARA A BASE DE DADOS';Integrated Security=True;User Instance=True"


                Dim sql3 As String = "SELECT Matricula FROM ManutencaoViaturas where ID_Viatura = @id_v"

                ' Cria uma nova ligação à base de dados
                Dim connection3 As New SqlConnection(myConnectionString3)

                ' Criação do comando indicando a instrução e a ligação
                Dim command3 As New SqlCommand(sql3, connection3)

                command3.Parameters.Add("@id_v", SqlDbType.VarChar).Value = id_viatura_f

                ' Abre a ligação
                connection3.Open()

                ' Executa o comando colocando num SqlDataReader os resultados
                Dim reader4 As String = command3.ExecuteScalar()

                Dim reader5 As SqlDataReader = command3.ExecuteReader()

                ' Caso existam rows (linhas)
                If reader5.HasRows Then

    
                    While reader5.Read()
                        ComboBoxMatricula.Items.Add(reader5.Item("Matricula"))

                    End While
                End If

                ' Fecha a ligação e limpa as variáveis
                connection3.Close()
                connection3 = Nothing
                command3 = Nothing
            End While
        End If

        ' Fecha a ligação e limpa as variáveis
        connection2.Close()
        connection2 = Nothing
        command2 = Nothing
    End Sub

e por fim para a ultima combobox

 Private Sub ComboBoxMatricula_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBoxMatricula.SelectedIndexChanged
        ComboBoxNumeroFuncionario.Items.Clear()
        ComboBoxNomeFuncionario.Items.Clear()

        ComboBoxNumeroFuncionario.Text = ""
        ComboBoxNomeFuncionario.Text = ""



        'Selecionar o numero do funcionario e apresentar na combobox1

        'Ligar à Base de Dados
        Dim myConnectionString As String = _
        "Data Source=.\SQLEXPRESS;AttachDbFilename='INTRODUZ AQUI O CAMINHO PARA A BASE DE DADOS';Integrated Security=True;User Instance=True"


        Dim sql As String = "SELECT * FROM ManutencaoViaturas where Matricula = @matricul"

        ' Cria uma nova ligação à base de dados
        Dim connection As New SqlConnection(myConnectionString)

        ' Criação do comando indicando a instrução e a ligação
        Dim command As New SqlCommand(sql, connection)

        command.Parameters.Add("@matricul", SqlDbType.VarChar).Value = ComboBoxMatricula.Text

        ' Abre a ligação
        connection.Open()

        ' Executa o comando colocando num SqlDataReader os resultados
        Dim reader As String = command.ExecuteScalar()

        Dim reader1 As SqlDataReader = command.ExecuteReader()

        ' Caso existam rows (linhas)
        If reader1.HasRows Then


            While reader1.Read()
                id_viatura = reader1.Item("ID_Viatura")
            End While
        End If

        ' Fecha a ligação e limpa as variáveis
        connection.Close()
        connection = Nothing
        command = Nothing







        'Selecionar o ID do funcionario associado a viatura

        'Ligar à Base de Dados
        Dim myConnectionString2 As String = _
        "Data Source=.\SQLEXPRESS;AttachDbFilename='INTRODUZ AQUI O CAMINHO PARA A BASE DE DADOS';Integrated Security=True;User Instance=True"


        Dim sql2 As String = "SELECT ID_Funcionario FROM FuncionariosViaturas where ID_Viatura = @id_v"

        ' Cria uma nova ligação à base de dados
        Dim connection2 As New SqlConnection(myConnectionString2)

        ' Criação do comando indicando a instrução e a ligação
        Dim command2 As New SqlCommand(sql2, connection2)

        command2.Parameters.Add("@id_v", SqlDbType.VarChar).Value = id_viatura

        ' Abre a ligação
        connection2.Open()

        ' Executa o comando colocando num SqlDataReader os resultados
        Dim reader2 As String = command2.ExecuteScalar()

        Dim reader3 As SqlDataReader = command2.ExecuteReader()

        ' Caso existam rows (linhas)
        If reader3.HasRows Then

            While reader3.Read()
                id_func = reader3.Item("ID_Funcionario")
            End While
        End If

        ' Fecha a ligação e limpa as variáveis
        connection2.Close()
        connection2 = Nothing
        command2 = Nothing


        'Selecionar o numero de funcionario, nome e apelido


        'Ligar à Base de Dados
        Dim myConnectionString3 As String = _
        "Data Source=.\SQLEXPRESS;AttachDbFilename='INTRODUZ AQUI O CAMINHO PARA A BASE DE DADOS';Integrated Security=True;User Instance=True"


        Dim sql3 As String = "SELECT * FROM ManutencaoFuncionarios where ID_Funcionario = @id_f"

        ' Cria uma nova ligação à base de dados
        Dim connection3 As New SqlConnection(myConnectionString3)

        ' Criação do comando indicando a instrução e a ligação
        Dim command3 As New SqlCommand(sql3, connection3)

        command3.Parameters.Add("@id_f", SqlDbType.VarChar).Value = id_func


        connection3.Open()

        Dim reader4 As String = command3.ExecuteScalar()

        Dim reader5 As SqlDataReader = command3.ExecuteReader()


        If reader5.HasRows Then

                      While reader5.Read()
                ComboBoxNumeroFuncionario.Items.Add(reader5.Item("Numero_Funcionario"))
                ComboBoxNomeFuncionario.Items.Add(reader5.Item("Nome") + "  " + reader5.Item("Apelido"))
            End While
        End If

        ' Fecha a ligação e limpa as variáveis
        connection3.Close()
        connection3 = Nothing
        command3 = Nothing

Não te esqueças do

Imports System.Data.SqlClient

Nao testei o codigo, mas em principio está a fazer aquilo que pediste. Alguma duvida, já sabes :)


A informática chegou para resolver problemas que antes não existiam

Quem ri por último é porque está conectado a 52 Kbs.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
arrelialp

Olá Viva!!

A tua resposta está espectacular e agradeço-te muito o trabalho que tiveste.

Testei o código e não deu um único erro. No entanto, e como não há bela sem senão, e se tiveres um pouco de paciência queria colocar-te as seguintes questões:

- Quando selecciono o nome, não me aparece nada nas outras duas ComboBoxes, "NumeroFuncionario" e "Matricula". Será que não pode aparecer? Repara que um funcionario pode ter mais que um carro e, assim, a selecção que faço não me permite guardar o carro que entra correctamente.

- Também, quando faço a selecção de um número aparece-me correctamente o Nome e as respectivas matriculas, mas, assim que o nome é seleccionado as outras duas ComboBoxes ficam em branco.

Será que tens uma solução para isto? Ou seja, como é que se resolve este quebra-cabeças?

Muito obrigado desde já,

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Andrepereira9

- Quando selecciono o nome, não me aparece nada nas outras duas ComboBoxes, "NumeroFuncionario" e "Matricula". Será que não pode aparecer? Repara que um funcionario pode ter mais que um carro e, assim, a selecção que faço não me permite guardar o carro que entra correctamente.

Também, quando faço a selecção de um número aparece-me correctamente o Nome e as respectivas matriculas, mas, assim que o nome é seleccionado as outras duas ComboBoxes ficam em branco.

Na ComboBoxNomeFuncionario  onde está

vetor = Split(ComboBoxNomeFuncionario.Text, " ")

nome = vetor(0)

apelido = vetor(1)

altera o apelido = vetor(1) para apelido = vetor(2)


A informática chegou para resolver problemas que antes não existiam

Quem ri por último é porque está conectado a 52 Kbs.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tuntankamon

Tanto código para um trabalho tão simples...  :D

Aqui fica um exemplo que foi testado numa bd access, só tens de adaptar, para as tuas tabelas e susbtituir tudo que é oledb para sql...

Qualquer dúvida apita:

    Private bsNum As New BindingSource
    Private bsNome As New BindingSource
    Private bsMatr As New BindingSource

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\ROOT\Documents\bd.mdb")
        Dim com1 As New OleDbCommand("SELECT ID,Numero FROM [user]", con)
        Dim dt1 As New DataTable
        Dim com2 As New OleDbCommand("SELECT (Nome & ' ' & Apelido) AS NomeCompleto, ID FROM [user]", con)
        Dim dt2 As New DataTable
        Dim com3 As New OleDbCommand("SELECT V.Matricula,[uV.user] AS Utilizador FROM viatura V INNER JOIN userviatura UV ON UV.viatura=V.ID", con)
        Dim dt3 As New DataTable
        Dim ad As OleDbDataAdapter


        '1 Combo
        ad = New OleDbDataAdapter(com1)
        ad.Fill(dt1)
        bsNum.DataSource = dt1
        ComboBox1.DataSource = bsNum
        ComboBox1.DisplayMember = "Numero"
        ComboBox1.ValueMember = "ID"
        ComboBox1.SelectedIndex = -1

        '2 Combo
        ad = New OleDbDataAdapter(com2)
        ad.Fill(dt2)
        bsNome.DataSource = dt2
        ComboBox2.DataSource = bsNome
        ComboBox2.DisplayMember = "NomeCompleto"
        ComboBox2.ValueMember = "ID"
        ComboBox2.SelectedIndex = -1

        '3 Combo
        ad = New OleDbDataAdapter(com3)
        ad.Fill(dt3)
        bsMatr.DataSource = dt3
        ComboBox3.DataSource = bsMatr
        ComboBox3.DisplayMember = "Matricula"
        ComboBox3.ValueMember = "Utilizador"
        ComboBox3.SelectedIndex = -1
    End Sub

    Private Sub ComboBox1_SelectionChangeCommitted(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectionChangeCommitted, ComboBox2.SelectionChangeCommitted, ComboBox3.SelectionChangeCommitted
        Dim cb As ComboBox = CType(sender, ComboBox)
        Select Case cb.Name
            Case "ComboBox1"
                bsNum.Filter = String.Empty
                bsNome.Filter = String.Concat("ID=", cb.SelectedValue)
                bsMatr.Filter = String.Concat("Utilizador=", cb.SelectedValue)
            Case "ComboBox2"
                bsNum.Filter = String.Concat("ID=", cb.SelectedValue)
                bsNome.Filter = String.Empty
                bsMatr.Filter = String.Concat("Utilizador=", cb.SelectedValue)
            Case "ComboBox3"
                bsNum.Filter = String.Concat("ID=", cb.SelectedValue)
                bsNome.Filter = String.Concat("ID=", cb.SelectedValue)
                bsMatr.Filter = String.Empty
        End Select
    End Sub

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Andrepereira9

Tanto código para um trabalho tão simples...  :D

Tens razão, r00tfixxxer, mas eu só sei... sabia fazer assim. Mas graças ao teu código, já aprendi a fazer de maneira diferente  :)


A informática chegou para resolver problemas que antes não existiam

Quem ri por último é porque está conectado a 52 Kbs.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
arrelialp

Viva

Estive a experimentar o teu código e funciona bem, só que não responde à questão de um funcionário ter dois carros (duas matrículas).  Só me relaciona com a primeira...

Vou colocar o código em que estive a trabalhar, pode ser que consigam ver o problema:


Imports System.Data
Imports System.Data.SqlClient

Public Class Teste

    Dim con As SqlConnection
    Dim connectionString As String = ("Data Source= ... ")


    Private bsNum As New BindingSource
    Private bsNome As New BindingSource
    Private bsMatr As New BindingSource

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        con = New SqlConnection(connectionString)
        Dim com1 As New SqlCommand("SELECT ID_Funcionario,Numero_funcionario FROM ManutencaoFuncionarios", con)
        Dim dt1 As New DataTable
        Dim com2 As New SqlCommand("SELECT (Nome + ' ' + Apelido) AS NomeCompleto, ID_Funcionario FROM ManutencaoFuncionarios", con)
        Dim dt2 As New DataTable
        Dim com3 As New SqlCommand("SELECT ManutencaoViaturas.Matricula as Matricula, Funcionarios_Viaturas.ID_Funcionario_Viatura FROM ManutencaoViaturas INNER JOIN Funcionarios_Viaturas ON Funcionarios_Viaturas.ID_Viatura=ManutencaoViaturas.ID_Viatura", con)
        Dim dt3 As New DataTable
        Dim ad As SqlDataAdapter


        '1 ComboBoxNumeroFuncionario
        ad = New SqlDataAdapter(com1)
        ad.Fill(dt1)
        bsNum.DataSource = dt1
        ComboBoxNumeroFuncionario.DataSource = bsNum
        ComboBoxNumeroFuncionario.DisplayMember = "Numero_funcionario"
        ComboBoxNumeroFuncionario.ValueMember = "ID_Funcionario"
        ComboBoxNumeroFuncionario.SelectedIndex = -1

        '2 ComboBoxNomeFuncionario
        ad = New SqlDataAdapter(com2)
        ad.Fill(dt2)
        bsNome.DataSource = dt2
        ComboBoxNomeFuncionario.DataSource = bsNome
        ComboBoxNomeFuncionario.DisplayMember = "NomeCompleto"
        ComboBoxNomeFuncionario.ValueMember = "ID_Funcionario"
        ComboBoxNomeFuncionario.SelectedIndex = -1

        '3 ComboBoxMatricula
        ad = New SqlDataAdapter(com3)
        ad.Fill(dt3)
        bsMatr.DataSource = dt3
        ComboBoxMatricula.DataSource = bsMatr
        ComboBoxMatricula.DisplayMember = "Matricula"
        ComboBoxMatricula.ValueMember = "ID_Funcionario_Viatura"
        ComboBoxMatricula.SelectedIndex = -1
    End Sub

    Private Sub ComboBoxNumeroFuncionario_SelectionChangeCommitted(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBoxNumeroFuncionario.SelectionChangeCommitted, ComboBoxNomeFuncionario.SelectionChangeCommitted, ComboBoxMatricula.SelectionChangeCommitted
        Dim cb As ComboBox = CType(sender, ComboBox)
        Select Case cb.Name
            Case "ComboBoxNumeroFuncionario"
                bsNum.Filter = String.Empty
                bsNome.Filter = String.Concat("ID_Funcionario=", cb.SelectedValue)
                bsMatr.Filter = String.Concat("ID_Funcionario_Viatura=", cb.SelectedValue)
            Case "ComboBoxNomeFuncionario"
                bsNum.Filter = String.Concat("ID_Funcionario=", cb.SelectedValue)
                bsNome.Filter = String.Empty
                bsMatr.Filter = String.Concat("ID_Funcionario_Viatura=", cb.SelectedValue)
            Case "ComboBoxMatricula"
                bsNum.Filter = String.Concat("ID_Funcionario=", cb.SelectedValue)
                bsNome.Filter = String.Concat("ID_Funcionario=", cb.SelectedValue)
                bsMatr.Filter = String.Empty
        End Select
    End Sub

    
End Class

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
arrelialp

Ok - Já fiz uma alteração e funcionou. Testei no SQLServer o Query:

SELECT ManutencaoViaturas.Matricula as Matricula, Funcionarios_Viaturas.ID_Funcionario FROM ManutencaoViaturas INNER JOIN Funcionarios_Viaturas ON Funcionarios_Viaturas.ID_Viatura=ManutencaoViaturas.ID_Viatura

Ou seja, em vez de colocar "Funcionarios_Viaturas.ID_Funcionario_Viatura", coloquei Funcionarios_Viaturas.ID_Funcionario".

Mas se seleccionar um funcionário (ComboBoxNumeroFuncionario) que tenha dois carros, aparecem bem as duas matrículas (ComboBoxMatricula) que este tem. Só que depois, quando selecciono a matrícula que quero, das duas selecciono uma, o programa "balda-se" na selecção e coloca-as todas...  :wallbash:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Tuntankamon

O código não tem nenhum problema. Se o funcionário tiver dois carros, as duas matriculas aparecem na combo correspondente...  ;)

testel.png

*EDIT* - O que queres que aconteça quando seleccionas a matricula? É que se reparares no codigo quando seleccionas um valor numa combo, essa combo a partir desse momento passa a mostrar todos os valores possiveis. É um modo de poderes voltar a seleccionar o que quiseres...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
arrelialp

Olá "r00tfixxxer". Antes de mais deixa-me agradecer-te, muito, a ajuda que me tens dado.

Respondendo à tua questão, o que pretendo é que a selecção que eu fiz, permaneça na ComboBox!

Realmente tens razão. A selecção funciona e chego aos mesmos resultados a que tu chegaste com o teu código (infelizmente não consigo inserir uma imagem...). Ou seja, consigo ver duas matrículas que um funcionário tenha (infelizmente, não consigo inserir uma foto nesta mensagem...)

No entanto, logo após a selecção de uma das matrículas que pertencem, neste caso a um funcionário que tem duas matrículas, e mal se carrega na selecção, é inserida a matrícula de um outro funcionário, neste caso a primeira matricula existente na lista de matriculas da ComboBox. Este comportamento só acontece quando o funcionário tem duas ou mais viaturas. Se tiver apenas uma, já não acontece. Penso que após a selecção de uma das matrículas ela deveria permanecer na terceira ComboBox, não te parece?

Envio-te, o meu código, já alterado para este caso em concreto: VB 2008 com SQL Server:

 

Imports System.DataImports System.Data.SqlClientPublic Class Teste
Dim con As SqlConnection
Dim connectionString As String = ("Data Source=...")

Private bsNum As New BindingSource
Private bsNome As New BindingSource
Private bsMatr As New BindingSource
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
con = New SqlConnection(connectionString)
Dim com1 As New SqlCommand("SELECT ID_Funcionario,Numero_funcionario FROM ManutencaoFuncionarios", con)
Dim dt1 As New DataTable
Dim com2 As New SqlCommand("SELECT (Nome + ' ' + Apelido) AS NomeCompleto, ID_Funcionario FROM ManutencaoFuncionarios", con)
Dim dt2 As New DataTable
Dim com3 As New SqlCommand("SELECT ManutencaoViaturas.Matricula as Matricula, Funcionarios_Viaturas.ID_Funcionario FROM ManutencaoViaturas INNER JOIN Funcionarios_Viaturas ON Funcionarios_Viaturas.ID_Viatura=ManutencaoViaturas.ID_Viatura", con)
Dim dt3 As New DataTable
Dim ad As SqlDataAdapter

'1 ComboBoxNumeroFuncionarioad = New SqlDataAdapter(com1)
ad.Fill(dt1)
bsNum.DataSource = dt1
ComboBoxNumeroFuncionario.DataSource = bsNum
ComboBoxNumeroFuncionario.DisplayMember = "Numero_funcionario"ComboBoxNumeroFuncionario.ValueMember = "ID_Funcionario"ComboBoxNumeroFuncionario.SelectedIndex = -1
'2 ComboBoxNomeFuncionarioad = New SqlDataAdapter(com2)
ad.Fill(dt2)
bsNome.DataSource = dt2
ComboBoxNomeFuncionario.DataSource = bsNome
ComboBoxNomeFuncionario.DisplayMember = "NomeCompleto"ComboBoxNomeFuncionario.ValueMember = "ID_Funcionario"ComboBoxNomeFuncionario.SelectedIndex = -1
'3 ComboBoxMatriculaad = New SqlDataAdapter(com3)
ad.Fill(dt3)
bsMatr.DataSource = dt3
ComboBoxMatricula.DataSource = bsMatr
ComboBoxMatricula.DisplayMember = "Matricula"ComboBoxMatricula.ValueMember = "ID_Funcionario"ComboBoxMatricula.SelectedIndex = -1
End SubPrivate Sub ComboBoxNumeroFuncionario_SelectionChangeCommitted(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBoxNumeroFuncionario.SelectionChangeCommitted, ComboBoxNomeFuncionario.SelectionChangeCommitted, ComboBoxMatricula.SelectionChangeCommitted
Dim cb As ComboBox = CType(sender, ComboBox)
Select Case cb.Name
Case "ComboBoxNumeroFuncionario"bsNum.Filter = String.Empty
bsNome.Filter = String.Concat("ID_Funcionario=", cb.SelectedValue)
bsMatr.Filter = String.Concat("ID_Funcionario=", cb.SelectedValue)
Case "ComboBoxNomeFuncionario"bsNum.Filter = String.Concat("ID_Funcionario=", cb.SelectedValue)
bsNome.Filter = String.Empty
bsMatr.Filter = String.Concat("ID_Funcionario=", cb.SelectedValue)
Case "ComboBoxMatricula"bsNum.Filter = String.Concat("ID_Funcionario=", cb.SelectedValue)
bsNome.Filter = String.Concat("ID_Funcionario=", cb.SelectedValue)
bsMatr.Filter = String.Empty
End SelectEnd Sub
End Class

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.