Récuperer image stockée dans access 2000 et l'afficher dans un formulaire
kapusta117
Messages postés9Date d'inscriptionjeudi 31 janvier 2008StatutMembreDernière intervention26 novembre 2008
-
25 nov. 2008 à 09:25
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 2010
-
26 nov. 2008 à 20:59
Bonjour ,
Après plusieurs recherche sur google , j'ai décider de vous exposer mon problème.
J'ai une base access 2000 , je veux stocker une image .bmp dans un champ OLE de l'une de mes table pour que je puisse l'afficher comme LOGO dans une de mes formualire...Par contre je ne sais comment procéder..
1) Première question : comment déja stocker l'image et sous quelle forme (j'ai vu sur certains forum qu'il faut la stocker sous forme binaire mais je ne sais pas comment spécifier cela dans ma table,).
2) seconde question : (c'est la plus pertinante) Comment récuperer l'image pour l'afficher sur mon formulaire via un script vba , sur un site j'ai trouvé un script qu utilise les recordset par contre il marche pas car mon application ne reconnait pas l'instruction ADODB.stream ( probalement sours access 2000 stream n'est pas reconnue comme propriété de l'objet adodb.
Je veux pas non plus attaché un lien qui pointe sur un image stockée sur mibn disque car je veux que mon application soit exportable (.que je puisse l'envoyer à d'autre personne par Mail)..
Merci de bien vouloir me passer une coup de main...car j'en ai trouvé plein de gens qui posent la meme question sans réponse.
cs_Exploreur
Messages postés4822Date d'inscriptionlundi 11 novembre 2002StatutMembreDernière intervention15 novembre 201615 25 nov. 2008 à 11:32
Salut,
Réponse 1 :
Si tu as un accés facile à tes images(soit HDD ou un répertoire de ton application), le mieux est peut-être de stocker seulement leurs chemins complets, cela sera plus facile pour gérer l'ensemble et évitera que tu ais une basse de données volumineuse ^^
Réponse 2 :
Avec une requête SQL, une connection active à la Bdd et un RecordSet, tu peux récupérer le chemin de ton image dans le champ de ta base et l'afficher soit dans un contrôle PictureBox ou Image...
kapusta117
Messages postés9Date d'inscriptionjeudi 31 janvier 2008StatutMembreDernière intervention26 novembre 2008 25 nov. 2008 à 12:05
Bonjour Exploreur,
Merci d'avoir pris le temps de me répondre ..
Il me semble que la deuxième réponse me convient dans la mésure ou je pourrais récuperer une image que j'aurais stocker auparavant dans ma base et l'afficher comme tu as dis dans une control PictureBox..
Je vais essayé cette solution et te tenir au courant..
kapusta117
Messages postés9Date d'inscriptionjeudi 31 janvier 2008StatutMembreDernière intervention26 novembre 2008 25 nov. 2008 à 13:33
Bonjour
Voila , j'ai utiliser le code ci dessous pour se connecter à ma base de donnée Access. Dans mon test, l'évenement sur Clique du control devrait afficher l'image sur le bouton Mais au lieu de ça j'ai un message d'erreur : le paramétre de cette propriété est trop long .. je voulais tester cela avant de mettre l'image dans un control picturebox.Il me semble que j'ai bien récuperer l'image dans rs.Fields("Image").
Private Sub Commande0_Click()
Dim db As DAO.Database
Dim image As Control
Dim rec As DAO.Recordset
Dim rs As DAO.Recordset
Dim nbr As Integer
Dim sSQL As String
Set db = Application.CurrentDbsSQL " select * from MesImages where [MesImages ].[N]1 ;"
Set rs = db.OpenRecordset(sSQL)
With rs
nbr = rs.RecordCount
resultat = rs.Fields("Image")
'Me.Texte31.Value = nbr
End With
PCPT
Messages postés13280Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201848 25 nov. 2008 à 16:15
salut,
ton "STREAM" évoqué dans ta question est la bonne solution
or tu ne peux (peut-être) pas le mettre en place à cause de DAO.
possible ou pas, il te faut passer en ADO, là tu auras accès au stream
base champ binaire (OLE, BLOB)
et plus qu'à charger en suivant cet exemple :
kapusta117
Messages postés9Date d'inscriptionjeudi 31 janvier 2008StatutMembreDernière intervention26 novembre 2008 25 nov. 2008 à 17:19
ReBonjour
Voila je viens de tester le Code malheureusment j'ai une erreur qui se produit :
type défini par l'utilisateur indéfini.En fait comme j'ai ' Active data object 2.1 library ' dans mes réferences Alors que je suis sensé avoir une version superieure à 2.5 pour que ça marche...A moins que je puisse télecharger une version postérieure sur ma base Access 2000??????!!!
Merci
A +++
kapusta117
Messages postés9Date d'inscriptionjeudi 31 janvier 2008StatutMembreDernière intervention26 novembre 2008 25 nov. 2008 à 19:12
Bonsoir
Voila je viens de tester le code suivant ,mais j'ai une erreur au niveau de
la ligne :
stm.SaveToFile sTemporyFileName, adSaveCreateOverWrite And
adSaveCreateNotExist
l'erreur affichée est : utilisation incorrecte de la propriété : (picture) au niveau de Commande0.picture=LoadPicture(sTemporyFileName)
en fait mon Commande0 correspond à mon bouton sur lequel lorsque je clique dessus je devrais charger l'image sur ce meme control..picture est bien la propriété du bouton .. je ne sais pas pourquoi il le prrend pas en compte..
sinon le PictureBox correspond t'il au control image sous access???
Option Compare Database
Private Declare Function GetTempFileName Lib "kernel32" Alias "GetTempFileNameA" (ByVal lpszPath As String, ByVal lpPrefixString As String, ByVal wUnique As Long, ByVal lpTempFileName As String) As Long
Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Private Const MAX_PATH = 260
Private Sub Commande0_Click()
'Dim db As DAO.Database
'Dim image As Control
'Dim rec As DAO.Recordset
'Dim rs As DAO.Recordset
'Dim nbr As Integer
'Dim sSQL As String
'Set db = Application.CurrentDb'sSQL " select * from MesImages where [MesImages ].[N]1 ;"
'Set rs = db.OpenRecordset(sSQL)
'With rs
'nbr = rs.RecordCount
' resultat = rs.Fields("Image")
'Me.Texte31.Value = nbr
'End With
'Commande0.Picture = resultat
'MsgBox dd
Dim rs As ADODB.Recordset
Dim stm As ADODB.Stream
Dim sTemporyFileName As String
Set rs = New ADODB.Recordset
Set stm = New ADODB.Stream
rs.Open "SELECT Image FROM MesImages WHERE N = 1", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Factures.mdb", adOpenStatic, adLockOptimistic, adCmdText
stm.Type = adTypeBinary
stm.Open
stm.Write rs.Fields("Image").Value
sTemporyFileName = GenerateTemporyFileName("PGM")
stm.SaveToFile sTemporyFileName, adSaveCreateOverWrite And adSaveCreateNotExist
Set Commande0.Picture = LoadPicture(sTemporyFileName)
Kill sTemporyFileName
rs.Close
stm.Close
Set rs = Nothing
Set stm = Nothing
End Sub
' Cette fonction permet de récupérer le chemin du dossier temporaire de Windows
' et d'ensuite générer un nom de fichier valide (càd qui n'existe pas encore)
' Le paramètre Prefix est une chaîne dont les trois premières lettres seront
' reprises comme initiales du fichier temporaire.
Public Function GenerateTemporyFileName(Optional Prefix As String = "TMP") As String
Dim sBuffer As String
Dim sTempFolderPath As String
If GetTempPath(MAX_PATH, sTempFolderPath) Then
If GetTempFileName(sTempFolderPath, Prefix, 0&, sBuffer) Then
GenerateTemporyFileName = Left$(sBuffer, InStr(1, sBuffer, Chr$(0)) - 1)
End If
End If
PCPT
Messages postés13280Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201848 25 nov. 2008 à 22:12
Option Compare Database
tiens je connais pas cette ligne....
mais c'est bien sûr!!!
voilà, du beau VBA dans sa splendeur
Vous êtes ici : Thèmes/ [forum-VISUAL-BASIC_1.aspx Visual Basic 6] /[theme-BASE-DONNEES_234.aspx Base de données] /
çà donne vraiment envie de poursuivre...
il y a sans doute plus approprié intégré à VBA-ACCESS mais en attendant...., tu peux déjà mettre un point d'arrêt sur la ligne Set Commande0.Picture = LoadPicture(sTemporyFileName) tu lis la valeur de sTemporyFileName
tu vas chercher ce fichier manuellement (dans \temp), pour voir si déjà le format est valide, voir si WIN arrive à l'ouvrir
si c'est pas le cas c'est que les data sont corrompues
si WIN y arrive, possible que
*ton image ne soit pas supportée par LoadPicture. genre PNG...
*ton bouton n'accepte pas ce type d'image. essaye avec une picturebox
bons tests, et merci d'être vigilants aux rubriques, c'est IMPORTANT !
<hr size ="2" width="100%" />Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
kapusta117
Messages postés9Date d'inscriptionjeudi 31 janvier 2008StatutMembreDernière intervention26 novembre 2008 25 nov. 2008 à 23:04
Bonsoir
Désolé pour ne pas avoir été vigilant au rubrique...
je ferais plus attention les prochaines fois...sinon la méthodologie que vous m'aviez proposé me parait trop bien ..Je vais la tester tout de suite....Merci pour votre intervention.
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 25 nov. 2008 à 23:56
Bonjour
Je te propose de stocker ton image dans une table. Le stockage peut être physique ou logique.
- physique : le fichier .bmp est stocké d'un bloc sous forme binaire, comme un sac de patates
- logique : seuls la palette (si l'image fait 256 couleurs ou moins) et le bitmap data sont stockés sous forme binaire ; les autres informations logiques (hauteur, largeur, nombre de pixels...) sont stockées dans des champs distincts. Ca n'apporte pas grand chose, c'est plutôt une question d'esthétique.
Après, il faut reconstituer l'image sur le poste client, et la charger dans le formulaire.
Je ne l'ai jamais fait sous Access, mais plusieurs fois sous Excel pour les mêmes raisons que toi (exportation).
Est-ce que ça te convient ? Si oui, quelle méthode de stockage préfères-tu, physique ou logique ?
cs_Orohena
Messages postés577Date d'inscriptionvendredi 26 septembre 2008StatutMembreDernière intervention20 novembre 20104 26 nov. 2008 à 05:22
Hello,
J'ai testé le stockage d'une image dans un champ mémo et sa récupération. Ca fonctionne. Je te donne le code.
<hr />
a) stockage de l'image dans le champ monChamp (type mémo) de la table maTable
Sub stockage()
Dim varFichier As String, nf As Integer, path As String
Dim dbs As Database, rst as Recordset
path = "c:\monImage.bmp" ' chemin d'accès de l'image
nf = FreeFile
Open path For Binary As nf
varFichier = String(LOF(nf)," ")
Get #nf,, varFichier ' charge l'image dans la variable varFichier
Close #nf
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("maTable", dbOpenDynaset)
rst.AddNew
rst!monChamp = fichier ' enregistre l'image dans le champ monChamp de la table maTable
rst.Update
rst.Close
dbs.Close
End Sub
<hr />
b) restitution de l'image dans le répertoire de la base de données du client
Sub restitution()
Dim path as String, varFichier as String, nf As Integer
path = Application.CurrentProject.Path & "\monImage.bmp"
If Dir(path) = "monImage.bmp" Then Exit Sub ' Restitution déjà faite --> Sortir
varFichier = DlookUp("monChamp", "maTable") ' charge l'image dans la variable varFichier
nf = FreeFile
Open path For Binary As #nf
put #nf, , varFichier
close #nf
End Sub
<hr />Finalement, cette méthode (physique) est recommandée, car elle est universelle et fonctionne pour n'importe quel fichier (image, vidéo, son...)
kapusta117
Messages postés9Date d'inscriptionjeudi 31 janvier 2008StatutMembreDernière intervention26 novembre 2008 26 nov. 2008 à 09:50
Bonjour
Merci encore une fois pour tous les intervenants ..c'est très sympas de m'avoir dépanner.Je vous tiendrais au courant des résultats de mes tests...
Amicalement