sexta-feira, 20 de julho de 2012

Formulário com Filtragem


Por vezes é necessário introduzir dados num formulário, onde existem campos cuja origem de dados é uma lista grande, sendo necessário efectuar filtragem nos dados de origem de acordo com outro campo já inserido.

Vamos a um exemplo:
 
Utilizando a BD das freguesias vamos supor que queremos registar uma lista de escolas, sendo uma das informações o Concelho e a Freguesia.

    1- Na BD Freguesias criar uma tabela Escolas com os campos ID (Numeração Automática), Nome (Texto), Concelho (Texto),Freguesia (Texto).
        Embora cada freguesia tenho um concelho associado, neste exemplo, vou incluir na tabela Escolas o campo Concelho. Este campo vai ocupar espaço redundante, mas ajuda a clarificar.

   2 - Criar as ligações conforme o exemplo das Freguesias. Uma ligação entre Concelho e codConcelho da tabela Concelhos e outra entre Freguesia e codFreguesia da tabela Freguesias.

   3- Criar um formulário usando o assistente, para a tabela Escolas e em vista Tabela (formulário contínuo). Para alterar o formulário tem mudar para vista de estrutura.

   4- Se foi colocada a origem de dados correctamente nos campos Freguesia e Concelho, no formulários irá parecer estes campos ligados a comboboxes. Caso contrário mudar para combobox, usando o botão direito do rato.
      Na combo do Concelho a origem de dados deve ser  SELECT codconcelho,concelho FROM Concelhos ORDER BY concelho, com coluna pendente 1,  número de colunas 2 e largura das colunas 0.
      Para a combo da Freguesia seguir o mesmo método com a origem de dados SELECT codfreguesia,freguesia FROM Freguesias WHERE codconcelho=concelho ORDER BY freguesia.
      Mude para a vista formulário para visualizar e pode inserir e editar registos.

Embora assim funcione, não tem o efeito desejado, porque precisa actualizar o registo para que a lista de freguesias seja actualizada.

Usando uma linha de código em VBA é possível fazer a lista de freguesias actualizar sem ter de actualizar o registo. 
Com a combo Concelho seleccionada vá às propriedades no separador Evento e no evento ao fazer clique, escolha [Procedimento de Evento] e clique nos (...). Irá parecer o editor VBA com o cursor no procedimento  Concelho_Click.  Insira a seguinte linha de código:

Freguesia.RowSource = "SELECT codfreguesia,freguesia FROM Freguesias WHERE codconcelho='" & Nz(Concelho, "") & "' ORDER BY freguesia"

O procedimento todo, depois de fazder uma quebra na linha para melhor visualizar, fica assim:

Private Sub Concelho_Click()
    Freguesia.RowSource = "SELECT codfreguesia,freguesia FROM Freguesias " _
        & "WHERE codconcelho='" & Nz(Concelho, "") & "' ORDER BY freguesia"
End Sub


Mude para vista formulário e teste.

Este modelo está disponível em Escolas-01, onde já foi incluído o distrito que faz a filtragem no concelho.

Qualquer dúvida, deixe um comentário.