ACCESS : Créez des formulaires sans table

Thierry GASPERMENT

Découvrez l'utilisation du Data Shaping dans un formulaire Access.

Commentez cet article : Commentez

- Titre : ACCESS : Créez des formulaires sans table

- Auteur : Thierry GASPERMENT

- Parution : 22 décembre 2008

- Mise à jour : 18 mai 2016

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2016 Thierry GASPERMENT. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Droits de diffusion permanents accordés à Developpez LLC.

Sommaire

- I. Introduction

- II. Limitation

- III. Affichage des propriétés de la base de données dans un formulaire

- III-A. Création du formulaire

- III-B. Création du jeu d'enregistrements ADO

- III-C. Mise à jour des champs source des contrôles

- III-D. Affectation du jeu d'enregistrements au formulaire

- III-E. Ajout de données dans le jeu d'enregistrements

- III-F. Erreur sur tris et filtres

- III-G. Téléchargement

- IV. Exemple : un explorateur de fichiers

- V. Conclusion

I - Introduction

Nous allons au cours de ce tutoriel créer un formulaire sans table.

Un jeu d'enregistrements ADO sera généré en VBA puis affecté à un formulaire.

On peut ainsi, dans un formulaire, afficher des données sans nécessairement les stocker dans une table.

Les bases de données de ce tutoriel ont été créées avec Access 2003, et enregistrées au format Access 2000. Des tests ont été également effectués sur Access 2013 64bits.

Le Data Shaping utilise MDAC qui devrait normalement être installé sur tout PC avec Office.

Consultez la documentation sur Msdn

II - Limitation

Vous devez posséder une version d'Access 2000 ou supérieure.

Les données ne sont pas directement modifiables dans un formulaire utilisant cette technique.

Il n'est pas possible de lier un jeu d'enregistrements ADO dans un état (sauf dans un projet ADP).

III - Affichage des propriétés de la base de données dans un formulaire

Pour l'exemple nous allons créer un petit formulaire qui contient la liste des propriétés de la base de données courante.

On pourrait simplement ajouter chaque propriété dans une table puis afficher cette table dans un formulaire.

Si on souhaite se passer d'une table, il existe une solution en utilisant le Data Shaping.

III-A - Création du formulaire

Créez un nouveau formulaire.

Nous souhaitons afficher une liste d'enregistrements et éviter qu'Access n'ajuste la taille à une seule section.

Modifiez donc dans les propriétés du formulaire (Affichage => Propriétés) :

Dans l'onglet Format :

- Affichage par défaut = Formulaires continus

- Taille ajustée = non

Nous ne définissons pas de source du formulaire, elle sera définie dans le code VBA.

Créez dans la section détail deux zones de texte pour recevoir les données :

- une zone nommée txtnom

- une zone nommée txtvaleur

III-B - Création du jeu d'enregistrements ADO

Afficher le code du formulaire : Affichage => Code.

Nous allons utiliser ADO, il faut donc ajouter la référence correspondante.

Dans le menu Outils => Référence, cochez la version la plus récente de la librairie Microsoft ActiveX Data Objects x.x Library.

En tête de module, déclarez le jeu d'enregistrements ADO qui servira de source de données du formulaire.

En-tête de module

Private oRs As ADODB.Recordset ' Recordset Source du formulaire

Il est important que le jeu d'enregistrements soit déclaré en en-tête de module car l'objet doit être utilisable tant que le formulaire est ouvert.

Ensuite nous devons le créer au chargement du formulaire.

Le code de création de ce jeu d'enregistrements est écrit dans l'événement Sur chargement du formulaire.

Vous pouvez générer la procédure événementielle en choisissant Form dans la liste déroulante à droite en haut du module puis Load dans la liste de droite.

Code de la procédure de chargement du formulaire

Private Sub Form_Load()
End Sub

C'est à l'intérieur de cette procédure Form_Load que la création du jeu d'enregistrements sera programmée.

Pour créer ce jeu d'enregistrements, nous avons besoin d'un objet Connection et d'une variable contenant la commande SHAPE.

Déclarations dans Form_Load

Dim lShapeStr As String ' Commande
Dim oCn As ADODB.Connection ' Objet connexion

Ouvrons à la suite une connexion.

Ouverture de la connexion

' Nouvelle connexion ADO
Set oCn = New ADODB.Connection
' Connection MSDataShape pour créer un recordset sans source de données
oCn.Open "Provider=MSDataShape;Data Provider=NONE;"

Le provider utilisé est toujours MSDataShape pour ce type de recordset.

Pour terminer la création du jeu d'enregistrements, il faut écrire une commande décrivant la structure.

Ecriture de la structure

' Commande Shape pour structure du recordset
lShapeStr = "SHAPE APPEND" & _
" NEW adVarWChar(255) AS nom," & _
" NEW adVarWChar(255) AS valeur"

Détaillons cette commande :

- la commande commence par le mot-clé SHAPE ;

- ensuite le mot-clé APPEND indique qu'on va ajouter des champs (ces champs seront séparés par des virgules) ;

- pour chaque champ on utilise NEW pour spécifier la création d'un nouveau champ ;

- suit le type de champ (adVarWChar de taille 255) ;

- et enfin l'alias introduit par AS qui correspond au nom du champ.

Vous trouverez les types de champs disponibles :

- soit dans la documentation sur MSDN ;

- soit dans l'explorateur d'objets (Affichage => Explorateur d'objets) en recherchant DataTypeEnum dans la librairie ADODB.

Ces types de champ sont des types de données ADO utilisables dans divers langages.

Il faut parfois faire quelques essais pour trouver le type qui correspond à un type de données VBA.

Cette commande nous sert enfin à créer l'objet Recordset avec la méthode Open.

Création du jeu d'enregistrements

' Crée un nouvel objet recordset
Set oRs = New ADODB.Recordset
' Crée le recordset en fonction de la structure définie au-dessus
oRs.Open lShapeStr, oCn, adOpenDynamic, adLockOptimistic, -1

III-C - Mise à jour des champs source des contrôles

Lorsqu'on a créé les contrôles, on ne leur a pas affecté de source de données.

Maintenant qu'on a créé la structure du jeu d'enregistrements, on connait les noms des champs à affecter aux contrôles.

Ce sont les alias définis dans la commande SHAPE.

Dans l'onglet Données des contrôles, mettre dans la propriété Source Contrôle :

- nom pour le contrôle txtnom ;

- valeur pour le contrôle txtvaleur.

Vous remarquez qu'on ne peut pas choisir la source du contrôle dans la liste déroulante car elle est vide.

C'est tout à fait normal, les noms des champs sont définis dynamiquement avec la commande SHAPE et ne sont donc pas connus en mode création.

III-D - Affectation du jeu d'enregistrements au formulaire

Une fois le jeu d'enregistrements créé, il suffit de l'affecter à l'objet RecordSet du formulaire.

Affection du jeu d'enregistrements au formulaire

' Affecte le recordset au formulaire
Set Me.Recordset = oRs

Si on affiche le formulaire, il est vierge.

Ce qui est normal, on a juste créé la structure du jeu d'enregistrements, il faut maintenant le remplir.

III-E - Ajout de données dans le jeu d'enregistrements

L'ajout de données se fait comme pour n'importe quel autre jeu d'enregistrements ADO.

La méthode AddNew ajoute un nouvel enregistrement.

La méthode Update met à jour l'enregistrement.

Pour l'exemple, on souhaitait afficher les propriétés de la base de données.

Ces propriétés sont stockées dans l'objet CurrentDB.

Ce sont des objets de type Property de la librairie DAO.

Ajoutez donc une référence à la librairie Microsoft DAO x.x Object Library.

Pour parcourir les propriétés, on a besoin de déclarer une variable de type DAO.Database et une variable de type DAO.Property.

Déclarations au début de Form_Load

Dim lProp As DAO.Property ' Objet Propriété
Dim lDb As DAO.Database ' Objet Base de données

Ensuite on parcourt les propriétés de l'objet CurrentDb et on ajoute leur nom et leur valeur au jeu d'enregistrements.

On n'utilise pas directement CurrentDb, mais notre variable lDb. Utiliser directement CurrentDb n'est pas conseillé car l'objet n'est alors pas correctement libéré par VBA.

On fait appel aux champs du jeu d'enregistrements comme pour n'importe quel autre type de recordset.

Parcours des propriétés de la base de données

' Parcours les propriétés de la base de données
Set lDb = CurrentDb
For Each lProp In CurrentDb.Properties
' Nouveau Champ
oRs.AddNew
' Nom de la propriété
oRs!nom = lProp.Name
' Valeur de la propriété si lisible
If lProp.Type <> dbGUID And lProp.Type <> 0 Then
oRs!valeur = CStr(Nz(lProp.Value,"(Null)"))
Else
oRs!valeur = "(inconnu)"
End If
' Met à jour le champ
oRs.Update
Next

Petite remarque : les propriétés de type égal à dbGuid ou 0 provoquent des erreurs : on teste donc d'abord le type avant d'affecter la valeur.

Le Nz est utilisé en cas de valeur Null.

Ensuite on se déplace au début du jeu d'enregistrements, sinon on reste positionné sur le dernier élément ajouté, tout en bas du formulaire.

Déplacement en début de jeu d'enregistrements

' Se positionne au premier enregistrement (s'il y a au moins un enregistrement)
If oRs.RecordCount > 0 Then oRs.MoveFirst

Vous pouvez maintenant afficher le formulaire et admirer le résultat.

On a réussi à afficher un formulaire en mode continu sans aucune table ou requête.

III-F - Erreur sur tris et filtres

Si vous essayez de trier ou filtrer le formulaire, une erreur s'affiche.

Pourtant le tri ou le filtre s'effectue correctement.

Pour éviter cette erreur, ajoutez ce code dans le module du formulaire :

Masque l'erreur lors d'un filtre ou d'un tri

' En cas d'erreur sur le formulaire
Private Sub Form_Error(DataErr As Integer, Response As Integer)
' Ignore le message "Instruction SQL non valide"
' Ce message apparaît en cas de filtre, mais le filtre fonctionne quand même
If DataErr = 3129 Then
Response = acDataErrContinue
End If
End Sub

III-G - Téléchargement

Télécharger la base Access de ce tutoriel au format ACCESS 2000

IV - Exemple : un explorateur de fichiers

Dans cet exemple, vous trouverez un petit explorateur de fichiers :

- Les dossiers sont parcourus avec la commande Dir.

- Aucune table ou requête n'est utilisée pour stocker la liste des fichiers.

- Les couleurs différentes pour les disques, dossiers ou fichiers sont obtenues par mise en forme conditionnelle.

Télécharger l'exemple au format ACCESS 2000

V - Conclusion

Cet article n'est qu'une introduction à l'utilisation du Data Shaping dans Access.

Je vous invite à lire la documentation sur MSDN pour en découvrir plus.

Merci à l'équipe Office de developpez.com pour ses relectures, commentaires et encouragements!

Merci à Vodiem pour ces remarques techniques.