Dicas do OsmarJr

Filtrando Caixas de Combinação


Como filtrar caixa de combinação baseado em outra(s) caixa(s) de combinação.

 

Assuma que você tem duas tabelas:

CODE

tblLoja
IdLoja (PK)
NomeLoja

tblGerente
IDGerente (PK)
IDLoja (FK - tblLoja)
NomeGerente


Você tem um formulário com duas caixas de combinação:

cboLoja
Origem do registro: SELECT [tblLoja].[ IDLoja], [tblLoja].[NomeLoja] FROM tblLoja;

cboGerente
Origem do registro: SELECT [tblGerente].[IDGerente], [tblGerente].[ IDLoja], [tblGerente].[NomeGerente]
                  FROM tblGerente;

Você deseja mostrar apenas os gerentes da loja selecionada em cboLoja.

Para isso será necessário modificar a Origem do registro da cboGerente no evento Após atualizar da cboLoja:

Private Sub cboLoja_AfterUpdate()
   Dim sOrigemGerente As String
   
   sOrigemGerente = "SELECT [tblGerente].[IDGerente], “ & _
                    “[tblGerente].[ IDLoja], “ & _
                    “[tblGerente].[NomeGerente] " & _
                    "FROM tblGerente " & _
                    "WHERE [IDLoja] = " & Me.cboLoja.Value
   Me.cboGerente.RowSource = sOrigemGerente
   Me.cboGerente.Requery
End Sub


Você pode ter este conceito de ter o valor de um controle afetando o valor de outro tendo em mente que o evento Após atualizar do primeiro controle é onde deve ser executada a ação que afeta o segundo controle.

Mesma técnica usando três caixas de combinação

Aqui está uma amostra da mesma técnica aplicada a três caixas de combinação (esta é uma pergunta que também aparece diversas vezes nos fóruns).

Usamos um conjunto Lojas/Gerentes/Funcionários.

O código é bem simples:

Private Sub cboGerente_AfterUpdate()
   Dim sOrigemFuncionario As String
   
   sOrigemFuncionario = "SELECT IdFuncionario, NomeFuncionario From tblFuncionario " & _
       "WHERE GerenteID = " & Me.cboGerente
       
   cboFuncionario.RowSource = sOrigemFuncionario
   cboFuncionario.Requery
End Sub

Private Sub cboLoja_AfterUpdate()
   Dim sOrigemGerente As String
   
   sOrigemGerente = "SELECT GerenteID, NomeGerente FROM tblGerente " & _
       "WHERE IDLoja = " & Me.cboLoja
       
   cboGerente.RowSource = sOrigemGerente
   cboGerente.Requery
   
   cboFuncionario.RowSource = vbNullString
   cboFuncionario.Requery
End Sub


Este é um método bastante básico e fácil de modificar para atingir seus objetivos. O único acréscimo real é que atualizamos a caixa de combinação Funcionários quando alteramos a caixa de combinação Loja, de modo a não ficarmos com um funcionário “pendurado” quando a loja é alterada.

Como teste: remova as duas últimas linhas na sub cboLoja_AfterUpdate e veja o que acontece sem esse acréscimo.


Contato | Copyright©Osmar José Correia Júnior | 17-Oct-2005 11:34