quinta-feira, 23 de fevereiro de 2012

Modelo de Entidades e Relacionamentos - MER

O Access é um sistema de gestão de dados relacional, e possui um modelo de entidades e relacionamentos, entre as diversas tabelas (MER), com apresentação em diagrama (DER).

As tabelas contêm o armazenamento de dados de uma base de dados. É nelas que é guardada toda a informação que depois pode ser consultada.

A informação contida em cada tabela é organizada em linhas e colunas, mais conhecidas por registos e campos.

O número de registos em cada tabela é ilimitado até a bd atingir a máximo de 2Gb.

Os 2Gb dariam perfeitamente para guardar o nome, BI, NIF e endereço de todos os portugueses. Mesmo assim o limite é facilmente ultrapassável, porque é sempre possível ligar tabelas de outros ficheiros.

Cada campo de uma tabela pode conter um determinado tipo de dados, sendo os mais usados numérico, data e hora e texto.

Pode ver aqui a lista completa de tipos de dados do Acess 2007:


Para exemplificar o uso de diversas tabelas ligadas entre si de acordo com o MER vou indicar como criar uma pequena base de dados com baseada na lista de freguesias disponível no portal das finanças.

Criar uma base de dados vazia;
      Abrir o Access e criar uma base de dados vazia.

      Criar as tabelas para freguesias, concelhos e distritos;

Tabela Distritos com os campos
                  coddistrito texto tamanho 2,
                  distrito texto tamanho 200,
                  chave primária em coddistrito.

      Tabela Concelhos
                        codconcelho texto tamanho 4,
                        coddistrito texto tamanho 2,
                        concelho texto tamanho 200,
                        chave primária em codconcelho;

Tabela Freguesias
                 codfreguesia texto tamanho 6,
                 codconcelho texto tamanho 4,
                 freguesia texto tamanho 200,
                 chave primária em codfreguesia.

Criar as relações entre as tabelas;

Ir a Ferramentas da Base de Dados e clicar em Relações;

Se aparecer alguma relação entre tabelas com nomes estranhos, clica com o botão direito em cima da tabela e escolha ocultar tabela;

Na barra de ferramentas clicar em mostrar tabelas e mostrar as 3 tabelas criadas antes;

Arrastar o campo coddistrito da tabela Distritos para o campo coddistrito da tabela Concelhos e na janela que vai aparecer confirmar os nomes dos campos e tabelas, e marcar a opção impor integridade referencial, assim como propagar a actualização. Fazer o mesmo para o campo codconcelho das tabelas Concelhos e Freguesias.

As linhas entre os campos das tabelas possuem do lado da chave primária o número 1 e do outro lado o símbolo infinito. Esse é o tipo de ligação um-para-muitos.

As relações devem ficar tal qual a imagem:

      Descarregar o ficheiro de Excel com as freguesias aqui.



 Ligar a folha do Excel ao Access;

 Abrir o ficheiro e eliminar as duas linhas iniciais deixando os nomes dos campos como cabeçalho, guardar e fechar.

Utilizar a ferramenta de importar folha de calculo do excel, em dados externos, escolhendo o ficheiro e a opção de ligação à origem. Indicar que os cabeçalhos serão os nomes dos campos, sem chave primária e no final o nome xlsFreguesias.

Desta forma os dados continuam no excel, mas podem ser consultados no Access. As tabelas ligadas a folhas do excel não permitem alterar os dados, mas ligadas a tabelas de outras bases de dados já permite.



Criar consultas para os nomes e códigos das freguesias, concelhos e dos distritos;

Barra de ferramentas Criar, Consulta, modo SQL

consultaDistritos:
SELECT coddistrito, min(distrito) FROM xlsFreguesias GROUP BY coddistrito;

consultaConcelhos:
SELECT coddistrito & codconcelho AS codigo,  coddistrito, Min(concelho) AS NomeConcelho FROM xlsFreguesias GROUP BY coddistrito, codconcelho;

consultaFreg:
SELECT coddistrito & codconcelho & codfreguesia AS codigo, coddistrito & codconcelho as codconc, Min(freguesia) AS Nomefreguesia FROM xlsFreguesias GROUP BY coddistrito,codconcelho,codfreguesia;



Copiar os dados das consultas para as tabelas.

Começar pela tabela dos distritos. Copiar todas as linhas da consultaDistritos para a tabela Distritos;

Depois os dados da consultaConcelhos para a tabela concelhos;

Por fim da consultaFreg para a tabela Freguesias.


Apagar as consultas e a tabela xlsFreguesias, visto já não serem necessárias.



Se quiserem criar uma consulta para aparecer a informação tal qual na folha de Excel, é só criar uma consulta com a seguinte expressão SQL:

SELECT F.codfreguesia AS Código, D.coddistrito AS CodDist, distrito AS NomeDistrito, RIGHT(F.codconcelho,2) AS CodConc, concelho AS NomeConcelho, RIGHT([codfreguesia],2) AS CodFreg, freguesia AS NomeFreguesia
FROM Concelhos AS C, Distritos AS D, freguesias AS F
WHERE C.coddistrito=D.coddistrito AND F.codconcelho=C.codconcelho;



Ao abrir a tabela Concelhos o campo coddistrito mostra o código de 4 caracteres referente ao registo de distrito, mas é preferível ver o nome do distrito. Para vamos à estrutura da tabela e selecionamos o campo coddistrito, nas propriedades em baixo mudamos para o separador pesquisa e mudamos as propriedades de acordo com a imagem:



O mesmo pode ser feito na tabela freguesias campo codconcelho.



O ficheiro Freguesias.accdb pode ser encontrado aqui:
                 http://www.box.com/s/mfq10csb2t0njs6ybvn0



Da mesma forma criei um ficheiro Codigo Postal.accdb, a partir de ficheiros de texto disponibilizados no site dos CTT




2 comentários:

  1. Viva, como vai?
    Estive a ver o seu artigo e achei-o interessante. De qualquer forma queria saber como fazer num formulário a entrada do distrito e do concelho, sabendo que deverão surgir numa caixa de combinação apenas os concelhos do ditrito seleccionado.
    Fico a aguardar uma resposta sua, que poderá enviá-la para o meu e-mail: fermicosta@hotmail.com

    Obrigado pela atenção,
    Fernando Miguel

    ResponderEliminar
  2. Já inseri uma nova mensagem com eese tipo de funcionalidade.

    Dá uma olhadela a:
    http://b-coder.blogspot.pt/2012/07/formulario-com-filtragem-por-vezes-e.html

    ResponderEliminar