A l a d é c o u v e r t e d ' A c c e s s 2 0 0 7 : L e s p i è c e s j o i n t
A l a d é c o u v e r t e d ' A c c e s s 2 0 0 7 : L e s p i è c e s j o i n t e s p a r l ' e x e m p l e Date de publication : 04/07/2006 Par Christophe WARIN Dans la continuité de l'article sur les champs multi-valués, je vous propose d'étudier une autre nouveauté d'Access 2007 : Les pièces-jointes. Version PDF Version hors-ligne I. Introduction II. Présentation de l'exemple III. Techniques utilisées IV. Structure de la base de données IV-A. Structure de la table IV-B. Création des requêtes V. L'interface graphique V-A. Le formulaire principal V-B. Le sous-formulaire V-C. Mise en forme conditionnelle VI. Programmation VBA VI-A. Les pièces jointes VI-A-1. L'ajout VI-A-2. L'enregistrement VI-A-3. La suppression VI-B. Les boîtes de dialogue VI-B-1. La fenêtre Ouvrir VI-B-2. La fenêtre Enregistrer Sous VII. Conclusion I. Introduction Une fonctionnalité importantes vient rejoindre le lot des nouveautés d'Access 2007. Attendues depuis longtemps, elle permet l'ajout de pièces-jointes (fichiers) dans les enregistrements. Je vous propose aussi un court exemple d'utilisation des objets FileDialog. Vous pouvez télecharger la version PDF (18 pages - 340 Ko) de cet article : Télechargement FTP (recommandé) Télechargement de secours HTTP II. Présentation de l'exemple Il s'agit d'un formulaire de saisie d'élèves (Nom, prénom, etc.) permettant l'ajout de différents documents pour chacun d'eux. Le résultat final est le suivant : III. Techniques utilisées Plusieurs solutions techniques sont mises en oeuvre à travers cet exemple : Le stockage des fichiers est assuré par la fonction pièce jointe du champ de la table. Les boutons Ajouter et Enregistrer affichent les boîtes de dialogue Ouvrir et Enregistrer Sous du système d'exploitation. La mise en surbrillance de l'élément sélectionné est réalisée avec la mise en forme conditionnelle. Comme indiqué plus haut, la vocation de ce tutoriel est avant tout de vous faire découvrir ces nouvelles fonctionnalités que vous pouvez tester sur la version Béta2 d'Office 2007 (gratuite). Seules les propriétés et méthodes utilisées seront détaillées. En ce qui concerne la gestion des pièces-jointes, Access fournit un assistant graphique très intuitif rendant la partie basse du formulaire ci-dessus inutile. Toutefois, cet exemple va vous permettre d'approcher les nouvelles commandes VBA dédiées aux fichiers. IV. Structure de la base de données IV-A. Structure de la table La base de données est composée d'une seule table nommée tbl_eleve. Sa structure est la suivante : IV-B. Création des requêtes La gestion des pièces-jointes repose sur des champs multi-valués. Un moyen pour s'en apercevoir : créez une nouvelle requête sur la tabletbl_eleve et basculez l'affichage en mode création : Il s'agit bien là d'une structure avec un champ multi-valué : Fichiers. En fait lorsque le développeur décide d'ajouter un champ de type Pièce-Jointe à sa table, Access créée automatiquement l'arborescence correspondante. Pour comprendre le mécanisme mis en jeu dans ces champs, je vous conseille de lire ce tutoriel : A la découverte d'Access V12 : Les champs multi-valués. Quelques remarques : Le champ FileData correspond aux données du fichier. Par la suite, nous verrons que VBA propose une méthode pour enregistrer le contenu d'un fichier dans une pièce-jointe. Le fichier est donc inclus dans la base de données et non pas simplement lié. FileName correspond au nom du fichier. Il doit être unique pour chaque élève. FileType représente le type du fichier. Il est automatiquement mis à jour lors de l'affectation de FileData En tenant compte des informations pratiques données dans le tutoriel cité plus haut, il est facile d'établir les deux requêtes nécessaires au projet : R01 Liste des élèves SELECT N°, Nom, Prénom, Adresse, Ville, CP FROM tbl_eleve; R02 Liste Fichier élèves SELECT N°, [tbl_eleve].Fichiers.Value.Filename AS LesFichiers FROM tbl_eleve; R02 fournit le nom des fichiers associés à chaque élève. V. L'interface graphique V-A. Le formulaire principal Créez un nouveau formulaire vide et disposez les objets de la sorte : Ici, rien de compliqué ni de nouveau. La source du formulaire est la requête R01. Placez ensuite les 3 boutons nommés respectivement cmdAjouter,cmdEnregistrer, cmdSupprimer. V-B. Le sous-formulaire Créez un autre formulaire vide basé sur la requête R02 La zone de texte est nommée txtFichier (ce nom est important car il sera repris dans le code VBA) Fixez les propriétés Ajout autorisé, modification autorisée et suppression autorisée à Non. Revenez ensuite sur le formulaire principal, ajoutez y un cadre de sous-formulaire. Laissez-vous guider par l'assistant. La liaison champ père / champ fils est basée sur le champ N° des deux requêtes. Résultat final : V-C. Mise en forme conditionnelle Pour que l'élément sélectionné dans le sous-formulaire change de couleur, il faut utiliser la mise en forme conditionnelle. Pour toute explication relative à cette notion, je vous recommande de lire mon tutoriel. Cliquez sur le contrôle txtFichier puis sur le bouton Mise en forme conditionnelle dans le ruban Créer. La condition est de type Champ Activé. VI. Programmation VBA VI-A. Les pièces jointes VI-A-1. L'ajout Comme indiqué dans le tutoriel sur les champs multi-valués, les pièces-jointes sont accessibles via un recordset retourné par la propriétéValue du champ Fichiers de la table tbl_eleve. Le squelette de la fonction AjouterFichier est donc semblable à : Function AjouterFichier(strchemin As String, inteleve As Integer) As Boolean On Error GoTo err Dim oRst As DAO.Recordset 'Ouvre un recordset sur les fichiers de l'éleve passé en paramètre Set oRst = CurrentDb.OpenRecordset("SELECT Fichiers FROM tbl_eleve WHERE [N°]=" & inteleve) With oRst.Fields(0).Value 'Ajoute la pièce-jointe .AddNew ' 'ici code qui va enregistrer les données du fichier ' ' .Update End With AjouterFichier = True err: End Function La fonction accepte deux paramètres : le chemin du fichier à joindre et l'identifiant de l'élève. Etant donné que oRst.Fields(0).Value retourne un recordset, il est possible de lui appliquer la méthode AddNew (même si VBA ne la propose pas dans la liste des méthodes disponibles). En résumé, il faut travailler avec oRst.Fields(0).Value comme s'il s'agissait d'un objet recordset. En ce qui concerne le code qui va convertir le fichier en données à insérer dans la base, il se résume à une seule ligne fournit par le nouveau modèle DAO. .Fields("FileData").LoadFromFile strchemin Explications : En introduisant les pièces jointes, Microsoft a été contraint d'écrire des nouvelles méthodes pour les champs DAO de ce type. Toutefois, ne souhaitant pas perturber l'existant, les développeurs d'Office ont en fait créé un nouvel objet de type Field2 venant compléter l'objet Field. Le champ FileDataétant concerné par cette modification, le code suivant est correct : Dim oFld as DAO.Field2 Set oFld=.Fields("FileData") Les objets Field2 exposent 2 méthodes pour lire et écrire les fichiers joints LoadFromFile : Charge le fichier dans la base de données. SaveToFile : Sauvegarde la pièce-jointe dans un nouveau fichier. Pour ajouter une pièce-jointe dont le chemin est strChemin, on aura donc : Dim oFld as DAO.Field2 Set oFld=.Fields("FileData") oFld.LoadFromFile strchemin Soit en une seule ligne : .Fields("FileData").LoadFromFile strchemin La fonction AjouterFichier devient : Function AjouterFichier(strchemin As String, inteleve As Integer) As Boolean On Error GoTo err Dim oRst As DAO.Recordset 'Ouvre un recordset sur les fichiers de l'éleve passé en paramètre Set oRst = CurrentDb.OpenRecordset("SELECT Fichiers FROM tbl_eleve WHERE [N°]=" & inteleve) With oRst.Fields(0).Value 'Ajoute la pièce jointe .AddNew 'Lit le fichier .Fields("FileData").LoadFromFile strchemin .Update End With AjouterFichier = True fin: Set oRst = Nothing Exit Function err: 'Gestion d'erreur Select Case err.Number Case 3024: MsgBox "Fichier inexistant", vbCritical Case 3820: MsgBox "Une autre pièce-jointe de ce nom existe déjà", vbCritical Case Else: MsgBox "Erreur inconnue", vbCritical End Select Resume fin End Function VI-A-2. L'enregistrement Sur le même principe que l'ajout mais avec la méthode SaveToFile, voici le code de la fonction EnregistrerFichier : Function EnregistrerFichier(strNomFichier As String, inteleve As Integer, strNomDestination) As Boolean On Error GoTo err Dim oRst As DAO.Recordset 'Ouvre un recordset sur les fichiers de l'éleve passé en paramètre Set oRst = CurrentDb.OpenRecordset("SELECT Fichiers.FileData FROM tbl_eleve WHERE [N°]=" & _ inteleve & " AND Fichiers.FileName=" & Chr(34) & strNomFichier & Chr(34)) If Not oRst.EOF Then oRst.Fields(0).SaveToFile strNomDestination EnregistrerFichier = True End If fin: Set oRst = Nothing Exit Function err: Select Case err.Number Case 3839: MsgBox "Impossible d'écraser le fichier", vbCritical Case Else MsgBox "Erreur inconnue", vbCritical End Select Resume fin End Function Cette fonction accepte un paramètre supplémentaire : le chemin du fichier dans lequel sera enregistrée la pièce jointe. VI-A-3. La suppression Il serait possible, là aussi, d'utiliser un recordset sur le champ Fichiers et appliquer sa méthode Delete. Cependant, dans un souci pédagogique, j'ai préféré utiliser une requête SQL exécutée en VBA de la façon suivante : Function SupprimerFichier(strNomFichier As String, inteleve As Integer) As Boolean On Error GoTo err CurrentDb.Execute "DELETE [tbl_eleve].Fichiers.FileName " & _ "FROM tbl_eleve " & _ "WHERE [N°]=" & inteleve & _ " AND [tbl_eleve].Fichiers.FileName=" & Chr(34) & strNomFichier & Chr(34) SupprimerFichier = True err: End Function La requête permet de supprimer les sous-enregistrements de tbl_eleve.Fichier pour l'élève N° inteleve où le nom du fichier est strNomFichier. uploads/Ingenierie_Lourd/ lecon-6-a-la-decouverte-d-x27-access-2007-les-pieces-jointes-par-l-x27-exemple.pdf
Documents similaires










-
27
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Oct 12, 2021
- Catégorie Heavy Engineering/...
- Langue French
- Taille du fichier 0.5865MB