MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração


Participe do fórum, é rápido e fácil

MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração

MaximoAccess

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access


2 participantes

    [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado

    Finformática
    Finformática
    VIP
    VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1077
    Registrado : 23/03/2010

    [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado Empty [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado

    Mensagem  Finformática 10/10/2023, 00:44

    Caros Amigos

    Já procurei bastante aqui no forum e não consegui encontrar. Tenho uma lembrança de já ter visto algo parecido aqui no fórum e não consegui localizar. Tenho um formulário com 8 ComboBox de uma mesma TbMalaCampos (que seu conteúdo são os campos de outra tabela TbMala). Preciso que ao preencher a primeira Combobox o seu conteúdo não apareça na combobox seguinte. Ex. Se tem 10 opções, o escolhido no primeiro combobox não mostra no segundo, que só terá 9 opções.

    Desde já, muito obrigado

    Abraços
    Finformática
    Finformática
    VIP
    VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1077
    Registrado : 23/03/2010

    [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado Empty Re: [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado

    Mensagem  Finformática 10/10/2023, 15:13

    Up!
    avatar
    abreuluiston
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 71
    Registrado : 24/07/2023

    [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado Empty Re: [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado

    Mensagem  abreuluiston 10/10/2023, 16:23

    Olá FInformatica,

    O que você está procurando é o controle de elementos dentro de uma combox de acordo com a interligação entre essas combox. Eu faria através do VBA. Uma forma de fazer seria:

    No open do form colocar o código para que a primeira combox seja preenchida. Algo como:

    Private Sub Form_Open(Cancel As Integer)
    Dim Sql As String, SS As Recordset

    Sql = "SELECT campo FROM tabela" ' aqui seu select que trará os dados desejados com a possível cláusula where inicial
    Set SS = CurrentDb.OpenRecordset(Sql, dbOpenSnapshot)
    Do Until SS.EOF
    suaCombox1.AddItem SS(0)
    SS.MoveNext
    Loop
    End Sub

    A partir dai você controla o que será preenchido no próximo Combox através do evento click da primeira combox. Algo como:

    Private Sub suaCombox1_Click()
    Dim Sql as string, SS as Recordset
    Sql = "Select campo FROM tabela Where Campo <> '" & suaCombox1.value & "'" ' considerando que se trata de string e não campo numérico
    Set SS = Currentdb.OpenRecordset(Sql, dbOpensnapshot)
    Do Until SS.EOF
    suaCombox2.AddItem SS(0)
    SS.MoveNext
    Loop
    End Sub

    Se seguir na mesma lógica basta fazer para todas as outras 6 combox sempre referenciando a cláusula WHERE e eliminando os valores presentes nas combox anteriores. Bem trabalhoso, mas funciona.

    Outra coisa importante é que você terá que ter uma sub (procedure) de limpeza das combox posteriores de tal forma que os dados presentes naquela combox que já foram populados sejam eliminados, caso contrário a combox terá resultados dobrados, ou seja, ela conterá os dados de todas as vezes que a combox anterior foi clicada.

    Uma sub (procedure) possível seria a seguinte:

    Private Sub limparCombos(wCombo As ComboBox) ' wCombo é o nome da combox que o código eliminará os dados antes de incluir os novos.
    For X = 1 To wCombo.ListCount
    wCombo.RemoveItem 0
    Next
    End Sub

    Dessa forma, para utilizar essa sub ela teria que ser colocada dentro do evento click de todas as combox e então ficaria da seguinte forma somente exemplificando pra você apenas na Sub suaCombox1_Click() que escrevi acima. Ou seja, vou repetir o código que escrevi acima adicionando a chamada para o procedimento limparCombos e você teria que fazer em cada evento click das suas combox. Veja que ela receberá por parêmetro o nome da combox que deve ter o conteúdo limpo.

    Private Sub suaCombox1_Click()
    Dim Sql as string, SS as Recordset
    Sql = "Select campo FROM tabela Where Campo <> '" & suaCombox1.value & "'" ' considerando que se trata de string e não campo numérico
    Set SS = Currentdb.OpenRecordset(Sql, dbOpensnapshot)
    limparCombox suaCombox2 ' essa é a chamada para a limpeza da combox antes de preencher os novos dados.
    Do Until SS.EOF
    suaCombox2.AddItem SS(0)
    SS.MoveNext
    Loop
    End Sub


    Espero ter ajudado!
    Luis Abreu
    Finformática
    Finformática
    VIP
    VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1077
    Registrado : 23/03/2010

    [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado Empty Re: [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado

    Mensagem  Finformática 11/10/2023, 15:20

    Grande Luiz Abreu!

    Muito grato por todo esse seu trabalho. Comecei a adaptar para minhas necessidades e deu erro no código Ao carregar:

    Set SS = CurrentDb.OpenRecordset(Sql, dbOpenSnapshot)

    Erro 3061 parâmetros insuficientes. Eram esperados 1.

    Estou anexando só uma parte do formulário e a tabela para facilitar nosso trabalho.

    Muito grato

    Abraço
    Anexos
    [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado AttachmentCombo8.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (54 Kb) Baixado 6 vez(es)
    avatar
    abreuluiston
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 71
    Registrado : 24/07/2023

    [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado Empty Re: [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado

    Mensagem  abreuluiston 11/10/2023, 16:00

    FInformatica,

    O erro ocorreu no SELECT. Quando mandei o código coloquei algumas palavras que você deveria substituir e o nome do campo da tabela também era um deles. Alterando a palavra "campo" para o nome da sua coluna "opcao" da sua tabela TbMalaDireta o código passa, mas já ocorre um segundo erro.

    O segundo erro tem a ver com uma propriedade da combox que é a rowsource. Quando preenchemos uma combox ou listbox essa proproidade deve ser marcada como lista de valores. Para fazer isso é só entrar nas propriedades, selecionar o filtro "Dados" das propriedades da combox e alterar a propriedade  "Tipo de Origem de Linha" para "Lista de valores", pois se trata de uma lista que você preencherá via código VB.

    Já me adiantando você enfrentará um próximo erro se vc quiser fazer esses ajustes para aprender diretamente no seu BD e não utilizar o que eu estou anexando.

    Você inseriu o código que enviei na sub After_Update(), acho que ok, pode ser nessa sub mesmo e não no evento click. Porém, você não alterou o nome que mandei que foi "suaCombox2" para o nome da sua comBox. Então eu alterei para "Combobox2" que é o nome da combox e o erro desaparece.

    Porém, o select presente nessa sub também está errado: o nome do campo, o nome da tabela e também na cláusula WHERE o nome do campo. Fiz os ajustes e o erro desaparece. Novamente ocorre o erro da propriedade rowsource. Então fiz a alteração para "Lista de valores" conforme o primeiro que relatei acima e a rotina funciona.

    Veja que ela funciona e para você entender o que falei da função de limpeza eu deixei como está. Teste e você verá que a cada clique na primeira combox e sem a limpeza sendo executada a segunda combox começa a ter valores duplicados, triplicados e assim por diante. Então, é necessário fazer essa rotina de limpeza.

    Por último, add o arquivo com as minhas alterações e já adianto que não mexi em mais nenhuma propriedade das demais combox para que você faça as alterações e finalize os códigos.

    At.
    Luis Abreu
    Anexos
    [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado AttachmentCombo8.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (72 Kb) Baixado 3 vez(es)
    Finformática
    Finformática
    VIP
    VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1077
    Registrado : 23/03/2010

    [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado Empty Re: [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado

    Mensagem  Finformática 11/10/2023, 16:07

    Valeu Amigo,

    Vou baixar e adaptar as minhas necessidades.

    Muito obrigado
    avatar
    abreuluiston
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 71
    Registrado : 24/07/2023

    [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado Empty Re: [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado

    Mensagem  abreuluiston 11/10/2023, 16:23

    Não por isso! Aguardo sua análise e adaptação e fico na expectativa de saber se deu tudo certo e para o encerramento definitivo dessa questão.

    At.
    Luis Abreu
    Finformática
    Finformática
    VIP
    VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1077
    Registrado : 23/03/2010

    [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado Empty Re: [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado

    Mensagem  Finformática 12/10/2023, 18:00

    Caro amigo.

    Fiz as devidas alterações para cada um dos campos e aparentemente está fazendo direitinho. Digo aparentemente pelo fato de se for preenchendo na sequência dos campos combo1, combo2....combo6 faz tudo direitinho. Se tiver tudo preenchido e eu voltar para combo2 ou combo3, aí começa a bagunçar. Aparece opções demais, misturadas, duplicadas, como se a função LimpaCombos não funciona corretamente. Acho que tem haver com o evento Após Atualizar, já que quando atualiza um campo é criado o conteúdo do próximo, então se não fizer na sequência não funciona corretamente. Segue anexo como fiz.

    Muito grato

    Abraço
    Anexos
    [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado AttachmentCombo6 campos.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (776 Kb) Baixado 6 vez(es)
    avatar
    abreuluiston
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 71
    Registrado : 24/07/2023

    [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado Empty Re: [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado

    Mensagem  abreuluiston 13/10/2023, 16:31

    Olá FInformatica,

    Na verdade não é em virtude da chamada ser através do evento after_update. Isso ocorre pq a limpeza, como escrevi da primeira vez, limpa apenas a próxima combox e não todas as subsequentes. Além disso ela não limpava o valor antigo que havia sido selecionado mesmo os elementos não existindo mais. Ou seja, você alterava o valor da primeira combo internamente o procedimento de limpeza acontecia somente na segunda combo, mas o valor selecionado anteriormente da combo 2 permanecia em tela.

    Então, um ajuste simples de apenas uma linha resolveria essa questão de não limpar o valor que havia sido selecionado. Porém, para as combos subsequentes não resolveria pq elas não foram chamadas para a limpeza.

    Para isso você poderia controlar da seguinte forma:
    No evento da combobox1 você chamaria a limpeza de todas as combos subsequentes. Algo como:
    limparCombos ComboBox2
    limparCombos ComboBox3
    limparCombos ComboBox4
    limparCombos ComboBox5
    limparCombos ComboBox6

    No evento da combobox2 a chamada seria idêntica, porem considerando somente as combos de 3 a 6 e assim até a chamada da ComboBox5 que limparia somente a comboBox6.

    Percebe a trabalheira? Sem falar que o código ficaria feio rsrs.

    Então, entrei com um outro conceito nesse mesmo post que é o de recursividade. Trata-se de um recurso poderoso que pode ser utilizado como exemplo para resolver essa questão. A recursividade nada mais é do que um procedimento chamando ele mesmo. Para isso é necessário controlar quantas vezes ele chamará ele mesmo para não ocorrer estouro de pilha.

    Vou descrever abaixo a SUB final de limpeza e anexar novamente. Assim você e quem observar esse post pode pegar o modelo final e ao mesmo tempo fazer a alteração diretamente no seu próprio BD copiando e colando o novo código.

    Só um detalhe, veja que criei mais um parâmetro na SUB. Então, em cada chamada você deverá acrescentar a variável que representa a combox a ser limpa:
    no evento da combobox1 a chamada fica: limparCombos ComboBox2, 2
    no evento da combobox2 a chamada fica: limparCombos ComboBox3, 3 e assim por diante.

    O novo código é o que segue:

    Private Sub limparCombos(wCombo As ComboBox, nCombo As Integer)  ' wCombo é o nome da combox que o código eliminará os dados antes de incluir os novos.
    Dim X As Integer, Y As Integer, wComboNova As ComboBox
    If wCombo.ListCount > 0 Then
       For X = 1 To wCombo.ListCount
           wCombo.RemoveItem 0
       Next
       wCombo.Value = "" ' essa linha limpa o valor que havia sido selecionado anteriormente e a tela fica coerente pq o valor pode não existir mas na lista
       ' recursividade - chamada da própria sub de limpeza para limpar as combos subsequentes
       For Y = nCombo + 1 To 6
           limparCombos Me("ComboBox" & Y), Y ' aqui outro recurso interessante que é uma forma de referenciar um objeto (controle) existente no form.
       Next
    End If
    End Sub

    Agora acredito que finalizamos.

    At.
    Luis Abreu
    Anexos
    [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado Attachmentcombobox_controladas.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (83 Kb) Baixado 6 vez(es)

    Mylton gosta desta mensagem

    avatar
    abreuluiston
    Intermediário
    Intermediário


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 71
    Registrado : 24/07/2023

    [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado Empty Re: [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado

    Mensagem  abreuluiston 13/10/2023, 16:39

    Em tempo, a variável wComboNova As ComboBox definida na sub de limpeza não está sendo utilizada e pode ser removida do código. Eu estava fazendo testes e utilizei ela nesses testes, mas o código final não a utiliza.

    At.
    Luis Abreu
    Finformática
    Finformática
    VIP
    VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1077
    Registrado : 23/03/2010

    [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado Empty Re: [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado

    Mensagem  Finformática 16/10/2023, 21:26

    Valeu grande Mestre!

    Vou baixar sua atualização, estudar e adaptar as minhas necessidades. Muito grato. Logo mais darei retorno.

    Abraços
    Finformática
    Finformática
    VIP
    VIP


    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1077
    Registrado : 23/03/2010

    [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado Empty Re: [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado

    Mensagem  Finformática 16/10/2023, 21:41

    Prefeito Amigo. Corretíssimo. Muito obrigado. Darei como resolvido. Mais uma vez muito grato por todo esse seu trabalho. Forte abraço.



    abreuluiston gosta desta mensagem


    Conteúdo patrocinado


    [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado Empty Re: [Resolvido]Combobox sincronizadas ocultando conteúdo já selecionado

    Mensagem  Conteúdo patrocinado


      Data/hora atual: 25/4/2024, 02:45