Jump to content
  • 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]

Recommended Posts

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á.

Share this post


Link to post
Share on other sites
arrelialp

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

Só falta o mais difícil  :wallbash:

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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á,

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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:

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.