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.
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.
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.
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.
Dim
lShapeStr As
String
' Commande
Dim
oCn As
ADODB.Connection
' Objet connexion
Ouvrons à la suite une 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.
' 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é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.
' 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.
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 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.
' 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 :
' 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▲
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.
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.