Récuperer image stockée dans access 2000 et l'afficher dans un formulaire

kapusta117 Messages postés 9 Date d'inscription jeudi 31 janvier 2008 Statut Membre Dernière intervention 26 novembre 2008 - 25 nov. 2008 à 09:25
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 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.

15 réponses

cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
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...

A+
Exploreur

 Linux a un noyau, Windows un pépin
0
kapusta117 Messages postés 9 Date d'inscription jeudi 31 janvier 2008 Statut Membre Dernière intervention 26 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..
0
kapusta117 Messages postés 9 Date d'inscription jeudi 31 janvier 2008 Statut Membre Dernière intervention 26 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


Commande0.Picture = resultat
End Sub

Merci de ton Aide.
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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 :

http://faq.vb.free.fr/index.php?question=127

++

<hr size="2" width="100%" />
Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kapusta117 Messages postés 9 Date d'inscription jeudi 31 janvier 2008 Statut Membre Dernière intervention 26 novembre 2008
25 nov. 2008 à 17:00
Bonjour PCPT
Merci pour  le lien  ... je vais tester le code et essayer de l'adapter et vous tiendrais au courant.

A++
0
kapusta117 Messages postés 9 Date d'inscription jeudi 31 janvier 2008 Statut Membre Dernière intervention 26 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 +++
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
25 nov. 2008 à 17:27
outch en effet c'est pas tout récent ^^

ADO 2.8
http://www.microsoft.com/downloads/details.aspx?displaylang=fr&FamilyID=6c050fe3-c795-4b7d-b037-185d0506396c


ADO 2.8 + sp1



http://www.microsoft.com/downloads/details.aspx?familyid=78CAC895-EFC2-4F8E-A9E0-3A1AFBD5922E&displaylang=fr





<hr size="2" width="100%" />
Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
0
kapusta117 Messages postés 9 Date d'inscription jeudi 31 janvier 2008 Statut Membre Dernière intervention 26 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


    ' Initialisation des buffers
    sTempFolderPath = String$(MAX_PATH, Chr$(0))
    sBuffer = String$(MAX_PATH - 14, Chr$(0))


    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


End Function

Merci
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
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 
0
kapusta117 Messages postés 9 Date d'inscription jeudi 31 janvier 2008 Statut Membre Dernière intervention 26 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.
0
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
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 ?


Amicalement
0
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
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...)

Amicalement
0
kapusta117 Messages postés 9 Date d'inscription jeudi 31 janvier 2008 Statut Membre Dernière intervention 26 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
0
kapusta117 Messages postés 9 Date d'inscription jeudi 31 janvier 2008 Statut Membre Dernière intervention 26 novembre 2008
26 nov. 2008 à 19:35
Salut tout le monde.

J'ai testé le code que tu m'as passé ........Il colle parfaitement à mes besoinss
10000 MERCI
0
cs_Orohena Messages postés 577 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 20 novembre 2010 4
26 nov. 2008 à 20:59
Trop cool

A bientôt
0
Rejoignez-nous