domingo, 4 de março de 2012

Guardar ficheiros na base de dados

Uma base de dados guarda na maior parte dos casos dados em textos, números, valores e datas. Mas por vezes é preciso guardar ficheiros, quer seja de imagens, documentos, pdfs e etc.

Existem várias situações:

     1-     Um único ficheiro para cada registo.

a.      Criar um campo do Tipo ObjectoOLE e inserir o ficheiro nesse campo.

b.      Criar um campo do tipo texto e guardar o nome do ficheiro.

c.      Não criar campos. Apenas criar uma pasta e guardá-la de algum modo na bd e nomear os ficheiros dessa pasta com nome ou numero indicado num campo de índice único, de preferência o campo com a chave primária.


2-     Um número fixo de ficheiros para cada registo.

a.      Criar campos do Tipo ObjectoOLE e inserir os ficheiros nesses campos.

b.      Criar campos do tipo texto e guardar os nomes dos ficheiros.

c.      Não criar campos. Apenas criar pastas, uma para cada tipo de ficheiro, e guardá-la de algum modo na bd e nomear os ficheiros dessas pastas com nome ou numero indicado num campo de índice único, de preferência o campo com a chave primária.


3-     Um número variável de ficheiros para cada registo.

a.      Criar uma tabela relacionada, e nessa tabela criar um campo do tipo ObjectoOLE e inserir os ficheiros.

b.      Criar uma tabela relacionado, e nessa tabela criar um campo do tipo texto para inserir o nome dos ficheiros.

c.      Não criar a tabela. Apenas criar pastas, uma para cada registo, com nome ou numero indicado num campo de índice único, de preferência o campo com a chave primária. Dentro de cada uma dessas pastas colocar os ficheiros correspondentes.
A situação 2.c pode ser idêntica à 3.c
Os campos do tipo ObjectoOLE, se forem ficheiros grandes ou em grande número, vai aumentar o tamanho da bd, e levar a um desempenho mais fraco causando eventualmente erros que podem comprometer a integridade dos dados guardados ou até corromper a bd.

Guardar o nome dos ficheiros num campo de texto tem à primeira vista algumas desvantagens, quando queremos mudar de local a bd e os ficheiros. Neste caso temos duas hipóteses; ou criamos pastas dentro da pasta que contem a bd, ou guardamos nalgum lugar o nome e localização da pasta.

Para guardar o nome e localização da pasta ou pastas, podemos criar uma tabela para as registar ou criar propriedades na bd para lá inserir essa informação.


Dou como exemplo a base de dados Artistas.mdb criada para exemplificar a situação 1.c

A bd Artistas.mdb usa procedimentos em VBA para inserir imagens numa pasta com o nome idêntico ao campo Nome da tabela Artistas.

Esta bd possui uma tabela, um formulário, uma macro de nome AutoExec que é executada ao abrir a bd, e um modulo VBA com as funções e procedimentos usados.

As imagens ficam numa pasta cujo directório é guardado numa propriedade criada na base de dados e apresentada no rodapé do formulário, com um botão para a alterar.

Para cada registo de artista pode existir uma imagem. Quando não existe imagem, é exibido o texto ‘SEM IMAGEM’ e fica activado o botão para inserir.

Ao inserir imagem abre uma caixa de dialogo para poder escolher a imagem mo computador. Depois de escolher a imagem é feita uma cópia para a pasta das fotos, no entanto deixei o código para caso queira poder ser apenas movida e renomeada a imagem.

Nesta bd incluí procedimentos em VBA para manipular o nome e directório dos ficheiros, escolha de ficheiros e pastas, obtenção de variáveis de sistema e controlo da janela do Access. Grande parte destes procedimentos são baseados em funçõe API do Windows, as quais estão documentadas e com link para a página do MSDN Library