BlogBlogs.Com.Br

indicadores


fonte: ESTADÃO.

sexta-feira, 6 de março de 2009

ARTIGO: VINCULAR FOTOS NO MS ACCESS

por Luís Fernando da Silva Bittencourt

Estes dias estava em um fórum na web e notei a grande dificuldade dos usuários mais inexperientes quanto à vinculação de imagens no MS ACCESS. O recurso de vinculação de imagens serve para não sobrecarregar a base de dados com objetos OLE, pois neste aplicativo as imagens podem ser inseridas diretamente na base de dados, aceitando imagens no formato bmp. Entretanto, “o peso” gerado, dependendo da função da base de dados criada com o Access, logo esgotará a possibilidade de novos cadastros, haja vista existir uma limitação de 4Gb de registros.

Então, ao invés de se inserir uma foto no formato bmp diretamente na base de dados, fica muito mais lógico guardar apenas o caminho desta imagem, fazendo com que o nosso sistema busque a imagem respectiva e a apresente em um formulário de consulta ou relatório.

Para tanto, devemos inicialmente criar na respectiva tabela (objeto do MS Access responsável pela guarda das informações, sendo esta a base de dados propriamente dita) um campo tipo texto que vamos chamar de “caminho”. Neste exemplo, nossa tabela para guardar os dados de funcionários se chamará “tbl_empregados”, possuindo os seguintes campos: id, nome, filiação e caminho. O campo “id”, podendo ser de numeração automática, no nosso caso, será utilizado para gerar automaticamente o preenchimento do campo “caminho”, desobrigando o usuário de ter de preencher manualmente o referido campo, evitando eventuais erros de cadastro.

Depois da tabela criada, deve ser feito um formulário com uma imagem qualquer acoplada, que vamos chamar de “image”. Após os campos da “tbl_empregados” serem colocados no nosso formulário, que chamaremos de “frm_cadastro”, na ordem em que mencionamos acima, devemos ir nas propriedades do campo “nome”, procurando na lista o evento “Após atualizar” e clicar sobre as reticências (...) situadas no lado direito. Em seguida devemos escolher o item “Construtor de código” na janela que vai aparecer.

Ao abrir a janela do Microsoft Visual Basic (construtor de códigos), vamos fazer o seguinte:

Dim N ‘estamos criando a variável que representei como sendo N;

N = id ‘estamos dizendo que N vai ser igual ao valor inserido no campo id;

Me.caminho.Value = “C:\fotos\” & N & “.jpg”

Nesta última expressão, estamos determinando que o campo caminho seja preenchido automaticamente com uma string (cadeia de caracteres) previamente estipulada “C:\fotos\”, devendo existir tal diretório pois é onde o sistema irá procurar as imagens; depois a variável criada “N”, que será usada para guardar o nome da imagem, no nosso caso será um número gerado automaticamente pelo campo id, entretanto poderia ser uma matrícula de funcionário, número da carteira de identidade , CPF ou qualquer outro identificador; por último , “.jpg” será acrescido no final para indicar a extensão (ou formato) que a imagem deverá ter, pois se na nossa base de dados estiver o caminho com o final “.jpg” e a imagem colocada (ou salva) na pasta fotos criada por nós na raiz do drive C:\ estiver em outro formato, esta não será reconhecida.

Nosso sistema está bem encaminhado mas não pronto, pois agora devemos ir nas propriedades do nosso formulário que exibirá os dados do funcionário, no evento “No atual”, procedendo como antes descrito para o campo “nome”, inserindo a seguinte expressão:


Me.image.picture = Me.caminho ‘procedendo a substituição da imagem qualquer que estiver no formulário pela respectiva do registro armazenada na pasta “C:\fotos\”.


Então quando o usuário preencher o nome do funcionário, nosso sistema fará a criação automática do caminho da imagem. Depois de devidamente preenchido os dados dos funcionários, ao ser aberto o registro será de pronto apresentado a imagem que estiver guardada na referida pasta, entretanto se a imagem não se vizer presente na pasta ou com outro nome ou, ainda, em formato diferente do jpg, a mesma não será colocada na tela, ficando a última imagem exibida.

No nosso exemplo, foi usado um campo auto numerante, mas, como já foi mencionado poderia ter sido usado o CPF, RG ou qualquer identificador para o empregado. Postei a algum tempo atrás um artigo de como gerar número aleatório que possibilita a autenticação, poderia ser colocado junto para melhorar o desempenho. Para acessar este post, clique aqui.

Até a próxima e não deixem de comentar!

30 comentários:

Christyano disse...

Fiz o procedimento exatamente como explicado, mas não deu certo. Ao cadastrar um nome no formulário e exibida a mensagem: "erro em tempo de execução '2220': O Microsoft Access não pode abrir o arquivo 'C:\fotos\1.jpeg'

Bittencourt disse...

Olá Christyano, boa noite!
O procedimento descrito na minha postagem, se, como você disse realizou todo o procedimento, deve ter observado que o campo de nome "caminho" recebe um valor automaticamente, conforme postei: Me.caminho.Value = “C:\fotos\” & N & “.jpg”, onde apenas "N" recebe um valor variável (N = id), querendo dizer que "N" recebe o valor do campo "id". Então, voltando a string “C:\fotos\” & N & “.jpg”, observe que ".jpg" é a extensão que a imagem vinculada deverá ter, sendo diferente de ".jpeg", conforme seu comentário. Assim, tente salvar novamente a imagem em ".jpg", ou altera a citada linha para a extensão de imagem que você queira utilizar (jpeg, png, gif, bmp etc).
Espero ter compreendido seu problema e tenha respondido a contento. Continuo no aguardo para mais detalhes.
Um forte abraço e até a próxima.

Juliano Andr� disse...

Boa tarde Bittecourt! Muito bom esse seu tutorial de imagem no Access. Fiz e deu certo, só gostaria de saber se é possível imprimir também os forms gerados com suas respectivas fotos, pois quando mando imprimir todos os forms, ele muda somente os dados e as fotos continua do form corrente.
Aguardo ancioso por esta resposta. Um cordial Abraço!

Juliano

Juliano Andr� disse...

Boa tarde Bittencourt! Muito bom esse tutorial de imagens no access. Só gostaria de saber se é possível imprimir também as fotos conforme visualsado, pois quando mando imprimir todos os forms gerados com as respectivas fotos, só troca os dados conforme a sequencia, mas imprimi a foto vigente em todos os registros, ou seja, se tenho 10 cadastros ele altera os dados dos campos normamlmente mas não muda as fotos.

Aguardo ancioso o post deste!
Um cordial abraço!
Juliano

Bittencourt disse...

Ola Juliano, boa noite!
Desculpe mas não entendi qdo vc disse sobre imprimir todos os forms gerados? A imagem colocada no formulário ela é dinâmica, se alterando de acordo com a modificação da variável N, que recebe o valor do campo Id, q por sua vez é único para cada registro. Assim, cada vez q um formulário é aberto, se altera a imagem vinculada. Talvez esteja faltando apenas o entendimento quanto a empregabilidade. Uma solução seria, deve ser testado para confirmar, a colocação do campo caminho no formulário gerado para a exibição dos dados, fazendo q a imagem dinâmica procure a imagem correspondenter e não a geral. Apenas uma idéia. Retorne por favor.
Abraços!

Juliano Andr� disse...

Bom dia Bittencourt!

não sei se recebeu meu mail, mas em todo caso estou postando de novo...
Na verdade é o seguinte, fiz um sisteminha de impressão de crachás e estava incorporando a imagem com um objeto OLE . criei uma macro para imprimir todos os crachas gerados e como a imagem está incorporado ele imprime para cada registro a foto correspondente.

Seguindo seu totorial, vi que realmente é a maneira mais correta em se tratando de banco de dados. O caminhao está certo, pois qdo visualizo e ando nos registros, ele muda as fotos de acordo com o caminho cadastrado no banco de dados. Ex.: funcionário 1, o caminho da foto é "c:\fotos\1.jpg", até ai tudo bem; mas suponha que tenha populado com uns 10 registros (1,2,3...10.jpg), pra visualizar beleza, dá tudo certinho, mas quando mando imprimir ele imprime os 10 registros com uma mesma foto, geralmente a que estou visualizando no momento da chamada da impressão. Não sei se fui claro, mas se puder ajudar...

no mais, mais uma vez agradeço pela atenção e um cordial abraço!

Juliano

KLEBER disse...

Desculpe , mias não entendi e constaria muito de aprender como vincular fotos no access 2007, pois não consigo de outro jeito.

Pesa disse...

Olá Sr. Bittencourt,
Queria-lhe dar os parabéns por um artigo muito bem escrito.
Recentemente fui confrontado com o problema das bases de dados com imagens ole dependentes e que crescem muito rapidamente. Sendo assim, fui obrigado a fazer as coisas bem, feitas. No seu artigo, há algo que não compreendo muito bem qaando diz "....Me.image.picture = Me.caminho ‘procedendo a substituição da imagem qualquer que estiver no formulário pela respectiva do registro armazenada na pasta “C:\fotos\”...muito bem, eu procedo à substituição directa da imagem, no entanto quando tento acrescentar um registo, o access me informa que "O Microsoft Access..não consegue abrir o ficheiro \.......jpg" que está na nossa rede: portanto o caminho será algo tipo \\server2k\fotos
O que será que estou fazendo mal?

Pesa disse...

Olá outravez:

Já funciona! Era um problema de extensão de ficheiro. O meu unico problema é que após a a validação do registo, assim que salto para um novo registo, o access exibe a mensagem: Run Time Error 94. Invalid use of Null. Existe solução? Mais uma vez obrigado.

Bittencourt disse...

Oi pesa, tudo bem! Primeiramente quero me desculpar pela minha falta de interação com o blog e principalmente com vocês que prestigiam esse trabalho e são a motivação para seguir em frente, mas final de ano e de semestre sabem como é...mas tudo bem, vamos em frente.
Com relação a msg de erro é porque existe algum campo que não está se atualizando e esta ficando vazio. Assim, sugiro que revise as rotinas do sistema, principalmente se está sendo criado um Id (identificador) que é usado para vincular a foto com o registro.
Abraços e retorne os resiltados por favor.

Imperador Amarelo disse...

Olá Seu tutorial é muito bom, consegui fazer o formulário mudando as fotos, ficou bem legal, ao invés de colocar um campo id, coloquei um campo para que seja digitado o nome da foto, pena que não consegui fazer a foto atualizar automaticamente, mas isso não me preocupa agora o que eu não estou conseguindo é quando vou criar um relatório, pois quando criei um relatório para imprimir os registros, todas os registros vieram com a mesma foto, não importando o que estava escrito no caminho.
Acho que é a mesma dúvida do Juliano, é necessário fazer algum código no relatório? Se for pode me passar?
Agradeço muito obrigada.
Cileide

xpto disse...

Ola,

Parabens por este seu esclarecimento, esta optimo, e da muito jeito ;)

Isto é possivel para para Pdf?

Eu tentei fazer com abrir uma aplicação ( abrir o AcrobatReader ) Depois inseri o caminho da pasta onde estao os Pdf, mas ele diz q nao encontra :\

Será q da para fazer ?

Codigo:

Dim stAppName As String
Dim N

N = Numero_AITPDF(Nome do ficheiro que pretendo)

stAppName = "\\server\Documentos\Gerais\- Obras EDP -\TET-MT-Lig\READER\AcroRd32.exe \\server\Documentos\Gerais\- Obras EDP -\TET-MT-Lig\AIT" & N & ".pdf"

Veja se me pode dar aqui uma ajuda.

Obrigado

Bittencourt disse...

Imperador Amarelo, obrigado pelo incentivo. Para as imagens trocarem em um relatório, vc deve abrir seu relatório em modo desing e com o botão direito do mouse sobre o mesmo( sobre o relatório e não sobre a área cinza) clicar para aparecer a seção detalhe, depois procurar o item "Ao formatar", clicando sobre "..." para abrir o editor do VBA e inserir o seguinte código:
image.picture=me!caminho
lembrando que "image" é o nome do nosso campo onde a imagem será colocada e "caminho" o endereço onde está.
Abraços

Bittencourt disse...

Xpto, é possível sim abrir pdf. Insira um campo do tipo file (aquele com um botão para procurar um arquivo) e insira um botão para abrir o pdf e nas propriedades do mesmo, "ao abrir", insira o seguinte código:

Private Sub CmdAbrir_Click()
On Error GoTo fim

Set fs = Application.FileSearch
With fs
.LookIn = Me.Paste
.FileName = Me.ANEXO & ".pdf"


If .Execute > 0 Then
MsgBox .FoundFiles.Count & " arquivo encontrado com Sucesso. ", , "Ok"

For i = 1 To .FoundFiles.Count



Dim arquivo As String

Dim dir1 As String

Dim doc1 As String

dir1 = Me.Paste & "\"

doc1 = Me.ANEXO & ".pdf"

arquivo = dir1 & doc1



Application.FollowHyperlink arquivo

Next i
Else
MsgBox "Nenhum Arquivo com esse Nome.", , "Erro"


End If
End With

fim: Exit Sub
End Sub

Mas atenção, vc deve criar dois campos ocultos em seu formulário, um de nome "paste" e outro "ANEXO", sendo o primeiro para quardar o local de origem dos pdf e o segundo o nome do mesmo. No mais é tranquilo.
Abraços!

Alex disse...

He escuchado sobre un programa. El ha sido en un sitio con los softwares - reparar archivos access. El programa ha terminado mis problemas muy con facilidad y de balde. Todavia sobre este programa mis amigos han estado contento de este utilidad. Ellos han dicho que con ayuda del instrumento ha economizado el tiempo. El utilidad ha demostrado sus posibilidades en guardar los datos de salidas como un solo archivo .pst o como un grupo de archivos .eml, .vcf y .txt.

Jose Carlos disse...

Bittencourt, bom dia !
Achei seu post...e preciso exatamente disso so que tenho...uma tabela vinculada a um formulario que estão vinculados a um relatorio, o formulario abastece a tabela e preciso imprimir usado o relatorio atravez de uma consulta...até beleza tranquilo...o problema e que preciso pegar uma imagem de uma pasta, vicular a um campo da tabela e puxar para o relatorio...ai q o chico chora...pode me dar um help ?
Agradeço e fico no aguardo...

Jose Carlos disse...

Bittencourt, bom dia !
Encontrei seu post...e preciso de uma luz...tenho uma tabela vinculada a um formulario...e a um relatorio...ai que esta o problema...preciso vincular uma imagem a um codigo de produto dentro desta tabela...mas to apanhando demais...por favor...pode me ajudar ?

Bittencourt disse...

Caro José Carlos, obrigado pela participação e pelo interesse nesta minha postagem, no entanto não entendi qual o seu problema. Para código da imagem vc pode usar a propria chave primária da tabela correspondente, ou qualquer numero exclusivo, ou seja, q seja único. Por exemplo, pode criar um campo chamado "codigo", tipo numeraçao automatica (lá na tabela do access) e defini-lo como sendo chave primaria. Entao, sempre q um novo registro for inserido este campo se auto-incrementa sozinho. Entao, conforme expliquei na postagem N=codigo, ou seja, N vai receber o valor atribuido para a variavel codigo!, ou vc pode usar qualquer outra forma para atribuir esse valor!
Abraço e aguardo retorno!

Jose Carlos disse...

Olá, Bittencourt ! E agora Guru tbm..rs..
Então tenho um "sistema" que criei para minha empresa...assim é bem amador...e estou tentando desenvolver uma ferramenta para auxiliar na emissão de alguns relatorios para determinados produtos, vamos ver se consigo te explicar o que está acontecendo.
Tenho a seguinte situação
Uma tabela
Um formulario que é atrelado a essa mesma tabela para abastecimento de dados;
E um relatorio que é atrelado a tabela tbm.
Gostaria de fazer o vinculo das imagens criadas nessa tabela atraves do formulario aparecessem no relatorio quando esse fosse acionado.
Tentei aproveitar de todas as formar sua explicação para adaptação ao meu caso...sem sucesso
pq exitem momentos que não sei onde faço os comando no VB se no formulario ou no relatorio...
Bom primeiro agradeço muito seu retorno e aguardo ancioso seu retorno...forte abraço ao amigo !

Jose Carlos disse...

Meu caro, Bittencourt !
Acho que não deu tempo de vc ler meu post de ontem, mas, assim nem se preopupe em responde-lo, prestei mais atenção em alguns pontos...e finalmente consegui fazer funcionar !!! Estou muito feliz com meu feito...feito esse que sem sua generosidade de compartilhar seus conhecimentos nada tinha conseguido, agradeço muito a ajuda do amigo !!! E tenho certeza que um mundo melhor se constroi com atitudes iguais as suas...sucesso a vc amigo !!!

Bittencourt disse...

José Carlos!
Satisfação novamente amigo. Realmente, apenas agora vi suas duvidas e que bom que conseguiu atingir seu objetivo. Sei que tudo parece difícil mas qdo se compreende a idéia tudo se resolve.
Parabéns e fico feliz em poder colaborar, pelo menos, difundindo o pouco que aprendi nesses anos de luta.
Abraços.

vitor disse...

Boa Tarde, Bittencourt.
Este seu artigo esta muito bom e até eu que sou principiante nestas matérias consegui utilizar com sucesso.
Preciso apenas de uma pequena ajuda que dentro das minhas limitações vou tentar explicar:
Na minha BD por vezes insiro registos dos quais ainda não tenho foto e acontece que quando entro nesses registos aparece um erro pois na pasta das fotos não existe nenhuma com o nome daquele Id.
Pretendia saber como posso fazer para que quando entre nos registos onde ainda não há foto não apareca qualquer erro e no sitio da foto não apareça nada , ou apareça "sem foto" ou um "X", ou "no image" etc.
Espero que me tenha conseguido explicar.
Cumprimentos, Vitor.

vitor disse...

Bom Dia Bittencourt,
O seu artigo esta muito bom, até eu que sou principiante nestas materias consegui utilizar com sucesso.
Preciso apenas de uma pequena ajuda que vou tentar explicar:
Na minha BD por vezes insiro registos dos quais ainda não tenho foto e como tal assim que entro nesses registos apareçe um erro visto não existir nenhuma foto para aquele Id.
Como é que eu posso fazer para eliminar esse erro e para que quando entro em registos que não tenham foto apareça qualquer coisa do genero "sem imagem" "no picture" ou não apareça mesmo qualquer imagem.
Cumprimentos, Vitor

vitor disse...

Bom Dia Bittencourt,
O seu artigo esta muito bom, até eu que sou principiante nestas materias consegui utilizar com sucesso.
Preciso apenas de uma pequena ajuda que vou tentar explicar:
Na minha BD por vezes insiro registos dos quais ainda não tenho foto e como tal assim que entro nesses registos apareçe um erro visto não existir nenhuma foto para aquele Id.
Como é que eu posso fazer para eliminar esse erro e para que quando entro em registos que não tenham foto apareça qualquer coisa do genero "sem imagem" "no picture" ou não apareça mesmo qualquer imagem.
Cumprimentos, Vitor

Vinícius disse...

Luís Fernando, boa noite, sou principiante no Access, mas estou fazendo um banco de dados para cadastrar as orquídeas de minha coleção e estou tentando vincular uma imagem no campo onde irei colocar as fotos. Estou seguindo as suas instruções mas quando estou na parte da primeira formula no Microsoft Visual Basic ao escrever a formula
Dim N
N = id
Me.Caminho.Value = “C:\Cadastro de Orquideas\fotos orquideas” & N & “.jpeg” está ocorrendo o seguinte erro:
Erro de compilação:
era esperado: numero de linha ou rotulo ou instrução ou fim da instrução
Será que vc poderia me ajudar a corrigir ou encontrar o erro?
Obrigado!

Anderson disse...

Parabéns pelo tutorial, o amigo verificar o que há de errado em meu código? (ao invés de Id usei nome)

Private Sub Nome_AfterUpdate()

Dim N

N = Nome

Me.Caminho.Value = "C:\fotos\" & N & ".jpg"

Me.imagem.Picture = Me!Caminho

End Sub

Abraço

Anderson

blogger disse...

Olá Bittencourt! Bom minha dúvida é a mesma do primeiro comentário, a do Christyano. Fiz o procedimento e só como teste, informei uma foto fixa. O problema é que ao abrir o formulario para exibir os registros, informa o mesmo erro que o Christyano informou e vamos para a depuração parando na linha de código

Picture1.Picture = LoadPicture("Z:\Fotos\1.bmp")

Ao passar o mouse sobre "Picture1.Picture" aparece a legenda:
Picture1.Picture = "(nenhuma)"

Isto acontece com imagem bmp e jpg. Já com png, informa erro 481: Figura inválida.

Será que precisa adicionar alguma biblioteca, fazer alguma declaração a mais no código.
Não sei mais o que fazer.

blogger disse...

Consegui descobrir o que acontece no meu caso e acredito que serve para o Christyano.

Na linha de código:
Picture1.Picture = LoadPicture("Z:\Fotos\1.bmp")

Substitui por:
Picture1.Picture = "Z:\Fotos\1.bmp"

A imagem apareceu normal.

blogger disse...

Consegui descobrir o que acontece no meu caso e acredito que serve para o Christyano.

Na linha de código:
Picture1.Picture = LoadPicture("Z:\Fotos\1.bmp")

Substitui por:
Picture1.Picture = "Z:\Fotos\1.bmp"

A imagem apareceu normal.

Um abraço.

Wanderson OLiveira disse...

Amigo por gentileza teria como vc me manda por e-mail esse arquivo que vc fez por favor. Pois não tenho conhecimento então fico aletrando os codico, adaptado pra melhor me atender. desde ja obrigado.

Wanderson