Vous êtes sur la page 1sur 97

Dfinition et manipulation de donnes avec DAO

par Christophe WARIN


Date de publication : 09/05/2005 Dernire mise jour : 30/07/2009

Ce support constitue un cours d'introduction l'accs aux donnes dans une base Access via DAO (Data Access Object). Il ne ncessite pas de connaissance pointue en programmation hormis les bases du langage VBA.

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

1 - Introduction & Tlchargement..............................................................................................................................7 1.1 - Tlchargement............................................................................................................................................. 7 1.2 - Introduction.................................................................................................................................................... 7 2 - La hirarchie du modle DAO............................................................................................................................... 8 2.1 - Le modle objet.............................................................................................................................................8 2.2 - Quelques rappels sur les collections.............................................................................................................9 2.2.1 - Accder un lment d'une collection.................................................................................................9 2.2.2 - Compter les lments........................................................................................................................... 9 2.2.3 - Parcourir les lments d'une collection.............................................................................................. 10 2.2.4 - Ajouter un lment.............................................................................................................................. 10 2.2.5 - Supprimer un lment.........................................................................................................................11 3 - Accder une base de donnes........................................................................................................................ 12 3.1 - L'objet DBEngine......................................................................................................................................... 12 3.1.1 - Gnralits.......................................................................................................................................... 12 3.1.2 - Liste des proprits.............................................................................................................................12 3.1.2.1 - DefaultPassword......................................................................................................................... 12 3.1.2.2 - DelfaultType................................................................................................................................ 12 3.1.2.3 - DefaultUser................................................................................................................................. 12 3.1.2.4 - Errors...........................................................................................................................................12 3.1.2.5 - Inipath..........................................................................................................................................13 3.1.2.7 - Properties.................................................................................................................................... 13 3.1.2.8 - SystemDB................................................................................................................................... 13 3.1.2.9 - Version........................................................................................................................................ 13 3.1.2.10 - Workspaces...............................................................................................................................14 3.1.3 - Liste des mthodes............................................................................................................................. 14 3.1.3.1 - BeginTrans.................................................................................................................................. 14 3.1.3.2 - CommitTrans............................................................................................................................... 14 3.1.3.3 - CompactDatabase.......................................................................................................................14 3.1.3.4 - CreateDatabase.......................................................................................................................... 15 3.1.3.5 - CreateWorkspace........................................................................................................................15 3.1.3.6 - Idle...............................................................................................................................................15 3.1.3.7 - OpenDatabase............................................................................................................................ 16 3.1.3.8 - RepairDatabase.......................................................................................................................... 16 3.1.3.9 - Rollback.......................................................................................................................................16 3.2 - L'objet Workspace....................................................................................................................................... 16 3.2.1 - Gnralits.......................................................................................................................................... 16 3.2.2 - Liste des proprits.............................................................................................................................17 3.2.2.1 - Databases................................................................................................................................... 17 3.2.2.2 - IsolateODBCTrans...................................................................................................................... 17 3.2.2.3 - Name...........................................................................................................................................18 3.2.2.4 - Properties.................................................................................................................................... 18 3.2.2.5 - Type.............................................................................................................................................18 3.2.3 - Liste des mthodes............................................................................................................................. 18 3.2.3.1 - BeginTrans.................................................................................................................................. 18 3.2.3.2 - Close........................................................................................................................................... 18 3.2.3.3 - CommitTrans............................................................................................................................... 19 3.2.3.4 - CreateDatabase.......................................................................................................................... 19 3.2.3.5 - OpenDatabase............................................................................................................................ 19 3.2.3.6 - Rollback.......................................................................................................................................20 3.2.4 - Accder un groupe de travail spcifique......................................................................................... 20 3.3 - L'objet Database.......................................................................................................................................... 23 3.3.1 - Gnralits.......................................................................................................................................... 23 3.3.1.1 - La mthode CurrentDb............................................................................................................... 23 3.3.1.2 - La mthode CodeDb...................................................................................................................24 3.3.2 - Liste des proprits.............................................................................................................................24 3.3.2.1 - CollatingOrder............................................................................................................................. 24 3.3.2.2 - Connect....................................................................................................................................... 25 3.3.2.3 - Containers................................................................................................................................... 25
-2Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

3.3.2.4 - Name...........................................................................................................................................25 3.3.2.5 - Properties.................................................................................................................................... 26 3.3.2.6 - QueryDefs................................................................................................................................... 26 3.3.2.7 - RecordsAffected.......................................................................................................................... 26 3.3.2.8 - Recordsets.................................................................................................................................. 26 3.3.2.9 - Relations..................................................................................................................................... 26 3.3.2.10 - TableDefs.................................................................................................................................. 27 3.3.2.11 - Transactions.............................................................................................................................. 27 3.3.2.12 - Updatable.................................................................................................................................. 27 3.3.2.13 - Version...................................................................................................................................... 27 3.3.3 - Liste des mthodes............................................................................................................................. 27 3.3.3.1 - Close........................................................................................................................................... 27 3.3.3.2 - CreateProperty............................................................................................................................ 28 3.3.3.3 - CreateQueryDef.......................................................................................................................... 28 3.3.3.4 - CreateRelation............................................................................................................................ 28 3.3.3.5 - CreateTableDef........................................................................................................................... 28 3.3.3.6 - Execute....................................................................................................................................... 29 3.3.3.7 - NewPassword............................................................................................................................. 29 3.3.3.8 - OpenRecordset........................................................................................................................... 29 4 - DAO et la structure d'une base de donnes....................................................................................................... 30 4.1 - Gnralits...................................................................................................................................................30 4.2 - Les proprits spcifiques...........................................................................................................................30 4.2.1 - Dfinitions............................................................................................................................................ 30 4.2.2 - Liste des proprits d'un objet Property............................................................................................. 31 4.2.2.1 - Inherited...................................................................................................................................... 31 4.2.2.2 - Name...........................................................................................................................................31 4.2.2.3 - Type.............................................................................................................................................32 4.2.2.4 - Value........................................................................................................................................... 32 4.2.3 - Accder une proprit..................................................................................................................... 32 4.2.4 - Modifier la valeur d'une proprit....................................................................................................... 33 4.2.5 - Cration d'une nouvelle proprit....................................................................................................... 35 4.3 - L'objet TableDef........................................................................................................................................... 36 4.3.1 - Dfinitions............................................................................................................................................ 36 4.3.2 - Liste des proprits.............................................................................................................................36 4.3.2.1 - Attributes..................................................................................................................................... 36 4.3.2.2 - Connect....................................................................................................................................... 37 4.3.2.3 - DataCreated................................................................................................................................ 37 4.3.2.4 - Fields...........................................................................................................................................37 4.3.2.5 - Indexes........................................................................................................................................37 4.3.2.6 - LastUpdated................................................................................................................................ 37 4.3.2.7 - Name...........................................................................................................................................37 4.3.2.8 - Properties.................................................................................................................................... 38 4.3.2.9 - RecordCount............................................................................................................................... 38 4.3.2.10 - SourceTableName.....................................................................................................................38 4.3.2.11 - Updatable.................................................................................................................................. 38 4.3.2.12 - ValidationRule........................................................................................................................... 38 4.3.2.13 - ValidationText............................................................................................................................ 38 4.3.3 - Liste des mthodes............................................................................................................................. 39 4.3.3.1 - CreateField..................................................................................................................................39 4.3.3.2 - CreateIndex.................................................................................................................................39 4.3.3.3 - CreateProperty............................................................................................................................ 39 4.3.3.4 - OpenRecordset........................................................................................................................... 39 4.3.3.5 - RefreshLink................................................................................................................................. 39 4.3.4 - Oprations sur les tables d'une base de donnes............................................................................. 40 4.3.4.1 - Lister les tables d'une base de donnes....................................................................................40 4.3.4.2 - Renommer une table.................................................................................................................. 41 4.3.4.3 - Supprimer une table................................................................................................................... 41 4.3.4.4 - Crer une nouvelle table............................................................................................................ 42
-3Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

4.4 - L'objet Field..................................................................................................................................................43 4.4.1 - Dfinition..............................................................................................................................................43 4.4.2 - Liste des proprits.............................................................................................................................43 4.4.2.1 - AllowZeroLength......................................................................................................................... 44 4.4.2.2 - Attributes..................................................................................................................................... 44 4.4.2.3 - CollatingOrder............................................................................................................................. 44 4.4.2.4 - DataUpdatable............................................................................................................................ 45 4.4.2.5 - DefaultValue................................................................................................................................ 45 4.4.2.6 - FieldSize......................................................................................................................................45 4.4.2.7 - ForeignName...............................................................................................................................46 4.4.2.8 - Name...........................................................................................................................................46 4.4.2.9 - OrdinalPosition............................................................................................................................ 46 4.4.2.10 - Properties.................................................................................................................................. 46 4.4.2.11 - Required.................................................................................................................................... 46 4.4.2.12 - Size........................................................................................................................................... 46 4.4.2.13 - SourceField............................................................................................................................... 47 4.4.2.14 - SourceTable.............................................................................................................................. 48 4.4.2.15 - Type...........................................................................................................................................48 4.4.2.16 - ValidationRule........................................................................................................................... 49 4.4.2.17 - ValidationText............................................................................................................................ 49 4.4.2.18 - Value......................................................................................................................................... 49 4.4.2.19 - VisibleValue............................................................................................................................... 49 4.4.3 - Liste des mthodes............................................................................................................................. 49 4.4.3.1 - AppendChunk..............................................................................................................................49 4.4.3.2 - CreateProperty............................................................................................................................ 49 4.4.3.3 - GetChunk.................................................................................................................................... 50 4.4.4 - Oprations sur les champs d'un objet TableDef................................................................................. 50 4.4.4.1 - Renommer un champ................................................................................................................. 50 4.4.4.2 - Supprimer un champ.................................................................................................................. 51 4.4.4.3 - Crer un champ.......................................................................................................................... 52 4.4.4.4 - Dupliquer un champ....................................................................................................................53 4.5 - L'objet Index.................................................................................................................................................54 4.5.1 - Dfinitions............................................................................................................................................ 54 4.5.2 - Liste des proprits.............................................................................................................................54 4.5.2.1 - DistinctCount............................................................................................................................... 54 4.5.2.2 - Fields...........................................................................................................................................55 4.5.2.3 - Foreign........................................................................................................................................ 55 4.5.2.4 - IgnoreNulls.................................................................................................................................. 55 4.5.2.5 - Name...........................................................................................................................................55 4.5.2.6 - Properties.................................................................................................................................... 55 4.5.2.7 - Required......................................................................................................................................55 4.5.2.8 - Unique......................................................................................................................................... 56 4.5.3 - Liste des mthodes............................................................................................................................. 56 4.5.3.1 - CreateField..................................................................................................................................56 4.5.3.2 - CreateProperty............................................................................................................................ 56 4.5.4 - Oprations sur les Index.....................................................................................................................56 4.5.4.1 - Crer un index............................................................................................................................ 56 4.5.4.2 - Supprimer une cl primaire........................................................................................................ 57 4.6 - L'objet Relation............................................................................................................................................ 57 4.6.1 - Dfinitions............................................................................................................................................ 57 4.6.2 - Liste des proprits.............................................................................................................................57 4.6.2.1 - Attributes..................................................................................................................................... 57 4.6.2.2 - Fields...........................................................................................................................................58 4.6.2.3 - ForeignTable................................................................................................................................58 4.6.2.4 - Name...........................................................................................................................................58 4.6.2.6 - Properties.................................................................................................................................... 58 4.6.2.7 - Table............................................................................................................................................59 4.6.3 - Liste des mthodes............................................................................................................................. 59
-4Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

4.6.4 - Exemple de dfinition des proprits..................................................................................................59 4.6.5 - Oprations sur les relations................................................................................................................ 60 4.6.5.1 - Crer une relation....................................................................................................................... 60 4.6.5.2 - Compter les relations utilisant un champ donn........................................................................ 61 4.6.5.3 - Supprimer les relations autour d'une table................................................................................. 62 4.7 - L'objet QueryDef.......................................................................................................................................... 63 4.7.1 - Dfinitions............................................................................................................................................ 63 4.7.2 - Liste des proprits.............................................................................................................................64 4.7.2.1 - Connect....................................................................................................................................... 64 4.7.2.2 - DateCreated................................................................................................................................ 64 4.7.2.3 - Fields...........................................................................................................................................64 4.7.2.4 - LastUpdated................................................................................................................................ 64 4.7.2.5 - MaxRecords................................................................................................................................ 65 4.7.2.6 - Name...........................................................................................................................................65 4.7.2.7 - Parameters..................................................................................................................................65 4.7.2.8 - Properties.................................................................................................................................... 65 4.7.2.9 - RecordsAffected.......................................................................................................................... 65 4.7.2.10 - ReturnsRecords........................................................................................................................ 65 4.7.2.11 - SQL........................................................................................................................................... 66 4.7.2.12 - Type...........................................................................................................................................66 4.7.2.13 - Updatable.................................................................................................................................. 66 4.7.3 - Liste des mthodes............................................................................................................................. 66 4.7.3.1 - CreateProperty............................................................................................................................ 66 4.7.3.2 - Execute....................................................................................................................................... 67 4.7.3.3 - OpenRecordset........................................................................................................................... 67 4.7.4 - Oprations sur les requtes................................................................................................................67 4.7.4.1 - Cration d'une requte............................................................................................................... 67 4.7.4.2 - Modifier le code d'une requte................................................................................................... 68 4.7.4.3 - Lister les requtes...................................................................................................................... 68 5 - Accs aux donnes............................................................................................................................................. 70 5.1 - Dfinition...................................................................................................................................................... 70 5.1.1 - Les diffrents types de Recordset...................................................................................................... 70 5.2 - Ouvrir et fermer un recordset......................................................................................................................71 5.2.1 - Depuis un objet Database.................................................................................................................. 71 5.2.2 - Depuis un objet QueryDef.................................................................................................................. 73 5.2.3 - Depuis un formulaire Access.............................................................................................................. 73 5.2-4 - Fermer un Recordset.......................................................................................................................... 74 5.3 - Positions et dplacements...........................................................................................................................74 5.3.1 - Se dplacer dans un Recordset......................................................................................................... 74 5.3.2 - Trouver un enregistrement.................................................................................................................. 75 5.3.3 - Mmoriser une position.......................................................................................................................76 5.4 - Manipulation des donnes...........................................................................................................................76 5.4.1 - Lire un enregistrement........................................................................................................................ 76 5.4.2 - Modifier un enregistrement................................................................................................................. 77 5.4.3 - Ajouter un enregistrement...................................................................................................................78 5.4.4 - Supprimer un enregistrement..............................................................................................................79 5.4.5 - Compter les enregistrements.............................................................................................................. 79 5.4.6 - Filtrer les donnes...............................................................................................................................81 5.5 - Lecture par bloc...........................................................................................................................................81 5.5.1 - Gnralits.......................................................................................................................................... 82 5.5.2 - Exemple...............................................................................................................................................82 5.6 - Liste des proprits..................................................................................................................................... 85 5.6.1 - AbsolutePosition.................................................................................................................................. 85 5.6.2 - BOF..................................................................................................................................................... 85 5.6.3 - Bookmark.............................................................................................................................................86 5.6.4 - Bookmarkable......................................................................................................................................86 5.6.5 - CacheSize........................................................................................................................................... 86 5.6.6 - CacheStart...........................................................................................................................................86
-5Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

5.6.7 - Connection...........................................................................................................................................87 5.6.8 - DataCreated........................................................................................................................................ 87 5.6.9 - EditMode..............................................................................................................................................87 5.6.10 - EOF................................................................................................................................................... 88 5.6.11 - Fields................................................................................................................................................. 88 5.6.12 - Filter...................................................................................................................................................88 5.6.13 - Index.................................................................................................................................................. 88 5.6.14 - LastModified...................................................................................................................................... 88 5.6.15 - LastUpdated...................................................................................................................................... 89 5.6.16 - LockEdits........................................................................................................................................... 89 5.6.17 - Name................................................................................................................................................. 89 5.6.18 - NoMatch............................................................................................................................................ 89 5.6.19 - PercentPosition..................................................................................................................................89 5.6.20 - Properties.......................................................................................................................................... 90 5.6.21 - RecordCount......................................................................................................................................90 5.6.22 - Restartable........................................................................................................................................ 90 5.6.23 - Sort.................................................................................................................................................... 90 5.6.24 - StillExecuting..................................................................................................................................... 91 5.6.25 - Transactions...................................................................................................................................... 91 5.6.26 - Type................................................................................................................................................... 92 5.6.27 - Updatable.......................................................................................................................................... 92 5.6.28 - UpdateOptions...................................................................................................................................92 5.6.29 - ValidationRule.................................................................................................................................... 92 5.6.30 - ValidationText.....................................................................................................................................92 5.7 - Liste des mthodes..................................................................................................................................... 93 5.7.1 - AddNew............................................................................................................................................... 93 5.7.2 - CancelUpdate...................................................................................................................................... 93 5.7.3 - Clone................................................................................................................................................... 93 5.7.4 - Close....................................................................................................................................................94 5.7.5 - CreateQueryDef...................................................................................................................................94 5.7.6 - Delete.................................................................................................................................................. 94 5.7.7 - Edit.......................................................................................................................................................94 5.7.8 - FindFirst, FindLast, FindNext, FindPrevious....................................................................................... 94 5.7.9 - GetRows.............................................................................................................................................. 95 5.7.10 - Move, MoveFirst, MoveLast, MoveNext, MovePrevious................................................................... 95 5.7.11 - OpenRecordset.................................................................................................................................. 95 5.7.12 - Requery............................................................................................................................................. 95 5.7.13 - Update............................................................................................................................................... 95 6 - Conclusion............................................................................................................................................................97

-6Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

1 - Introduction & Tlchargement 1.1 - Tlchargement


Franais Tlcharger la version PDF de ce tutoriel 96 pages - 547 Ko FTP (Recommand) : Tlcharger HTTP (Secours) : Tlcharger Tlcharger la traduction de ce tutoriel au format PDF 116 pages - 940 Ko par MED ALAOUI SOSSE FTP (Recommand) : Tlcharger HTTP (Secours) : Tlcharger

Arabe

1.2 - Introduction
DAO (Data Access Objects) est une bibliothque regroupant un ensemble d'objets permettant d'accder une base de donnes. L'utilisation de ces objets permet la fois de travailler la structure de la base mais aussi de manipuler ses donnes. Ce cours a pour objectif de vous enseigner les innombrables possibilits offertes par cette bibliothque, que ce soit aussi bien au niveau de la structure que des donnes. Via plusieurs exemples, vous allez ainsi dcouvrir comment il est possible de crer une table, modifier ses champs, dfinir des relations, construire des requtes, manipuler les donnes d'un formulaire, ajouter de nouveaux enregistrements, ... Vous pourrez aussi retrouver chacune des proprits et des mthodes propres chaque objet dans un listing en fin de section. Bien entendu, cette liste ne prtend pas se substituer l'aide Access qui, je vous le rappelle, reste la plus grande mine d'informations. Certaines parties ne sont pas dtailles dans ce document car elles ne rpondent pas une utilisation classique de DAO avec le moteur Jet. Afin d'alleger ce cours, vous ne trouverez donc pas d'informations concernant : L'acccs aux donnes dans un environnement ODBC Direct La replication Les objets DAO ne concernant pas l'accs aux donnes (Scurit, Utilisateur, Conteneur ....)

Avant de commencer : L'ensemble des mthodes et des objets permettant l'accs aux donnes via DAO sont regroups au sein d'une mme librairie. Afin d'utiliser ces fonctionnalits, il vous faut donc ajouter la rfrence suivante votre projet : Microsoft DA0 3.5 Object Library pour Access 97. Microsoft DA0 3.6 Object Library pour les versions utltrieures. Microsoft Office 12.0 (14.0) Access Database Engine Object pour travailler avec des bases de donnes Access 2007 ou Access 2010. Comment ajouter une rfrence ? Depuis le menu Outils de l'diteur Visual Basic, slectionnez l'option Rfrences. Cochez ensuite la case correspondante la rfrence ajouter.

-7Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

2 - La hirarchie du modle DAO 2.1 - Le modle objet


Voici une reprsentation du modle objet DAO :

Comme vous pouvez le remarquer, le modle objet DAO possde une structure hirarchise dont la racine est un objet DBEngine. Les relations de descendance sont de type un plusieurs. Cela signifie que chaque objet parent possde une collection de chaque type d'objet enfant dont le nom est normalis ainsi : Nom de la collection = Type de l'objet enfant + "s" Par exemple, l'objet DBEngine possde une collection d'objet Workspace. Cette collection est nomme Workspaces. Prcisons aussi que ce schma a t rduit uniquement la partie dfinition de donnes (en bleu) et la partie manipulation de donnes (en vert). De plus, chaque branche a t rduite pour amliorer la lisibilit. Comme tout autre objet, un objet DAO possde un ensemble de proprits (property). Celles ci sont regroupes dans une collection nomme properties propre chaque objet. Voici un exemple du schma rel appliquer aux objets TableDef.

L'utilisation de DAO implique de nombreuses dclarations de variables. Ceci demande beaucoup de rigueur. Aussi je vous invite consulter le tutoriel sur les conventions de nommage Visual Basic crit par Jean-Philippe AMBROSINO : Les conventions typographiques en VBA (illustres sur Access)

-8Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

2.2 - Quelques rappels sur les collections


Etant donn que DAO est un modle objet et qu'il utilise de nombreuses collections, je vous propose quelques rappels sur le traitement des collections d'objets sous Visual Basic.

2.2.1 - Accder un lment d'une collection


Il existe deux techniques afin d'accder un objet d'une collection : Accs via l'index : Il s'agit d'utiliser la position de l'lment dans la collection en sachant que le premier possde l'index zro. Syntaxe :
MaCollection.Item(2)

Accs via la cl : Il s'agit d'utiliser le nom de l'lement lorsque celui-ci est connu. Syntaxe :
MaCollection.Item ("MonItem")

La proprit Item est le membre par dfaut des objets de type Collection. Vous pouvez donc utiliser indiffremment : Syntaxe :
MaCollection.Item ("MonItem")

Ou : Syntaxe :
MaCollection.("MonItem")

2.2.2 - Compter les lments


Sous Visual Basic, les collections proposent la proprit Count qui renvoie le nombre d'objets dans la collection. Syntaxe :
MaCollection.Count

Etant donn que le premier lment a pour index 0, on en conclut aisment que le dernier lment de la collection possde l'index : Count - 1

-9Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

2.2.3 - Parcourir les lments d'une collection


Une nouvelle fois, il est possible d'utiliser deux mthodes. La premire consiste en une boucle sur l'index de la collection jusqu'au dernier lment. Voici un exemple :
Dim i As Integer, nbMax As Integer 'Rcupre le nombre de Workspace nbMax = DBEngine.Workspaces.Count - 1 'Boucle sur l'index For i = 0 To nbMax 'Affiche le nom de l'objet MsgBox DBEngine.Workspaces(i).Name Next i

La seconde mthode utilise une boucle For Each In Next pour parcourir un un les objets de la collection. Ainsi :
Dim oWks As DAO.Workspace For Each oWks In DBEngine.Workspaces 'Affiche le nom de l'objet MsgBox oWks.Name Next oWks

Peut tre traduit par :


Pour chaque objet Workspace de la collection Workspaces du DBEngine Afficher le nom de l'objet Fin Pour

Cette dernire mthode possde un avantage dans le cas de collections htrognes. Imaginons une collection d'objets O1 et O2. Pour parcourir uniquement les lments de type O1, nous aurions par exemple :
Dim oTmpObjet as TypeO1 For Each oTmpObjet In MaCollection 'Traitement effectuer Next oTmpObjet

2.2.4 - Ajouter un lment


Les collections DAO sont munies de la mthode Append qui permet d'ajouter un lment. Sa syntaxe est la suivante :
MaCollection.Append MonObjet

Notons tout de mme que pour tre ajout, l'objet doit tre instanci auparavant, sans quoi il sera impossible de l'ajouter. De mme, il est impossible d'ajouter un objet si un autre objet prsent dans la collection possde le mme nom. Vous trouverez de nombreux exemples de la mthode Append dans la suite de ce document.

- 10 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

2.2.5 - Supprimer un lment


La mthode Delete applique aux collections DAO permet de supprimer l'lment dont le nom est pass en paramtre. La syntaxe de cette mthode est la suivante :
MaCollection.Delete "MonItem"

- 11 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

3 - Accder une base de donnes


Ce chapitre est entirement consacr l'ouverture d'une base de donnes. Il vous fournira une liste de l'ensemble des proprits et des mthodes de chaque objet utilis ainsi que plusieurs exemples d'utilisation sous Visual Basic.

3.1 - L'objet DBEngine 3.1.1 - Gnralits


L'objet DBEngine correspond au moteur de base de donnes. Il s'agit d'un composant logiciel qui interprte les requtes que vous lui transmettez et interroge le fichier de base de donnes. Dans la plupart des cas, vous n'aurez jamais l'instancier ni mme le contrler puisque l'objet Access.Application possde une proprit DBEngine renvoyant le moteur de base de donnes actuellement utilis. L'objet DBEngine propose dans ses proprits la liste des espaces de travail (collection Workspaces) ainsi que d'autres proprits relatives la gestion des utilisateurs. Ces proprits n'ont que peu d'intrt dans le cas d'une utilisation normale sans gestion de scurit. Toutefois, le moteur de base de donnes n'est pas oublier puisque c'est lui qui encapsule les mthodes de transactions ainsi que les mthodes de rparation et de compactage de la base de donnes.

3.1.2 - Liste des proprits


Vous trouverez ci-dessous l'ensemble des proprits de l'objet DBEngine.

3.1.2.1 - DefaultPassword
Type : String Il s'agit du mot de passe par dfaut qui sera utilis lors de la cration d'un nouvel objet Workspace.

3.1.2.2 - DelfaultType
Type : Long Cette proprit correspond au type par dfaut des futurs objets Workspace. Les valeurs possibles sont dbUseJet dans le cas d'une utilisation Jet et dbUseODBC dans le cas d'une liaison ODBC direct. Notons que dans ce dernier cas, l'objet Database est remplac par un objet de type Connection.

3.1.2.3 - DefaultUser
Type : String Il s'agit du nom d'utilisateur qui sera utilis par dfaut lors de la cration d'un nouvel objet Workspace. Cette proprit est gnralement utilise en mme temps que DefaultPassword.

3.1.2.4 - Errors
Type : Collection Cette collection regroupe l'ensemble des erreurs leves par le moteur de base de donnes. Une erreur DAO est identifie par un numro d'erreur et possde une description correspondant au message d'erreur. A chaque fois qu'une opration DAO choue,un ou plusieurs objets Error sont crs et ajouts la collections Errors. Une fois
- 12 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

que tous ces objets sont crs, une erreur d'excution est leve par VBA. Cette erreur correspond l'objet Error possdant le numro d'erreur le plus lev. Sous Access, lors d'une erreur DAO, un seul objet Error est cr pour rprsenter l'erreur. L'erreur leve par VBA est donc la mme que celle du moteur de base de donnes. Toutefois, si vous tentez par exemple de vous connecter une base de donnes Oracle via votre application, il se peut qu'Oracle lve plusieurs objets Error reprnsentant la mme erreur. Vous trouverez donc dans la collection DBEngine.Errors : L'ensemble des erreurs Oracle Une erreur Odbc

Mais une seule erreur sera leve par VBA. Le parcours de la collection Errors peut donc vous permettre d'affiner vos routines de gestion d'erreur.

3.1.2.5 - Inipath
Type : String La proprit Inipath correspond au chemin du fichier d'initialisation du moteur de base de donnes. Il s'agit gnralement d'une entre dans la base des registres : HKLM\Software\microsoft\Office\10.0\Access\Jet\4.0 C'est ici que figure de nombreuses options internes au moteur Jet, comme par exemple le chemin du fichier de groupe de travail utilis. Bien qu'importante au moteur de base de donnes, cette proprit reprsente trs peu d'intrt pour le dveloppeur hormis de localiser le chemin o est stock le fichier de groupe de travail.

3.1.2.7 - Properties
Type : Collection Collection regroupant l'ensemble des proprits (Property) de l'objet DBEngine. Pour plus d'informations sur la collection Properties, je vous renvoie vers la section 4.2 Les proprits spcifiques.

3.1.2.8 - SystemDB
Type : String Il s'agit du chemin d'accs au fichier mdw (fichier de groupe de travail) utiliser. Le fichier utilis par dfaut est celui contenu dans l'entre du fichier ini ou de la base de registre spcifie dans la proprit IniPath.

3.1.2.9 - Version
Lecture seule. Type : String La proprit Version correspond la version du moteur Jet. Par exemple : 3.6.

- 13 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

3.1.2.10 - Workspaces
Type : Collection Collection regroupant l'ensemble des espaces de travail (Worspaces(0) tant l'espace de travail par dfaut). Pour de plus amples informations, veuillez consulter le chapitre suivant : L'objet Workspace.

3.1.3 - Liste des mthodes


Je vous propose la liste des mthodes applicables aux objets de la classe DBEngine.

3.1.3.1 - BeginTrans
La mthode BeginTrans commence une transaction. Exemple :
DBEngine.BeginTrans

3.1.3.2 - CommitTrans
La mthode CommitTrans stoppe la transaction tout en enregistrant les donnes. Exemple :
DBEngine.CommitTrans

3.1.3.3 - CompactDatabase
La mthode CompactDatabase copie et compacte une base de donnes. Notons que la base de donnes doit tre ferme pour raliser cette opration. Syntaxe :
DBEngine.CompactDatabase olddb, newdb, [locale], [options], [password]

olddb correspond au fichier source et newdb au fichier de destination (diffrent de olddb). Les autres options concernent essentiellement la langue, la version et le codage utilis. Il s'agit de constantes disponibles dans l'aide Access. Exemple :
DBEngine.CompactDatabase "c:\bd1.mdb", "c:\bd2.mdb"

- 14 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

3.1.3.4 - CreateDatabase
La mthode CreateDatabase permet de crer une nouvelle base de donnes. Elle renvoie un objet de type DAO.Database. Syntaxe :
Set database = DBEngine.CreateDatabase (name, locale, [options])

L'argument name correspond au nom complet de la base de donnes. locale est une constante reprsentant l'ordre de tri appliquer (dbLangGeneral pour la France). Le dernier argument est facultatif et permet de spcifier le codage et la version de la base de donnes. Exemple :
Set db = DBEngine.CreateDatabase("c:\mabase.mdb", dbLangGeneral)

3.1.3.5 - CreateWorkspace
Cette mthode permet de crer un nouvel objet WorkSpace (Espace de travail) et retourne l'objet cr. Syntaxe :
Set workspace = DBEngine.CreateWorkspace(name, user, password, [type])

Name correspond au nom de l'espace de travail. Il permettra de l'identifier de manire unique dans la collection Workspaces. User correspond au nom de l'utilisateur dans cet espace et password son mot de passe (14 caractres au maximum). Ce couple d'authentification doit obligatoirement figurer dans le fichier mdw spcifi dans la proprit SystemDB, sans quoi une erreur sera leve par le moteur de base de donnes. Le dernier argument est facultatif et correspond au type d'espace crer. S'il n'est pas mentionn, ce sera le type figurant dans la proprit DefaultType qui sera utilis. Exemple :
Set Wks = DBEngine.CreateWorkspace("MonEspace", "Toto", "mdp#@#!mJ")

3.1.3.6 - Idle
La mthode Idle donne la possibilit au moteur JET de traiter ses tches en attente. Notons que cette mthode possde un argument facultatif. Si ce dernier est gal dbRefreshCache, la mmoire est ractualise avec uniquement les donnes les plus rcentes en provenance du fichier de base de donnes. Exemple :
DBEngine.Idle

- 15 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

3.1.3.7 - OpenDatabase
Comme son nom l'indique, cette mthode ouvre une base de donnes. Elle renvoie un objet de type DAO.Database. Syntaxe :
Set database = workspace.OpenDatabase (dbname, options, read-only, connect)

Dbname correspond au chemin d'accs de la base de donnes ouvrir. Cet argument peut aussi tre le nom d'une source ODBC. Si cette chane est nulle, et que la variable connect est gale "ODBC;", une boite de dialogue de slection de source de donnes est affiche. L'argument option permet de spcifier si la base de donnes doit tre ouverte en mode exclusif (True) ou pas (False). De plus l'argument read-only ouvre la base de donnes en lecture seule lorsqu'il est gal True. Enfin, l'argument connect est utilis la fois pour spcifier le type de base de donnes et le mot de passe systme utiliser pour ouvrir le fichier. L'objet Database cr est ajout automatiquement l'espace de travail Workspaces(0). Exemple :
Set db = DBEngine.OpenDatabase("c:\bd1.mdb", False, False, _ "MS Access;PWD=mdp#@#!e)

3.1.3.8 - RepairDatabase
La mthode RepairDatabase rpare la base de donnes. Notons qu'elle n'est plus utilise et est rserve pour assurer la compatibilit avec les anciennes versions. Il est recommand d'utiliser la mthode CompactDatabase en remplacement.

3.1.3.9 - Rollback
Cette mthode met fin une transaction dmarre avec BeginTrans. Exemple :
DBEngine.RollBack

3.2 - L'objet Workspace 3.2.1 - Gnralits


Deux types d'espaces de travail sont distinguer :

- 16 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Espace de travail Jet : Zone de travail utilisant le moteur de base de donnes Microsoft Jet pour accder une source de donnes. Cette source de donnes peut prendre la forme d'un fichier de base de donnes Microsoft Jet (.mdb), ODBC, Paradox ou ISAM. Espace de travail ODBC Direct : Il s'agit d'une technique d'accs aux donnes une source ODBC sans passer par le moteur de base de donnes Jet. Seul l'espace de travail Jet sera abord ici. Un objet Workspace reprsente un espace de travail au sein du moteur de base de donnes (DBEngine). Il s'agit en fait d'une session du DBEngine ddie un utilisateur donn. Hormis le cas o vous voulez grer vousmme l'ouverture de la base de donnes dans un environnement scuris, l'utilisation de l'objet Workspace sous Access a peu d'intrt. En effet, l'objet Workspaces(0) du DBEngine est l'espace de travail par dfaut. Il est instanci automatiquement par Access lors d'un appel un objet DAO. Ainsi, en gnral, vous utiliserez une rfrence implicite celui ci, notamment lorsque que vous utiliserez les mthodes CodeDB ou CurrentDB de l'objet Access.Application. Toutefois, tout comme l'objet DBEngine, le Workspace est capable d'excuter des mthodes de transaction, et permet en plus de paramtrer la gestion des curseurs du moteur Jet (Recordset). Son utilisation peut devenir alors primordiale lorsque l'on souhaite paramtrer d'avantage l'accs aux donnes. Comme il a t prcis dans le chapitre prcdent, c'est partir de l'objet DBEngine qu'est cr chaque objet Workspace l'aide de la mthode CreateWorkspace. La mthode CreateWorkspace demande un identifiant unique pour l'objet cr. De plus, la cration de tels objets est trs rare dans le temps. Aussi, il est possible d'utiliser une variable qui contiendra la date de cration de l'objet comme nom de l'objet Workspace instancier. Voici un exemple de cration d'un objet Workspace :
Dim oWks As DAO.Workspace Set oWks = DBEngine.CreateWorkspace(Format(Now(), _ "yyyymmddhhnnss"), "Utilisateur1", "mpd##", dbUseJet)

3.2.2 - Liste des proprits


Vous trouverez ci-dessous la liste des proprits applicables un objet de la classe Workspace.

3.2.2.1 - Databases
Type : Collection Collection regroupant l'ensemble des objets Database ouverts dans l'objet Workspace correspondant.

3.2.2.2 - IsolateODBCTrans
Type : Boolean Si cette proprit est gale False (valeur par dfaut), il est possible d'effectuer plusieurs transactions simultanes sur la mme connexion ODBC. Toutefois, les bases de donnes SQL Server n'acceptent pas ce mode de

- 17 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

fonctionnement, aussi dans le cas de connexion ODBC avec ce type de base de base de donnes, il vous faudra fixer cette proprit True.

3.2.2.3 - Name
Lecture seule. Type : String La proprit Name correspond au nom de l'objet Workspace concern. Ce nom est unique au sein de la collection DBEngine.Workspaces.

3.2.2.4 - Properties
Comme tout autre objet DAO, l'objet Workspace possde cette collection qui regroupe l'ensemble des proprits (Property) de cet objet. De plus amples informations sur la collection Properties sont disponibles dans le chapitre Les proprits spcifiques.

3.2.2.5 - Type
Lecture seule. Type : Long Il s'agit du type de l'espace de travail. Sa valeur est celle que vous avez spcifi la mthode CreateWorkspace du DBEngine. Si vous n'avez pas mentionn cette valeur lors de la cration de l'espace de travail, il s'agit de la valeur de la proprit DefaultType du moteur de base de donnes. L'objet Workspaces(0) tant instanci automatiquement par Access lors d'un appel un objet DAO, la proprit Workspaces(0).Type est donc gale dbUseJet. L'autre valeur disponible est dbUseODBC.

3.2.3 - Liste des mthodes


Voici la liste des mthodes proposes par la classe Workspace. Bon nombre de ces mthodes sont communes la classe DBEngine.

3.2.3.1 - BeginTrans
La mthode BeginTrans commence une transaction. Exemple :
DBEngine.Workspaces(0).BeginTrans

3.2.3.2 - Close
La mthode Close ferme l'espace de travail correspondant. Notez que si vous fermez un objet Workspace, ses transactions en attentes sont dtruite. De mme si cet objet Workspace possde des objets Database ou Connection, ces objets sont aussi ferms, ce qui a pour effet de fermer leurs objets recordsets associs.

- 18 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

La fermeture d'un objet Workspace doit donc tre une action rflchie car elle peut entrainer la perte irrmdiable de donnes. Exemple :
DBEngine.Workspaces(0).BeginTrans

3.2.3.3 - CommitTrans
Cette mthode stoppe une transaction dmare avec BeginTrans tout en enregistrant les donnes. Exemple :
DBEngine.Workspaces(0).CommitTrans

3.2.3.4 - CreateDatabase
La mthode CreateDatabase permet de crer une nouvelle base de donnes. Elle renvoie un objet de type DAO.Database. Syntaxe :
Set database = Workspace.CreateDatabase (name, locale, [options])

L'argument name correspond au nom complet de la base de donnes. locale est une constante reprsentant le tri appliquer (dbLangGeneral pour la France). Le dernier argument est facultatif et permet de spcifier le codage et la version de la base de donnes. Exemple :
Set db = DBEngine.Workspaces(0).CreateDatabase("c:\mabase.mdb", dbLangGeneral)

3.2.3.5 - OpenDatabase
Comme son nom l'indique, la mthode OpenDatabase ouvre une base de donnes. Elle renvoie un objet de type DAO.Database. Syntaxe :
Set database = workspace.OpenDatabase (dbname, options, read-only, connect)

Dbname correspond au chemin d'accs de la base de donnes ouvrir. Cet argument peut aussi tre le nom d'une source ODBC. Si cette chane est nulle, et que la variable connect vaut "ODBC;", une boite de dialogue de slection de source de donnes est affiche. L'argument option permet de spcifier si la base de donnes doit tre ouverte en mode exclusif (True) ou pas (False). De plus l'argument read-only ouvre la base de donnes en lecture seule lorsqu'il vaut True.

- 19 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Enfin, l'argument connect est utilis la fois pour spcifier le type de base de donnes et le mot de passe pour ouvrir le fichier. L'objet database cr est automatiquement ajout la collection Databases de l'objet Workspace aprs sa cration. Exemple :
Set db = DBEngine.Workspaces(0).OpenDatabase("c:\bd1.mdb", False, False, _ "MS Access;PWD=mdp#@#!e")

3.2.3.6 - Rollback
La mthode Rollback met fin une transaction dmarre avec BeginTrans. Exemple :
DBEngine.Workspaces(0).RollBack

3.2.4 - Accder un groupe de travail spcifique


Comme il a t prcis plus haut, l'objet Workspace prend de l'importance lorsqu'il s'agit d'ouvrir une base de donnes scurise. En effet, lorsque que vous ouvrez un fichier mdb avec Access, vous tes authentifi au sein d'un fichier de groupe de travail. Cela peut tre le fichier System.mdw par dfaut si vous n'avez pas implment de gestion de scurit ou bien un fichier de votre cration rassemblant les informations ncessaires la protection de votre base de donnes. Or, il se peut que vous ayez besoin d'accder une autre base de donnes via DAO ncessitant d'utiliser un autre fichier mdw pour se connecter. Dans ce cas, il vous faut instancier un autre objet de type DAO.DBEngine et spcifier le chemin du fichier de groupe de travail utiliser dans la proprit DBEngine.SystemDB. Toutefois, cette mthode possde un inconvnient majeur. En effet, si vous essayez d'instancier un nouvel objet DBEngine alors que vous avez dj utilis des mthodes DAO auparavant dans votre code, il vous sera impossible de modifier la proprit SystemDB du nouvel objet DBEngine cr. Celle-ci conservera pour valeur celle de Application.DBEngine.SystemDB bien qu'aucune erreur ne soit leve lorsque vous tenterez de la modifier. Il est donc impratif que l'instanciation de nouveaux objets DBEngine ait lieu avant tout autre appel DAO y compris les mthodes CodeDb et CurrentDb. Je vous propose la cration d'une interface permettant d'ouvrir une base de donnes Access en spcifiant le fichier mdw utiliser. Soit le formulaire suivant :

- 20 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Il est compos de haut en bas : Une zone de texte TFichier Une liste modifiable ListeSecu Une zone de texte TAdmin Une zone de texte TUser Une zone de texte TMDP

Voici le code correspondant : Code du bouton Valider :


Private Sub Commande10_Click() 'Ouvre le fichier avec la scurit choisie On Error GoTo err Dim strfichier As String Dim oVDb As DAO.Database Dim chaine As String Dim oVWk As DAO.Workspace Dim oDbe As DBEngine Dim strFichierMDW As String If Len(TFichier) <> 0 Then strfichier = TFichier 'prpare l'espace de travail If ListeSecu.ListIndex = 0 Or ListeSecu.ListIndex = 2 Then Set oVWk = Workspaces(0) Else strFichierMDW = OuvrirUnFichier(Me.HWnd, _ "Selectionner un fichier de groupe de travail", 1, _ "Fichier mdw", "mdw") If strFichierMDW = "" Then Exit Sub Else Set oDbe = New DBEngine oDbe.SystemDB = strFichierMDW Set oVWk = oDbe.CreateWorkspace(Format(Now(), _ "yyyymmddhhnnss"), TUtilisateur, TMDP, dbUseJet) End If End If 'Ouvre la base de donnes If ListeSecu.ListIndex = 2 Or ListeSecu.ListIndex = 3 Then Set oVDb = oVWk.OpenDatabase(strfichier, False, False, _ "MS Access;PWD=" & TAdmin) Else Set oVDb = oVWk.OpenDatabase(strfichier) End If Else MsgBox "Vous devez slectionner un fichier", _ - 21 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN vbExclamation, "Saisie du fichier" End If Exit Sub err: MsgBox "Impossible de se connecter la base de donnes. " & _ "Vrifier le chemin d'accs et les informations " & _ "d'authentification", vbCritical, "Erreur" End Sub

Code d'ouverture du formulaire :


Private Sub Form_Load() 'Vide les controles Dim ctlT As Control For Each ctlT In Me.Controls If TypeOf ctlT Is TextBox Then ctlT.Value = "" If ctlT.Name <> "TFichier" Then ctlT.Enabled = False End If Next ctlT ListeSecu = "Aucune" End Sub

Code du bouton parcourir


Private Sub Commande3_Click() Dim strChemin As String strChemin = OuvrirUnFichier(Me.Hwnd, _ "Selectionner une base de donnes Access", _ 1, "Fichiers Access", "mdb") If strChemin <> "" Then Me.TFichier = strChemin End If End Sub

La fonction OuvrirUnFichier est disponible dans la FAQ Access. Elle permet d'afficher une bote de dialogue de slection de fichier. La base de donnes ainsi ouverte est disponible via l'objet : VDB de la procdure du bouton Valider. Cette interface permet la fois de s'authentifier au sein d'un fichier de groupe de travail et de saisir le mot de passe systme pour l'ouverture de l'objet Database. Le choix du fichier de groupe de travail se ralise ici :
Set oDbe = New DBEngine oDbe.SystemDB = strFichierMDW Set VWK = oDbe.CreateWorkspace(Format(Now(), _ "yyyymmddhhnnss"), TUtilisateur, TMDP, dbUseJet)

La premire ligne permet d'instancier le nouveau moteur de base de donnes auquel nous spcifions ensuite le fichier mdw ouvrir. Puis nous crons enfin le l'espace de travail l'aide de la mthode CreateWorkspace. Une des raisons majeures pour lesquelles la cration de l'espace de travail lve une erreur est que le couple utilisateur - mot de passe est invalide dans le fichier mdw slectionn. Il se peut aussi que l'affectation de la proprit SystemDB ait choue, ce qui signifie que le code de votre projet utilise des mthodes DAO avant ce bloc d'instructions. Un moyen simple de le vrifier :

- 22 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN MsgBox oDbe.SystemDB oDbe.SystemDB = FichierMDW MsgBox oDbe.SystemDB

Si les deux MsgBox affichent le mme rsultat, cela indique que votre code utilise des instructions DAO avant cette procdure.

3.3 - L'objet Database

3.3.1 - Gnralits
Comme vous avez pu le remarquer dans la fentre de base de donnes de l'application Access, un fichier mdb peut tre dcompos en deux parties : - La partie applicative. Elle regroupe la fois les formulaires, les tats, les modules et les macros. - La partie donnes. Cette partie se retrouve dans l'ensemble des SGBD (Systme de Gestion de Base de Donnes). Il s'agit des tables et des requtes. Access tant un SGBDR (SGBD Relationnel), cette partie regroupe aussi l'ensemble des relations entre les diffrentes tables. Le modle objet DAO donne accs la partie donnes via son objet Database. Cet objet est la racine du DDL (Langage de dfinition de donnes) et du DML (Langage de manipulation de donnes) sous DAO. C'est partir de ce mme objet Database que l'on va crer les tables, les requtes, les relations et manipuler les donnes (Insert, Update, Delete). Comme il a t crit plus haut, un objet database peut tre instanci depuis un moteur de base de donnes (DBEngine) ou depuis un espace de travail (Workspace) l'aide des mthodes CreateDatabase et OpenDatabase. Ceci peut tre fait de manire explicite :
Dim oDb As DAO.Database Set oDb=DBEngine.CreateDatabase ()

Ou de manire implicite :
Dim oDb As DAO.Database Set oDb=CreateDatabase()

Toutefois, dans la majorit des cas, vous souhaitez utiliser la base de donnes courante ouverte dans Access. Il vous suffit alors d'utiliser les mthodes Application.CurrentDb ou Application.CodeDb.

3.3.1.1 - La mthode CurrentDb


Cette mthode fournie par l'objet Access.Application retourne une variable de type Database correspondant la base de donnes actuellement ouverte dans le logiciel Microsoft Access. La mthode Currentdb cre une nouvelle instance de la base de donnes chaque appel. Aussi, vous devez rcuprer son rsultat dans une variable objet de type Database pour pouvoir l'exploiter. Voici ce qu'il ne faut pas utiliser :
Dim Tbl As DAO.TableDef, Tbl2 As DAO.TableDef Set Tbl = CurrentDb.TableDefs("Table1") - 23 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN Set Tbl2 = CurrentDb.TableDefs("Table2")

En effet, ce code fait un double appel Currentdb ce qui provoque une double instanciation de la base de donnes courante.
Dim Dim Set Set Set Tbl As DAO.TableDef, Tbl2 As DAO.TableDef Db as DAO.Database Db=CurrentDb Tbl = Db.TableDefs("Table1") Tbl2 = Db.TableDefs("Table2")

Ici, une seule instance de l'objet database est utilise. La proprit DBEngine.Workspaces(0).Databases(0) reprsente aussi la base de donnes ouverte. Toutefois, cette mthode est dconseille car elle ne cre pas une nouvelle instance de l'objet Database. Au contraire, son rsultat peut tre considr comme un pointeur vers la base de donnes. Aussi, dans un environnement multi-utilisateurs, ceci peut engendrer des conflits d'accs aux donnes. Privilgiez donc la mthode CurrentDb.

3.3.1.2 - La mthode CodeDb


Contrairement la mthode CurrentDb qui renvoie la base de donnes active, cette mthode retourne un objet Database correspondant la base de donnes qui contient le code en cours d'excution . CodeDb est utiliser lors de la cration de complments ou de base de donnes bibliothques. En effet la base Addin ne sera pas la base active. La mthode CurrentDb ne retournera donc pas le bon objet Database. Tout comme CurrentDb, Codedb retourne une nouvelle instance de l'objet Database. Vous devez donc rcuprer son rsultat dans un objet Database pour pouvoir l'exploiter.
Dim Dim Set Set Set Tbl As DAO.TableDef, Tbl2 As DAO.TableDef Db as DAO.Database Db=CodeDb Tbl = Db.TableDefs("Table1") Tbl2 = Db.TableDefs("Table2")

3.3.2 - Liste des proprits 3.3.2.1 - CollatingOrder


Type : Long Il s'agit de la mthode utilise par le moteur pour comparer les donnes de type texte. Les valeurs possibles sont :

- 24 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Constante dbSortGeneral dbSortArabic dbSortChineseSimplified dbSortChineseTraditional dbSortCyrillic dbSortCzech dbSortDutch dbSortGreek dbSortHebrew dbSortHungarian dbSortIcelandic dbSortJapanese dbSortKorean dbSortNeutral dbSortNorwDan dbSortPDXIntl dbSortPDXNor dbSortPDXSwe dbSortPolish dbSortSlovenian dbSortSpanish dbSortSwedFin dbSortThai dbSortTurkish dbSortUndefined

Signification Gnral (Franais, anglais ...) Arabe Chinois simplifi Chinois traditionnel Russe Tchque Nerlandais Grec Hbreu Hongrois Islandais Japonais Coren Neutre Norvgien et danois Paradox International Paradox norvgien ou danois Paradox sudois ou finnois Polonais Slovne Espagnol Sudois ou finnois Tha Turc Indfini

3.3.2.2 - Connect
Lecture Seule. Type : String La proprit Connect reprsente la chane de connexion utilise l'ouverture de l'objet Database. Lorsque que vous utilisez cette proprit sur une base au format Access, cette proprit est gale "".

3.3.2.3 - Containers
Type : Collection Cette collection regroupe l'ensemble des objets de type container contenu dans la base de donnes. Il s'agit de l'ensemble des objets enregistrs dans la base de donnes. Vous y touverez par exemple des informations sur les formulaires, les tats ... Cette proprit vous est founie titre d'information, en effet, un tutoriel entier pourrait lui tre consacr.

3.3.2.4 - Name
Lecture Seule. Type : String
- 25 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

La proprit Name d'un objet Database retourne le nom de la base de donnes. Pour une base de donnes Access, il s'agit du nom du fichier mdb ainsi que le chemin d'accs complet vers ce fichier.

3.3.2.5 - Properties
Type : Collection Collection regroupant l'ensemble des objets Property de l'objet Database.

3.3.2.6 - QueryDefs
Type : Collection Cette collection regroupe l'ensemble des requtes enregistres dans la base de donnes. Cette partie sera largement dtaille dans la section 4.7 L'objet QueryDef.

3.3.2.7 - RecordsAffected
Lecture Seule. Type : Long La proprit RecordsAffected retourne le nombre d'enregistrements qui ont t affects par le dernier ordre SQL de la mthode Execute. Cela permet de connaitre, par exemple, le nombre de lignes supprimes lors d'une requte Delete. Exemple d'utilisation :
Dim Requete As String Dim DB As DAO.Database Requete = "DELETE FROM MaTable WHERE ChampID>20" Set DB = CurrentDb DB.Execute Requete MsgBox DB.RecordsAffected

3.3.2.8 - Recordsets
Lecture Seule. Type : Collection Cette collection regroupe l'ensemble des objets recordset ouverts dans la base de donnes. Cette partie sera largement dtaille dans le chapitre 5 Accs aux donnes.

3.3.2.9 - Relations
Type : Collection

- 26 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

La proprit Relations est une collection regroupant l'ensemble des relations prsentes dans la base de donnes. Cette collection n'est utile que pour les SGBDR. Cette partie sera largement dtaille dans la section 4.6 L'objet Relation.

3.3.2.10 - TableDefs
Type : Collection Cette collection regroupe l'ensemble des tables enregistres dans la base de donnes. Dans le cas d'une base de donnes incluant des tables lies, il existe aussi un objet TableDef pour chaque table attache. Cette partie sera largement dtaille dans la section : 4.3 L'objet TableDef.

3.3.2.11 - Transactions
Lecture Seule. Type : Boolean La proprit Transactions d'un objet Database indique si l'objet database supporte les transactions. Si oui, la valeur de la proprit est gale True. Dans le cas d'une base de donnes Access, cette valeur est fixe True et les transactions sont disponibles via les objets Recordset Dynaset et Table.

3.3.2.12 - Updatable
Lecture Seule. Type : Boolean Si cette proprit est gale False, la base de donnes est protge en criture et vous ne pouvez modifier ni les donnes, ni la structure.

3.3.2.13 - Version
Lecture Seule. Type : String Cette proprit retourne la version du moteur Jet utilis pour crer la base de donnes. Dans le cas, d'une base de donnes Access au format 2000 ou ultrieur, cette proprit est gale 4.0.

3.3.3 - Liste des mthodes 3.3.3.1 - Close


La mthode Close ferme la base de donnes. Toutefois, cela ne libre pas la mmoire allou l'objet database. Pour librer la mmoire, vous devez affecter Nothing la variable.
- 27 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

3.3.3.2 - CreateProperty
La mthode CreateProperty cre et retourne un objet Property. Syntaxe :
Set property = object.CreateProperty (name, type, value, DDL)

Nous reviendrons plus en dtails sur les objets property dans le chapitre suivant.

3.3.3.3 - CreateQueryDef
La mthode CreateQueryDef cre une nouvelle requte et retourne l'objet QueryDef correspondant. L'objet cr est automatiquement ajout la collection Database.QueryDefs. Syntaxe :
Set querydef = Database.CreateQueryDef (name, sqltext)

L'argument name correspond au nom de la requte crer. Celui ci doit tre unique au sein de la collection QueryDefs. En affectant une chaine vide ("") ce paramtre, vous crez un objet QueryDef temporaire qui ne sera pas ajout la collection QueryDefs. Dans ce cas, l'objet sera dtruit la fin de la procdure. L'argument SQL est une chane de caractres contenant l'instruction SQL de la requte crer. Il peut s'agir de requte de slection, de mise jour, de supression, etc ... Le fonctionnement de l'objet QueryDef est illustr dans le chapitre intitul : L'objet QueryDef

3.3.3.4 - CreateRelation
La mthode CreateRelation cre et retourne un objet Relation. Syntaxe :
Set relation = database.CreateRelation (name, table, foreigntable, attributes)

Nous reviendrons plus en dtails sur les objets Relation dans le chapitre suivant.

3.3.3.5 - CreateTableDef
La mthode CreateTableDef cre et retourne un objet Tabledef. A ce stade, l'objet est seulement cr et n'est pas encore intgr la base de donnes. Pour l'ajouter aux autres tables, vous devrez invoquer la mthode Append de la collection TableDefs. Syntaxe :
Set tabledef = database.CreateTableDef (name, attributes, source, connect) - 28 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

La cration de table sera aborde en dtails dans le chapitre suivant la section 4.3 L'objet TableDef

3.3.3.6 - Execute
Cette mthode execute un ordre SQL. Cette ordre SQL doit tre une requte action (Insert, Update, Delete). Les requtes de slection sont dlgues aux objets Recordset. Une fois l'ordre SQL excut, il est possible de connaitre le nombre d'enregistrements qui ont t affects par cet ordre grce la proprit RecordsAffected. Exemple :
Dim Db as DAO.Database Set Db=CurrentDb Db.Execute ("DELETE FROM MaTable")

3.3.3.7 - NewPassword
La mthode NewPassword permet de modifier le mot de passe systme de la base de donnes. Ne pas confondre le mot de passe systme et le mot de passe utilisateur utilis dans un groupe de travail. Le mot de passe systme est celui dfinit dans le menu Outils/Scurit/ Dfinir le mot de passe de la base de donnes. Exemple :
Dim Db as DAO.Database Set Db=CurrentDb Db.NewPassword "mdpancien","mdpnouveau"

3.3.3.8 - OpenRecordset
La mthode OpenRecordset ouvre et retourne un objet Recordset (Curseur) permettant d'accder aux donnes. L'objet ainsi cr est automatiquement ajout la collection Recordsets. Vous retrouverez cette mthode dans le chapitre 5 Accs aux donnes.

- 29 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

4 - DAO et la structure d'une base de donnes 4.1 - Gnralits


Nous abordons l un point fort de DAO savoir la dfinition des donnes (DDL). En effet, l'objet Database donne accs l'ensemble des tables, des requtes et des relations d'une base de donnes Access. Non seulement il est possible de consulter les diffrents objets mais il est aussi possible de les modifier, d'en ajouter et d'en supprimer. Vous pouvez donc, via votre code VBA, travailler sur la structure de votre fichier comme vous le feriez en mode cration dans l'application Access. L'intrt est bien entendu de pouvoir modifier cette structure sans aucune intervention de l'utilisateur. (Laisser l'utilisateur agir sur les tables directement constitue un rel danger pour votre application). Pour cela, les autres SGBD utilisent gnralement le langage SQL (avec des instructions Create, Alter, Drop ). Access ne dispose pas de tant de possibilits avec son langage SQL. Le recours la programmation VBA devient donc impratif pour raliser certaines oprations. Nous allons donc voir plus loin dans ce chapitre comment travailler sur les tables, les requtes et les relations. Mais, dans un premier temps, nous allons aborder le thme des proprits spcifiques.

4.2 - Les proprits spcifiques

4.2.1 - Dfinitions
DAO est un modle objet. Aussi chaque objet qui le compose possde une liste de proprits dont chacune d'elles correspond un objet Property. Vous vous demandez alors quel est l'intrt de la collection Properties puisque ces proprits sont disponibles sous VBA avec la syntaxe : Objet.Proprit. Certes Visual Basic liste certaines proprits mais il ne les propose pas toutes. Ainsi par exemple, les objets TableDef possdent une proprit Description qui correspond la description de la table. Cette proprit n'est pas liste dans le rcapitulatif des proprits des objets TableDef, le seul moyen de l'atteindre est d'utiliser la collection TableDef.Properties.

Pourquoi certaines proprits ne figurent que dans la collection properties ? Tout d'abord, bon nombre de proprits de la collection Properties ne sont pas cres jusqu' ce qu'une valeur ne leur soit affecte. Ainsi, la proprit description de l'objet TableDef n'existe pas si vous n'avez pas encore saisi la description de la table sous Access.

- 30 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

De plus vous pouvez crer vos propres proprits et les ajouter la collection Properties de l'objet de votre choix. Il devient donc impossible de raliser une liste exhaustive de l'ensemble des proprits d'un objet DAO.

4.2.2 - Liste des proprits d'un objet Property


Chaque objet Property possde lui aussi un ensemble de proprits.

4.2.2.1 - Inherited
Lecture seule. Lorsque cette proprit est gale True, cela signifie que la proprit ne fait pas partie de l'objet mme mais qu'elle est hrite d'un autre objet. Imaginons un objet QueryDef Q1 auquel nous ajoutons une proprit personalise P1. P1 a t cre pour Q1 donc, la proprit P1.Inherited est gale False. Si par la suite nous ouvrons un recordset R1 sur Q1, la proprit P1 se retrouvera dans la collection Properties de R1. P1 sera alors hrite et P1.Inherited sera gale True. Dans ce cas, ces deux expressions seront vrifies :
Q1.Properties("P1").Inherited=False

Et :
R1.Properties("P1").Inherited=True

4.2.2.2 - Name
Cette proprit correspond au nom de la proprit. Celui-ci doit tre unique au sein de la collection Properties de l'objet concern, sans quoi une erreur sera leve lorsque vous tenterez d'ajouter le nouvel objet Property la collection Properties.
- 31 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Utilisez des noms prcis et en relation avec ce que la proprit modlise. De mme viter d'utiliser des mots rservs par Visual Basic. Ainsi, si la proprit reprsente une date de vrification, nommez la DateVerification et non pas simplement Date.

4.2.2.3 - Type
Il s'agit du type de la proprit. Sa valeur doit tre une des constantes suivantes : Constante Valeur Type Numrique (haute prcision) Binaire de longueur fixe (255 octets maxi) Boolen Octet Chane de caractre de longueur fixe Montaire Date/Heure Dcimal Double Rel virgule flottante Identifiant GUID Entier Entier long Binaire longueur variable. (OLE) Mmo Numrique Rel Simple Texte longueur fixe Heure TimeStamp Binaire longueur variable (255 octets maxi)

dbBigInt dbBinary

16 9 1 2 18 5 8 20 7 21 15 3 4 11 12 19 6 10 22 23 17

dbBoolean dbByte dbChar dbCurrency dbDate dbDecimal dbDouble dbFloat dbGUID dbInteger dbLong dbLongBinary dbMemo dbNumeric dbSingle dbText dbTime dbTimeStamp dbVarBinary

4.2.2.4 - Value
Cette proprit correspond la valeur de l'objet Property. Cette valeur doit tre compatible avec le type spcifi dans la proprit Type.

4.2.3 - Accder une proprit


La collection Properties fonctionne comme toute autre collection DAO. Toutefois, ne connaissant pas le contenu de la collection, il parat difficile d'accder un lment via son index dans la collection. Il nous faut donc spcifier le nom de l'lment rechercher. Il se pose alors un autre problme qui est que nous ne savons pas si l'objet Property rechercher existe. En effet, comme nous l'avons vu, par exemple plus haut avec la proprit description des objets Tabledef, celle-ci n'existe que si elle a t initialise auparavant. Ds lors, nous devons vrifier l'existence de la proprit avant d'y accder. Deux mthodes peuvent alors tre utilises. La premire consiste parcourir chacun des objets Property de la collection est de retourner un boolen si l'lment a t trouv.

- 32 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN Public Function ExistProperty(ColTProperties As DAO.Properties, _ strTNom As String) As Boolean Dim oTmpPrp As DAO.Property For Each oTmpPrp In ColTProperties If oTmpPrp.Name = strTNom Then ExistProperty = True Exit For End If Next oTmpPrp End Function

Exemple d'utilisation :
Dim oDb As DAO.Database Dim oTbl As DAO.TableDef Set oDb = CurrentDb Set oTbl = oDb.TableDefs("Commande") MsgBox ExistProperty(oTbl.Properties, "description")

La seconde mthode consiste tenter d'accder la proprit via son nom et de traiter l'erreur si celle-ci n'existe pas.
Public Function ExistProperty(ColTProperties As DAO.Properties, _ strTNom As String) As Boolean On Error GoTo err Dim oTmpPrp As DAO.Property Set oTmpPrp = ColTProperties(strTNom) ExistProperty = True err: End Function

L'utilisation de la fonction reste la mme que celle de la prcdente. Toutefois, la seconde mthode est plus rapide du fait qu'elle n'utilise pas de boucle. Dans le cas o vous n'utiliseriez pas une de ses fonctions et que la proprit n'est pas trouve dans la collection Properties, l'erreur d'excution 3270 (Proprit non trouve) sera leve. Une fois la proprit trouve, il est possible de connatre sa valeur l'aide de la proprit value.
Dim oDb As DAO.Database Dim oTbl As DAO.TableDef Set oDb = CurrentDb Set oTbl = oDb.TableDefs("Commande") If ExistProperty(oTbl.Properties, "description") Then MsgBox oTbl.Properties("description").Value Else MsgBox "Cette proprit n'existe pas" End If oDb.Close Set oDb=Nothing Set oTbl=Nothing

4.2.4 - Modifier la valeur d'une proprit


Pour modifier la valeur d'un objet Property, il faut tout d'abord que celui ci existe. Nous pouvons donc rutiliser une des fonctions cites plus haut. Ensuite, il suffit de modifier la valeur de l'objet Property en utilisant la proprit Value. Cependant, certaines proprits sont en lecture seule. Aussi, l'implmentation d'une gestion d'erreur devient imprative. Voici un exemple de fonction utilisable pour modifier une proprit spcifique d'un objet DAO :
- 33 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Public Function ModifProperty(colTProperties As DAO.Properties, _ strTNom As String, strTValeur As Variant) As Boolean On Error GoTo err Dim oTmpPrp As DAO.Property 'Recherche l'lment Set oTmpPrp = colTProperties(strTNom) 'Modifie la valeur oTmpPrp.Value = strTValeur 'Rafraichit la collection colTProperties.Refresh 'L'opration est termine, renvoyer True ModifProperty = True Exit Function 'Gestion des erreurs err: Select Case err.Number Case 3270 MsgBox "Proprit non trouve" Case 3421 MsgBox "Type de proprit incompatible" Case Else MsgBox "La proprit est en lecture seule" End Select End Function

Utilisation :
Dim oDb As DAO.Database Dim oTbl As DAO.TableDef Set oDb = CurrentDb Set oTbl = oDb.TableDefs("Commande") ModifProperty oTbl.Properties, "description", "essai"

Quelques remarques sur cette fonction : TValeur correspond la nouvelle valeur de la proprit. Le type de cet argument est Variant, pour s'adapter l'ensemble des types possibles. Toutefois, si vous ne souhaitez modifier des proprits exclusivement de type String, vous pouvez remplacer le type Variant par String. La mthode Refresh applique la collection Properties permet de mettre jour immdiatement la proprit. Si cette mthode n'est pas employe, les modifications ne seront effectives qu'aprs avoir redmarr votre application. La fonction renvoie false en cas d'chec de la modification de la proprit. Il est inutile d'utiliser cette fonction pour les proprits non spcifiques. En effet, les proprits proposes par l'explorateur d'objets (F2) sont des proprits intgres que vous pouvez modifier avec la syntaxe habituelle Objet.Proprit. Exemple :
Dim oDb As DAO.Database Dim oTbl As DAO.TableDef Set oDb = CurrentDb Set oTbl = oDb.TableDefs("Commande") oTbl.name= "essai"

- 34 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

4.2.5 - Cration d'une nouvelle proprit


Pour crer une nouvelle proprit, vous devez d'abord vrifier que celle-ci n'existe pas. Ensuite, il suffit d'appliquer la mthode CreateProperty de l'objet concern pour instancier un nouvel objet Property. A ce stade, la proprit est seulement cre, elle n'est pas encore ajoute la liste des proprits de l'objet. Pour l'ajouter, vous devez utilisez la mthode Append de la collection Properties. Voici un exemple qui ajoute une proprit nomme "test" de type Integer la table commande.
Sub ajout() Dim oDb As DAO.Database Dim oTbl As DAO.TableDef Dim oPrp As DAO.Property Set oDb = CurrentDb Set oTbl = oDb.TableDefs("Commande") 'verifie que la proprit n'existe pas If Not ExistProperty(oTbl.Properties, "test") Then 'Cre la nouvelle proprit Set oPrp = oTbl.CreateProperty("test", dbInteger, 0) 'ajoute la proprit oTbl.Properties.Append oPrp 'Rafraichit la liste des proprits oTbl.Properties.Refresh End If 'Libration des objets oDb.Close Set oTbl=Nothing Set oDb=Nothing MsgBox "Proprit ajoute" End Sub

La mthode CreateProperty renvoyant un objet de type Property, ce code peut tre simplifi par :
Sub ajout() Dim oDb As DAO.Database Dim oTbl As DAO.TableDef Set oDb = CurrentDb Set oTbl = Db.TableDefs("Commande") 'Vrifie que la proprit n'existe pas If Not ExistProperty(oTbl.Properties, "Test") Then 'Cre et ajoute la nouvelle proprit oTbl.Properties.Append oTbl.CreateProperty("test", dbInteger, 0) 'Rafrachit la liste des proprits oTbl.Properties.Refresh End If 'Libration des objets oDb.Close Set oTbl=Nothing Set oDb=Nothing MsgBox "Proprit ajoute" End Sub

De mme, plutt que de tester l'existence de la proprit, il est possible de tenter de l'ajouter et de grer l'erreur si une autre proprit portant le mme nom existe dj.
Sub ajout() On Error GoTo err Dim oDb As DAO.Database Dim oTbl As DAO.TableDef Set oDb = CurrentDb Set oTbl = oDb.TableDefs("Commande") 'Cre et ajoute la nouvelle proprit - 35 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN oTbl.Properties.Append oTbl.CreateProperty("test", dbText, 0) 'Rafrachit la liste des proprits oTbl.Properties.Refresh MsgBox "Proprit ajoute" Exit Sub 'Gre les erreurs err: Select Case err.Number Case 3367: MsgBox "La proprit existe dj" Case Else: MsgBox "Une erreur inconnue est survenue" End Select End Sub

4.3 - L'objet TableDef

4.3.1 - Dfinitions
La collection TableDefs de l'objet Database regroupe l'ensemble des tables de la base de donnes. Cette collection inclue aussi les tables systmes et les tables lies. Chaque objet TableDef qui la compose possde une collection d'objets Field (Champ) et une autre d'objets Index. Ces deux autres types d'objet seront tudis plus loin dans ce chapitre. Tout comme c'est le cas en mode cration dans l'application Access, il est impossible de modifier la structure d'une table lie en utilisant DAO.

4.3.2 - Liste des proprits


Ci-dessous figure la liste des proprits appliquables aux objets TableDef. Certaines de ces proprits ne sont disponibles en criture uniquement pour les objets qui n'ont pas encore t ajouts la collections Database.TableDefs.

4.3.2.1 - Attributes
Type : Long La proprit Attributes caractrise la table correspondante. Il s'agit d'une (ou une combinaison) des constantes suivantes : Constante dbAttachExclusive dbAttachSavePWD Signification Utilisable uniquement sur une table lie. Cette valeur indique que la table lie est ouverte en mode exclusif. Utilisable uniquement sur une table lie. Avec cette constante, les informations de Login utilises pour lier la table sont sauvegardes. Indique une table systme. Indique une table cache. Indique une table lie via le moteur Jet. Indique une table lie via ODBC.

dbSystemObject dbHiddenObject dbAttachedTable dbAttachedODBC

- 36 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

4.3.2.2 - Connect
Type : String Il s'agit de la chane de connexion utilise pour une table lie. Sa valeur est nulle pour une table non lie. Cette chaine de connexion prend en compte plusieurs paramtres comme par exemple le nom de l'utilisateur, son mot de passe, etc ... Vous pouvez la consulter visualisant les proprits de votre table en mode cration. Cette proprit est en lecture seule pour les objets TableDef prsents dans la collection Database.TableDefs

4.3.2.3 - DataCreated
Lecture seule. Type : Date La proprit DataCreated renvoie la date de cration de la table.

4.3.2.4 - Fields
Type : Collection Cette collection regroupe l'ensemble des champs de la table. Vous pouvez les modifier, en ajouter et en supprimer.

4.3.2.5 - Indexes
Type : Collection Collection regroupant l'ensemble des index de la table. Vous pouvez les modifier, en ajouter et en supprimer.

4.3.2.6 - LastUpdated
Lecture seule. Type : Date La proprit LastUpdated retourne la date et l'heure de la dernire modification apporte la structure de la table concerne.

4.3.2.7 - Name
Type : String La prorpit Name correspond au nom de la table. Ce nom doit tre unique au sein de la collection TableDefs de l'objet Database. Vous trouverez plus loin dans ce chapitre (section 4.3.4.2) un exemple montrant comment renommer une table dans une base de donnes.

- 37 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

4.3.2.8 - Properties
Type : Collection La prorpit Properties est une collection qui regroupe l'ensemble des objets Property de l'objet TableDef.

4.3.2.9 - RecordCount
Lecture seule. Type : Long La proprit RecordCount renvoie le nombre d'enregistrements de la table.

4.3.2.10 - SourceTableName
Type : String Il s'agit du nom d'origine de la table lie. Si l'objet TableDef n'est pas une table lie, cette proprit est en lecture seule et sa valeur est gale "".

4.3.2.11 - Updatable
Lecture seule. Type : Boolean La proprit de Updatable dfinit si les donnes provenant de la table peuvent tre modifies.

4.3.2.12 - ValidationRule
Type : String La proprit ValidationRule dfinit la rgle de validation qui sera utilise pour valider les donnes lors d'une mise jour (Insert compris). Ainsi, pour obliger l'utilisateur a remplir le champ MonChamp lorsque que le champ Booleen MaCase est coch, nous aurions la rgle suivante :
([MonChamp] IS NOT NULL AND [MaCase]) OR NOT ([MaCase])

4.3.2.13 - ValidationText
Type : String La proprit ValidationText correspond au message qui sera affich lors d'une mise jour si les donnes ne vrifient pas la rgle spcifie dans ValidationRule.

- 38 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

4.3.3 - Liste des mthodes 4.3.3.1 - CreateField


La mthode CreateField cre et retourne un nouvel objet Field qui sera ajouter par la suite la collection Database.Tabledefs. Syntaxe :
Set field = TableDef.CreateField (name, type, size)

Cette mthode sera traite plus en dtail dans la sous partie ddie aux objets Field.

4.3.3.2 - CreateIndex
La mthode CreateIndex cre un nouvel Index dans la table. Cet Index devra ensuite tre ajout la collection Indexes de l'objet TableDef pour prendre effet. Syntaxe :
Set index = tabledef.CreateIndex (name)

4.3.3.3 - CreateProperty
La mthode CreateProperty cre et retourne un nouvel objet Property qu'il vous faudra ensuite ajouter la collection Properties de l'objet TableDef. La syntaxe de la mthode est celle illustre dans la partie : Les proprits spcifiques.

4.3.3.4 - OpenRecordset
La mthode OpenRecordset ouvre un recordset contenant l'ensemble des enregistrements de la table. Syntaxe :
Set recordset = object.OpenRecordset (type, options, lockedits)

4.3.3.5 - RefreshLink
La mthode RefreshLink n'est utilisable que sur des tables lies. Elle permet, aprs avoir modifi la proprit Connect, de rafrachir les informations de connexion entre la table attache et la source de donnes. Syntaxe :
tabledef.RefreshLink

- 39 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

4.3.4 - Oprations sur les tables d'une base de donnes 4.3.4.1 - Lister les tables d'une base de donnes
Je vous propose quelques codes utiles pour lister l'ensemble des tables d'une base de donnes. Nous ferons la distinction entre les tables systmes et les tables lies. En effet, la proprit Attributes est un masque binaire. L'oprateur AND entre une constante recherche et la valeur de la proprit effectue une opration binaire renvoyant un nombre gal 0 si la constante n'est pas utilise dans la proprit. Ainsi, pour savoir si une table est une table systme, il est possible d'utiliser :
If monObjet.Attributes AND dbSystemObjet then .....

Pour lister, l'ensemble des tables systmes, il suffit donc de parcourir un un les lments de la collection TableDefs et de de vrifier si l'expression boolene est vraie ou non.
Sub Lister() Dim oDb As DAO.Database Dim oTbl As DAO.TableDef Set oDb = CurrentDb 'Pour chaque table For Each oTbl In oDb.TableDefs 'Si la table est systme alors afficher son nom If oTbl.Attributes And dbSystemObject Then MsgBox oTbl.Name Next oTbl End Sub

Si nous souhaitons lister les tables lies, nous aurons :


Sub Lister() Dim oDb As DAO.Database Dim oTbl As DAO.TableDef Set oDb = CurrentDb 'Pour chaque table For Each oTbl In oDb.TableDefs 'Si la table est lie alors afficher son nom If oTbl.Attributes And dbAttachedTable Then MsgBox oTbl.Name Next oTbl End Sub

Pour runir les deux listes, il suffit d'utiliser l'oprateur logique OR (Ou). Ainsi, le code suivant affichera les tables systmes ainsi que les tables lies.
Sub Lister() Dim oDb As DAO.Database Dim oTbl As DAO.TableDef Set oDb = CurrentDb 'Pour chaque table For Each oTbl In oDb.TableDefs 'Si la table est lie ou systme alors afficher son nom If oTbl.Attributes And (dbAttachedTable Or dbSystemObject) Then MsgBox oTbl.Name Next oTbl End Sub

Ce code n'est pas confondre avec :


Sub Lister() - 40 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN Dim oDb As DAO.Database Dim oTbl As DAO.TableDef Set oDb = CurrentDb 'Pour chaque table For Each oTbl In oDb.TableDefs 'Si la table est lie et systme alors afficher son nom If oTbl.Attributes And (dbAttachedTable And dbSystemObject) Then MsgBox oTbl.Name Next oTbl End Sub

En effet ce dernier liste les tables qui sont la fois systmes et lies.

4.3.4.2 - Renommer une table


Renommer une table est une opration extrmement simple. Toutefois, il ne faut pas oublier que le nom de la table doit tre unique. Aussi, il faudra implmenter une gestion d'erreur lors d'une telle opration. Les objets Relations dpendants de la table renommes sont automatiquement mis jour par le moteur Jet.
Private Function RenommerTable(oBaseDeDonnees As DAO.Database, strAncienNom As String, _ strNouveauNom As String) As Boolean On Error GoTo err Dim oTbl As DAO.TableDef 'Cherche la table modifier Set oTbl = oBaseDeDonnees.TableDefs(strAncienNom) 'Renomme la table oTbl.Name = strNouveauNom 'Rafrachit la collection oBaseDeDonnees.TableDefs.Refresh 'Renvoie true RenommerTable = True Exit Function err: Select Case err.Number Case 3265: MsgBox "Impossible de trouver la table renommer" Case 3010: MsgBox "La table " & strNouveauNom & " existe dj" Case Else: MsgBox "Une erreur inattendue est survenue" End Select End Function

Utilisation :
Dim oDb As DAO.Database Dim oTbl As DAO.TableDef Set oDb = CurrentDb If RenommerTable(oDb, "Commande", "Commande_Archive") Then MsgBox "Table renomme avec succs" End if

4.3.4.3 - Supprimer une table


La suppression d'une table ncessite quelques prcautions. Hormis le fait que la table doit exister pour tre supprimer, il ne faut pas perdre de vue que la suppression d'une table engendre la suppression des relations qui en dpendent. Aussi dans le cas d'une mauvaise manipulation, vous risquez de supprimer des objets Relations sans vous en rendre compte. Dans ce cas, je prconise d'envoyer un message l'utilisateur lui demandant confirmation. Il nous faut donc savoir si la table fait partie d'un objet relation ou non. Pour cela, nous utiliserons la fonction ExistRelation suivante :

- 41 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Private Function ExistRelation(oBaseDeDonnees As DAO.Database, _ strNomTable As String) As Integer Dim oRlt As DAO.Relation 'Pour chaque objet relation For Each oRlt In oBaseDeDonnees.Relations 'Si la table est prsente dans la relation If oRlt.Table = strNomTable Or oRlt.ForeignTable = strNomTable Then _ ExistRelation = ExistRelation + 1 Next oRlt End Function

Cette fonction renvoie le nombre de relations dpendantes de la table passe en paramtre. Nous pouvons donc crire la fonction de suppression de table suivante :
Private Function SupprimerTable(oBaseDeDonnee As DAO.Database, _ strNomTable As String) On Error GoTo err Dim intNbRlt As Integer 'Compte le nombre de relations dpendantes intNbRlt = ExistRelation(oBaseDeDonnee, strNomTable) 'Si la table est prsente dans au moins une relation If NbRlt <> 0 Then 'si l'utilisateur ne souhaite pas continuer, sortir de la fonction If MsgBox("La table " & strNomTable & " est utilise dans " & _ intNbRlt & " relation(s)." & vbCrLf & "La suppression de cette table entrainera la" & _ " suppression de cette(ces) relation(s)." & vbCrLf & vbCrLf & "Voulez vous continuer ?", _ vbQuestion + vbYesNo, "Suppression de table") = vbNo Then Exit Function End If 'Supprime la table oBaseDeDonnee.TableDefs.Delete (strNomTable) 'Rafraichit la collection oBaseDeDonnee.TableDefs.Refresh 'Renvoie true SupprimerTable = True Exit Function err: 'Gre les erreurs Select Case err.Number Case 3265: MsgBox "Impossible de trouver la table supprimer" Case Else: MsgBox "Une erreur inattendue est survenue" End Select End Function

Utilisation :
Dim oDb As DAO.Database Dim oTbl As DAO.TableDef Set oDb = CurrentDb If SupprimerTable(oDb, "Commande") Then MsgBox "Table supprime" End If

4.3.4.4 - Crer une nouvelle table


La cration d'une table n'ayant que peu d'intret sans la cration de champs, je vous propose d'aborder avant les parties concernant les champs et les index puis de revenir ensuite sur cet exemple. Dans cet exemple, nous allons crer une table nomme Client possdant trois champs : IDClient Cl primaire. Type : Long, numro automatique

- 42 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

NomClient Type : Texte. Longueur : 15 PrenomClient Type : Texte. Longueur : 25

Voici le code correspondant :


Sub CreerTable() Dim oDb As DAO.Database Dim oNouvelleTable As DAO.TableDef Dim oChamp As DAO.Field Dim oIndex As DAO.Index 'Instancie la base de donnes Set oDb = CurrentDb 'Cre la nouvelle table Set oNouvelleTable = oDb.CreateTableDef("Clients") 'Cre le champ IDClient Set oChamp = oNouvelleTable.CreateField("IDClient", dbLong) 'Dfinit le champ en numero_auto oChamp.Attributes = dbAutoIncrField 'Ajoute le champ la table oNouvelleTable.Fields.Append oChamp 'Cre le champ nomClient et l'ajoute oNouvelleTable.Fields.Append oNouvelleTable.CreateField("NomClient", _ dbText, 15) 'Cre le champ PrenomClient et l'ajoute oNouvelleTable.Fields.Append oNouvelleTable.CreateField("PrenomClient", _ dbText, 25) 'dfinit la cl primaire sur l'IDClient Set oIndex = oNouvelleTable.CreateIndex("PK_IDClient") oIndex.Primary = True oIndex.Fields.Append oIndex.CreateField("IdClient") 'Ajoute l'index la table oNouvelleTable.Indexes.Append oIndex 'Ajoute la table la base de donnes oDb.TableDefs.Append oNouvelleTable 'Libre les variables oDb.Close Set oIndex = Nothing Set oChamp = Nothing Set oNouvelleTable = Nothing Set oDb = Nothing End Sub

4.4 - L'objet Field

4.4.1 - Dfinition
Un objet Field reprsente un champ d'une table ou d'une requte dans une base de donnes. DAO offre de nombreuses possibilits concernant les objets Field. Il est ainsi possible de crer des champs, d'en supprimer et de les modifier aussi simplement que vous le feriez dans le mode cration d'Access. En effet, il existe une relle analogie entre la liste des proprits des objets Field et la fentre de modification de la structure d'une table. Chaque zone de texte de cette fentre correspond une proprit de l'objet Field. Je vous propose tout d'abord d'effectuer un tour d'horizon de l'ensemble des proprits et des mthodes de cet objet, avant de revenir sur des exemples plus spcifiques.

4.4.2 - Liste des proprits


Vous retrouverez ci-dessous l'ensemble des proprits des objets Field dans la liste suivante.

- 43 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Certaines de ces proprits ne sont disponibles en criture uniquement pour les objets qui n'ont pas encore t ajouts la collections TableDef.Fields.

4.4.2.1 - AllowZeroLength
Type : Boolean La proprit AllowZeroLength indique si un champ texte accepte les chaines vides. Si la valeur de cette proprit est gale True, ces valeurs sont acceptes. Dans le cas chant, une erreur sera leve lorsque que vous tenterez de mettre jour les donnes.

4.4.2.2 - Attributes
Type : Long La proprit Attributes dfinit les options du champ. Il s'agit d'une une (ou une combinaison) des constantes suivantes : Constante Signification Correspond un champ de type Numro Auto. A n'utiliser que sur les champs de type numrique. Dans le cas o le champ fait parti d'un index, cette valeur permet d'inverser l'ordre de tri. Champ de taille fixe. Valeur par dfaut des champs de type numrique. Gre les liens hypertext dans un champs mmo. Le champ stocke des informations de duplication pour les duplicatas. Un tel champ ne peut tre supprim. Le valeur du champ peut tre modifie. Le champ peut tre modifi. A n'utiliser que sur les champs de type texte.

dbAutoIncrField dbDescending dbFixedField dbHyperlinkField dbSystemField

dbUpdatableField dbVariableField

4.4.2.3 - CollatingOrder
Type : Long Il s'agit de la mthode utilise par le moteur pour comparer les valeurs du champ si celui-ci est de type texte. Les valeurs possibles sont :

- 44 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Constante dbSortGeneral dbSortArabic dbSortChineseSimplified dbSortChineseTraditional dbSortCyrillic dbSortCzech dbSortDutch dbSortGreek dbSortHebrew dbSortHungarian dbSortIcelandic dbSortJapanese dbSortKorean dbSortNeutral dbSortNorwDan dbSortPDXIntl dbSortPDXNor dbSortPDXSwe dbSortPolish dbSortSlovenian dbSortSpanish dbSortSwedFin dbSortThai dbSortTurkish dbSortUndefined

Signification Gnral (Franais, anglais ...) Arabe Chinois simplifi Chinois traditionnel Russe Tchque Nerlandais Grec Hbreu Hongrois Islandais Japonais Coren Neutre Norvgien et danois Paradox International Paradox norvgien ou danois Paradox sudois ou finnois Polonais Slovne Espagnol Sudois ou finnois Tha Turc Indfini

4.4.2.4 - DataUpdatable
Lecture seule. Type : Boolean Lorsque la proprit DataUpdatable est gale False, il vous est impossible de modifier les valeurs de ce champ. C'est notamment le cas d'un champ auto-incrment.

4.4.2.5 - DefaultValue
Type : Variant Cette proprit correspond la valeur par dfaut du champ. Elle est en lecture/criture pour les champs issus de TableDef et en lecture seule pour ceux issus de QueryDef et Recordset. Elle n'est pas prise en charge par les objets Fields des collections Database.Indexes et Database.Relations. Pour un champ de type Long vous pouvez attribuer cette proprit la valeur : GenUniqueID(). Ainsi chaque nouvel enregistrement ajout, le moteur Jet attribue une valeur unique et alatoire au nouvel enregistrement. Cette valeur reproduit le comportement d'une numrotation automatique alatoire.

4.4.2.6 - FieldSize
Lecture seule.
- 45 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Type : Long La proprit FieldSize, correspond la taille utilise dans la base par un champ de type binaire ou mmo. Cette valeur est exprime en nombre de caractres pour un champ mmo et en nombre d'octet pour un champ de type binaire.

4.4.2.7 - ForeignName
Type : String La proprit ForeignName n'est utiliser que pour les champs d'un objet de type Relation. Elle dfinit le nom du champ dans la table externe de la relation (cl trangre). Cette proprit est en lecture/criture dans le cas d'objets Relation non ajouts la collection Database.Relations et en lecture seule pour les objets dj prsents au sein de cette mme collection.

4.4.2.8 - Name
Type : String Il s'agit du nom du champ. Le nom d'un champ doit tre unique au sein d'une table.

4.4.2.9 - OrdinalPosition
Type : Integer La proprit OrdinalPosition permet de dfinir la position du champ dans la collection Fields de l'objet TableDef. Le premier lment possde la position 0. Cette position conditionne l'ordre d'apparition des champs dans une requte SELECT * FROM ... Notons que si deux champs possdent la mme valeur pour la proprit OrdinalPosition, ces champs sont alors classs par ordre alphabtique. Cette proprit est en lecture seule pour les objets QueryDef.

4.4.2.10 - Properties
Type : Collection Collection regroupant l'ensemble des objets Property de l'objet Field.

4.4.2.11 - Required
Type : Boolean La proprit Required indique si le champs accepte les valeurs nulles. Si cette proprit est gale True, une erreur sera leve si vous tentez d'affecter une valeur nulle ce champ.

4.4.2.12 - Size
Type : Integer La proprit Size dfinit la taille du champ comme vous pouvez le faire en mode cration. Cette proprit n'est en lecture criture que pour les objets Field qui n'ont pas encore t ajouts la collection Fields.

- 46 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

4.4.2.13 - SourceField
Lecture seule. Type : String Cette proprit en lecture seule indique dans un objet QueryDef le nom d'un champ et non son alias. Soit une requte nomme R01 :
SELECT NomClient as LeNom FROM Client

Le code suivant affichera LeNom :


Dim oDb As DAO.Database Dim oQR As DAO.QueryDef Set oDb = CurrentDb Set oQR = oDb.QueryDefs("R01") MsgBox oQR.Fields(0).Name

Cet autre code affichera NomClient :


Dim oDb As DAO.Database Dim oQR As DAO.QueryDef Set oDb = CurrentDb Set oQR = oDb.QueryDefs("R01") MsgBox oQR.Fields(0).SourceField

Nous pouvons donc crire la fonction suivante qui retourne le nom d'un champ en fonction de son alias :
Function NomChamp(oBaseDeDonnee As DAO.Database, strRequete As String, strAlias As String) As String On Error GoTo err Dim Qdf As DAO.QueryDef Set Qdf = oBaseDeDonnee.QueryDefs(strRequete) NomChamp = Qdf.Fields(strAlias).SourceField Exit Function 'Gre les erreurs err: Select Case err.Number Case 3265 'Si qdf est vide alors la requete n'existe pas If Qdf Is Nothing Then MsgBox "Impossible de trouver la requte " & strRequete Else MsgBox "Impossible de trouver le champ " & strAlias & " dans la requete " & _ strRequete End If Case Else: MsgBox "Une erreur inattendue est survenue" End Select End Function

Utilisation :
Dim oDb As DAO.Database Set oDb = CurrentDb MsgBox NomChamp(oDb, "R01", "LeClient")

- 47 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

4.4.2.14 - SourceTable
Lecture seule. Type : String Cette proprit repose sur le mme principe que la prcdente. Elle permet de savoir de quelle table provient un champ d'une requte. Ainsi, avec l'exemple prcdent, voici comment connatre la table d'origine du champ LeClient :
Dim oDb As DAO.Database Dim oQR As DAO.QueryDef Set oDb = CurrentDb Set oQR = oDb.QueryDefs("R01") MsgBox oQR.Fields(0).SourceTable

4.4.2.15 - Type
Type : Integer Cette proprit dfinit le type du champ. Il s'agit d'une des constantes suivantes : Constante Valeur Type Numrique (haute prcision) Binaire de longueur fixe (255 octets maxi) Boolen Octet Chane de caractre de longueur fixe Montaire Date/Heure Dcimal Double Rel virgule flottante Identifiant GUID Entier Entier long Binaire longueur variable. (OLE) Mmo Numrique Rel Simple Texte longueur fixe Heure TimeStamp Binaire longueur variable (255 octets maxi)

dbBigInt dbBinary

16 9 1 2 18 5 8 20 7 21 15 3 4 11 12 19 6 10 22 23 17

dbBoolean dbByte dbChar dbCurrency dbDate dbDecimal dbDouble dbFloat dbGUID dbInteger dbLong dbLongBinary dbMemo dbNumeric dbSingle dbText dbTime dbTimeStamp dbVarBinary

- 48 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

4.4.2.16 - ValidationRule
Type : String La proprit ValidationRule dfinit la rgle de validation qui sera utilise pour valider les donnes lors d'une mise jour (Insert compris).

4.4.2.17 - ValidationText
Type : String La proprit ValidationText correspond au message qui sera affich lors d'une mise jour si les donnes ne vrifient pas la rgle spcifie dans ValidationRule.

4.4.2.18 - Value
Type : Variant Pour un objet Recordset, la proprit Value retourne la valeur du champ pour l'enregistrement courant.

4.4.2.19 - VisibleValue
Type : Variant Cette proprit est utilisable uniquement dans un environnement ODBCDirect. Elle renvoit la valeur actuelle d'un champ lors d'un traitement par lot. Cette valeur est donc plus rcente que celle retourne par la proprit OriginalValue

4.4.3 - Liste des mthodes 4.4.3.1 - AppendChunk


La mthode AppendChuk permet d'ajouter des donnes la fin d'un champ de type mmo ou binaire. (Collection Recordsets exclusivement) Elle vite notamment de lire le dbut du champ, de concatner et de renvoyer la nouvelle valeur. En utilisant la mthode AppendChunk, vous limiter donc le traffic d'informations entre la base de donnes et le moteur Jet. Syntaxe :
field.AppendChunk source

L'argument source est de type Variant.

4.4.3.2 - CreateProperty
La mthode CreateProperty cre et retourne un nouvel objet Property qu'il vous faudra ensuite ajouter la collection Properties de l'objet Field. La syntaxe de la mthode est celle illustre dans la partie : Les proprits spcifiques.

- 49 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

4.4.3.3 - GetChunk
La mthode GetChunk s'applique aux champs des objets Recordset. Elle renvoie le contenu (ou une partie) d'un champ mmo ou binaire dans une variable de type String. Syntaxe :
Set variable = field.GetChunk (offset, numbytes)

Le paramtre offset de type Long correspond la position du caractre (ou de l'octet) partir duquel doit commencer la lecture. L'argument numbytes dtermine le nombre de caractres (ou d'octet) lire.

4.4.4 - Oprations sur les champs d'un objet TableDef


Seul l'objet TableDef permet de modifier les lments de sa collection Field. Je vous propose plusieurs exemples afin d'illustrer l'tendue des possibilits qu'offre DAO.

4.4.4.1 - Renommer un champ


Tout comme c'tait dj le cas avec les tables, cette opration ncessite que le nouveau nom soit unique dans la collection Fields de l'objet TableDef. Les objets Relation et Index utilisant ce champ sont automatiquement mis jour par le moteur Jet.
Private Function RenommerChamp(oBaseDeDonnees As DAO.Database, strNomTable As String, _ strAncienNomChamp As String, strNouveauNomChamp As String) As Boolean On Error GoTo err Dim Tbl As DAO.TableDef 'Rcupre la table Set Tbl = oBaseDeDonnees.TableDefs(strNomTable) 'Renomme le champ Tbl.Fields(strAncienNomChamp).Name = strNouveauNomChamp 'Renvoie True RenommerChamp = True 'Gre les erreurs Exit Function err: Select Case err.Number 'Si impossible de trouver l'lment dans la collection Case 3265 'Si tbl=nothing alors tbl est la cause de l'erreur If Tbl Is Nothing Then MsgBox "Impossible de trouver la table : " & strNomTable Else MsgBox "Impossible de trouver le champ : " & strAncienNomChamp End If Case 3010, 3191: MsgBox "Le champ " & strNouveauNomChamp & " existe dj" Case Else: MsgBox "Une erreur inattendue est survenue" End Select End Function

Utilisation :

- 50 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Dim oDb As DAO.Database Set oDb = CurrentDb If RenommerChamp (oDb, "Commande", "Reference", "Nouvelle_Reference") then msgbox "Opration termine" End if

4.4.4.2 - Supprimer un champ


La suppression d'un champ est trs dlicate. En effet, plusieurs erreurs peuvent tre leves au cours de cette opration : 3265 : Le champ n'existe pas 3280 : Le champ est utilis par un index 3303 : Le champ est utilis dans une ou plusieurs relations

L'erreur 3303 est difficile maitriser car mme si l'erreur est leve, le champ est quand mme supprim. Toutefois les relations sont toujours prsentes et si vous rajoutez par la suite le champ supprim, la relation va "renatre", ce qui provoque un comportement inattendu. Il nous faut donc savoir si le champ est l'objet de relations.
Private Function ChampDansRelation(oBaseDeDonnees As DAO.Database, _ strNomTable As String, strNomChamp As String) As Integer On Error GoTo err Dim bolUtilise As Boolean Dim oRlt As DAO.Relation Dim oFld As DAO.Field 'Parcours les relations For Each oRlt In oBaseDeDonnees.Relations bolUtilise = False If oRlt.Table = strNomTable Then 'Pour chaque champ, contrle le nom du champ For Each oFld In oRlt.Fields If oFld.Name = strNomChamp Then bolUtilise = True Next oFld ElseIf oRlt.ForeignTable = strNomTable Then 'pour chaque champ, contrle le nom tranger For Each oFld In oRlt.Fields If oFld.ForeignName = strNomChamp Then bolUtilise = True Next oFld End If 'Si la relation utilise le champ, on incremente le resultat If bolUtilise Then ChampDansRelation = ChampDansRelation + 1 Next oRlt Exit Function err: ChampDansRelation = -1 End Function

Cette fonction renvoie le nombre de relations qui utilisent le champ pass en paramtre. Utilisation :
Dim oDb as DAO.Database Set oDb=CurrentDB MsgBox ChampDansRelation(oDb, "Commande", "Reference")

Cet exemple affichera le nombre de relations utilisant le champ Reference de la table Commande.

- 51 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

La fonction retourne -1 si une erreur est survenue. Nous pouvons donc crire la fonction de suppression suivante :
Private Function SupprimerChamp(oBaseDeDonnees As DAO.Database, strNomTable As String, _ strNomChampASupprimer As String) As Boolean On Error GoTo err Dim oTbl As DAO.TableDef 'Verifie que le champ ne fait pas partie d'une relation If ChampDansRelation(oBaseDeDonnees, strNomTable, strNomChampASupprimer) = 0 Then 'Rcupre la table Set oTbl = oBaseDeDonnees.TableDefs(strNomTable) 'Supprime le champ oTbl.Fields.Delete (strNomChampASupprimer) 'Renvoie True SupprimerChamp = True Else MsgBox "Impossible de supprimer le champ, il est utilis par une ou plusieurs relations" End If Exit Function err: Select Case err.Number 'Si impossible de trouver l'lment dans la collection Case 3265 'Si tbl=nothing alors tbl est la cause de l'erreur If Tbl Is Nothing Then MsgBox "Impossible de trouver la table : " & strNomTable Else MsgBox "Impossible de trouver le champ : " & strNomChampASupprimer End If Case 3280: MsgBox "Impossible de supprimer un champ utilis par un index" Case Else: MsgBox "Une erreur inattendue est survenue" End Select End Function

Utilisation :
SupprimerChamp oDb, "Commande", "Reference"

4.4.4.3 - Crer un champ


La cration d'un champ se dcompose en trois tapes :

Un exemple sera certainement plus parlant que de longues phrases, je vous propose de crer un champ AdresseClient dans une table nomme Client.
- 52 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Ce champ aura pour cractristiques : Type : Texte Longueur : 120 caractres Chaine vide autorise : Non Null interdit : Oui
Dim oDb As DAO.Database Dim oTbl As DAO.TableDef Dim oFld As DAO.Field Set oDb = CurrentDb Set oTbl = oDb.TableDefs("Client") 'Etape 1 : Crer le champ Set oFld = oTbl.CreateField("AdresseClient", dbText, 120) 'Etape 2 : Dfinit les proprits oFld.AllowZeroLength = False 'Chaine vide autorise : Non oFld.Required = True 'Null interdit : Oui 'Etape 3 : Ajout du champ la table oTbl.Fields.Append Fld 'Rafraichit la collection oTbl.Fields.Refresh

Il est important de respecter l'ordre de chaque tape. Si vous ajouter le champ la collection Fields avant de lui avoir affecter l'ensemble de ses proprits, vous vous apercevrez que certaines de ces proprits ne sont plus accessibles en criture. Nous n'avons pas trait ici la gestion d'erreur. Celle ci exactement la mme que pour la fonction qui renomme un champ. En effet, le plus grand risque pour ce programme est d'utiliser un nom de champ qui existe dj.

4.4.4.4 - Dupliquer un champ


Je vous propose ici un code qui peut s'avrer utile lorsque vous souhaiter crer un champ identique un autre. Le principe est simple, nous partons de deux objets Field. Le premier sera utilis comme source du clonage. Nous allons donc parcourir chaque proprit (excepte la proprit Name) du champ source et les rcrire dans le champ de destination. Certaines de ces proprits risquent d'tre en lecture seule. Il nous faut donc dleguer la lecture et l'criture des proprits une autre procdure afin de ne pas faire stopper le programme la premire erreur rencontre.
Public Sub CloneChamp(oFldSource As DAO.Field, oTableDestination As DAO.TableDef, _ strNouveauNom As String) On Error GoTo err Dim oFld As DAO.Field Dim oPrp As DAO.Property 'Cre le champ Set oFld = oTableDestination.CreateField(strNouveauNom) 'Pour chaque propriete For Each oPrp In oFldSource.Properties 'copier la proprit s'il ne s'agit pas du nom If oPrp.Name <> "Name" Then _ EcrirePropriete oPrp, oFld Next oPrp 'Ajoute le champ oTableDestination.Fields.Append oFld Exit Sub err: Select Case err.Number Case 3010, 3191: MsgBox "Le champ " & strNouveauNom & " existe dj"

- 53 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN Case Else: MsgBox "Une erreur inattendue est survenue" End Select End Sub Private Sub EcrirePropriete(oPropriete As DAO.Property, _ oChampDestination As DAO.Field) On Error GoTo err 'Copie la proprit With oChampDestination.Properties .Item(oPropriete.Name) = oPropriete.Value .Refresh End With 'On ne traite pas les erreurs err: End Sub

Pour dupliquer le champ AdresseClient de la table Client dans la table SauvegardeClient nous utiliserons :
Dim oDb As DAO.Database Dim oTblSource As DAO.TableDef, oTblDestination As DAO.TableDef Dim oFld As DAO.Field Set oDb = CurrentDb 'Stocke les deux tables Set oTblSource = oDb.TableDefs("Client") Set oTblDestination = oDb.TableDefs("SauvegardeClient") 'Stocke le champ Set oFld = oTblSource.Fields("AdresseClient") 'Clone le champ CloneChamp oFld, oTblDestination, "AdresseClient2"

4.5 - L'objet Index

4.5.1 - Dfinitions
Nous n'allons pas reprendre ici la dfinition d'un index. Je vous renvoie pour cela vers d'autres tutoriels de ce site. Toutefois, rappelons sommairement qu'un index permet de faciliter l'accs aux donnes dans une table lors d'une recherche et qu'il permet aussi de poser des contraintes sur les donnes (Notion de cl primaire et de doublons). Un index peut tre compos d'un ou plusieurs champs, il possde donc une collection Fields recensant ces champs.

4.5.2 - Liste des proprits 4.5.2.1 - DistinctCount


Lecture seule. Type : Long La proprit DistinctCount renvoie le nombre de valeurs uniques prsentes dans la table. Dans le cas d'un index mono-champ, il s'agit du nombre de valeurs distinctes dans ce champ (quivalent d'une requte SELECT DISTINCT MonChamp ...). Dans le cas d'un index compos de plusieurs champs, cette valeur correspond au nombre de combinaisons distinctes des valeurs de ces champs au sein de la table (quivalent d'une requte SELECT DISTINCT MonChamp1,MonChamp2 ...).

- 54 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

4.5.2.2 - Fields
Type : Collection Cette collection regroupe l'ensemble des champs composant l'index. Chaque objet Field de cette collection doit possder le mme nom qu'un objet Field de la table concerne.

4.5.2.3 - Foreign
Lecture seule. Type : Boolean Lorsque la proprit Foreign d'un index est gale True, cela signifie que l'index est une cl trangre. C'est notamment le cas pour les index ajouts automatiquement par Access lorsque vous crez des relations entre les tables.

4.5.2.4 - IgnoreNulls
Type : Boolean Si vous dfinissez la proprit IgnoreNulls True, les valeurs nulles ne seront pas indxes. Cela peut tre utile si vous prvoyer d'enregistrer un grand nombre de valeur nulles.

4.5.2.5 - Name
Type : String Cette proprit correspond au nom de l'index. Ce nom doit tre unique dans la collection Indexes de l'objet TableDef correspondant. Prvoyez des noms d'index aussi clairs que possible. Aussi certains prfixent le nom de leurs index par les initiales de leur rle. Ainsi, une cl primaire sera note PK_MonChamp (PK = Primary Key).

4.5.2.6 - Properties
Type : Collection Collection regroupant l'ensemble des objets Property de l'objet Index.

4.5.2.7 - Required
Type : Boolean Si la proprit Required est gale True, cela signifie que les champs de l'index doivent tous recevoir une valeur, sans quoi, lors des mises jour, une erreur sera leve.

- 55 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

4.5.2.8 - Unique
Type : Boolean Lorsque la proprit Unique est gale True, les doublons sont interdits dans les champs de l'index. Dans un index multi-colonnes, les valeurs A A et A B ne sont pas des doublons.

4.5.3 - Liste des mthodes


Comme vous allez le remarquer, l'objet Index dispose de trs peu de mthodes. Qui plus est, ces mthodes ont dj t traites plus haut.

4.5.3.1 - CreateField
Cette mthode est la mme que celle applique aux objets TableDef, la diffrence prs quelle ne propose qu'un seul paramtre : le nom du champ. Ce nom doit tre identique celui du champ de la table sur lequel repose l'index. Syntaxe :
Set field = index.CreateField (name)

4.5.3.2 - CreateProperty
Cette mthode n'est plus prsenter, et pour cause, nous la retrouvons chaque chapitre de ce tutoriel. Aussi, je vous renvoie vers le chapitre des 4.2.5 Proprits spcifiques.

4.5.4 - Oprations sur les Index


Je vous propose deux petits exemples afin de mettre en pratique les notions abordes dans cette partie.

4.5.4.1 - Crer un index


Soit une table Client possdant plusieurs champs dont NumeroClient. Nous allons crer une cl primaire sur ce champ.
Dim oDb As DAO.Database Dim oTbl As DAO.TableDef Dim oFld As DAO.Field Dim oInd As DAO.Index 'Instancie la base Set oDb = CurrentDb 'Instancie la table Set oTbl = oDb.TableDefs("Client") 'Cre l'index en le nommant PK_Client Set oInd = oTbl.CreateIndex("PK_Client") 'Cree le champs dans l'index Set oFld = oInd.CreateField("NumeroClient") 'Ajoute le champ la collection Fields oInd.Fields.Append oFld 'Dfinit la cl primaire oInd.Primary = True 'Ajoute l'index la table - 56 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN oTbl.Indexes.Append oInd 'Rafraichit la collection oTbl.Indexes.Refresh

4.5.4.2 - Supprimer une cl primaire


Afin d'illustrer la suppression d'un index je vous propose de traiter le cas, o nous souhaitons supprimer la cl primaire de la table. Il nous faut donc parcourir l'ensemble des index de l'objet TableDef et les supprimer si leur proprit Primary est gale True.
Private Sub SupprimerClePrimaire(oTbl As DAO.TableDef) On Error GoTo err Dim oInd As DAO.Index 'Parcours les index For Each oInd In oTbl.Indexes 'S'il s'agit d'une cl primaire, alors le supprimer If oInd.Primary Then oTbl.Indexes.Delete (oInd.Name) End If Next oInd Exit Sub err: MsgBox "Une erreur inattendue est survenue" End Sub

Utilisation :
Dim oDb As DAO.Database Dim oTbl As DAO.TableDef 'Instancie la base Set oDb = CurrentDb 'Instancie la table Set oTbl = oDb.TableDefs("Client") 'Supprime la cl primaire SupprimerClePrimaire oTbl

4.6 - L'objet Relation

4.6.1 - Dfinitions
Certaines applications sont juges sur leur performance ou leur ergonomie. Lorsqu'il s'agit d'une base de donnes, les critres de slection ne sont plus les mmes. Le rle principal d'un SGBD est de stocker des donnes et ce stockage doit tre ralis dans les meilleures conditions. Il serait dramatique que certaines donnes soient perdues frquemment. Une application Access doit donc garantir la cohrence et l'intgrit des donnes. Imaginons une table Commande et une table Client, il serait illogique d'affecter une commande un client non recens dans la table Client. Afin d'viter ce risque , le moteur Jet permet de crer des contraintes d'intgrits par le biais de ses objets Relations qui obligeront saisir un client valide dans la table des commandes.

4.6.2 - Liste des proprits 4.6.2.1 - Attributes


Type : Long

- 57 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

La proprit Attributes correspond au type de la contrainte reprsente par l'objet Relation. La valeur de cette proprit doit tre une (ou une combinaison) des constantes suivantes : Constante dbRelationUnique dbRelationDontEnforce dbRelationUpdateCascade dbRelationDeleteCascade dbRelationLeft dbRelationRight Signification Relation de type un un. L'intgrit rfrentielle n'est pas applique. Les mises jours sont rpercutes en cascade. Les suppressions sont rpercutes en cascade. Les jointures seront de type Left par dfaut. Les jointures seront de type Rigth par dfaut.

4.6.2.2 - Fields
Type : Collection Cette collection regroupe l'ensemble des champs utiliss par la relation. Vous devez utiliser la mthode Relation.CreateField pour crer de nouveaux champs dans la relation et les ajouter la collection Fields l'aide de la mthode Append. Chaque objet Field de la relation doit possder le nom du champ concern dans la table spcifie dans la proprit Table. Ce champ aura comme proprit ForeignName, le nom d'un champ de la table spcifie dans la proprit ForeignTable.

4.6.2.3 - ForeignTable
Type : String La proprit ForeignTable correspond au nom de la table externe de la relation. Ce nom doit tre celui d'un objet TableDef prsent dans la collection TableDefs de l'objet Database.

4.6.2.4 - Name
Type : String La proprit Name reprsente le nom de la relation. Il doit tre unique au sein de la collection Database.Relations. L'utilisation de nom prcis facilitera les oprations de maintenance sur la base de donnes. Ainsi, une relation entre une table commande et une table client sera nomme Rlt_CommandeClient. Evitez d'appeler vos objets Relation1, Table1, Requete1...

4.6.2.6 - Properties
Type : Collection La collection Properties regroupe l'ensemble des proprits de l'objet Relation.

- 58 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

4.6.2.7 - Table
Type : String La proprit Table correspond au nom de la table principale sur laquelle porte la relation. Il s'agit de la table possdant la cl primaire utilise dans la relation. A contrario, la proprit ForeignName correspond la table possdant la cl trangre de la relation.

4.6.3 - Liste des mthodes


Les objets de type Relation ne possde qu'une seule mthode : CreateField. Celle ci permet de crer un champ ajouter la relation. Syntaxe :
Set field = relation.CreateField (name)

Name correspond au nom du champ de la cl primaire utilise dans la relation.

4.6.4 - Exemple de dfinition des proprits


Considrons deux tables et la relation suivante :

Paramtres de la relation :

- 59 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Les proprits d'une telle relation seront dfinies ainsi : Attributes : dbRelationUpdateCascade Fields : Un objet Field nomm "NumClient" et ayant comme proprit ForeignName : "IDClient" ForeignTable : "Commande" Name : "Rlt_CommandeClient" PartialReplica : False (Non utilis) Table : "Client"

4.6.5 - Oprations sur les relations


Je vous propose une suite de quelques exemples de code VBA afin de manipuler les objets Relations

4.6.5.1 - Crer une relation


Reprenons l'exemple ci-dessus. Je vous livre le code correspondant une telle relation. La premire mthode consiste crer la relation et affecter chacune des proprits sa valeur correspondante.
Dim oDb As DAO.Database Dim oRlt As DAO.Relation Dim oFld As DAO.Field Set oDb = CurrentDb 'Cre la relation Set oRlt = oDb.CreateRelation 'Dfinit les proprits oRlt.Attributes = dbRelationUpdateCascade oRlt.ForeignTable = "Commande" oRlt.Name = "Rlt_CommandeClient" oRlt.Table = "Client" 'Cre le champ dans la relation Set oFld = oRlt.CreateField("NumClient") 'Dfinit le nom de la cl externe oFld.ForeignName = "IDClient" 'Ajoute le champ oRlt.Fields.Append oFld 'Rafrahit la collection Relations oDb.Relations.Refresh 'Ajoute la relation oDb.Relations.Append oRlt - 60 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN 'Rafrahit la collection Relations oDb.Relations.Refresh 'Ferme la base de donnes oDb.Close Set oDb = Nothing

La seconde mthode consite utiliser l'ensemble des arguments de la mthode CreateProperty. En effet celle-ci permet d'initialiser le nom de la relation, de la table, de la table externe ainsi que les attributs. Syntaxe :
Set relation = database.CreateRelation (name, table, foreigntable, attributes)

Notre code devient alors :


Dim oDb As DAO.Database Dim oRlt As DAO.Relation Dim oFld As DAO.Field Set oDb = CurrentDb 'Cre la relation Set oRlt = oDb.CreateRelation("Rlt_CommandeClient", "Client", _ "Commande", dbRelationUpdateCascade) 'Cre le champ Set oFld = oRlt.CreateField("NumClient") 'Dfinit le nom de la cl externe oFld.ForeignName = "IDClient" 'Ajoute le champ oRlt.Fields.Append oFld 'Rafrahit la collection Relations oDb.Relations.Refresh 'Ajoute la relation oDb.Relations.Append oRlt 'Rafrahit la collection Relations oDb.Relations.Refresh 'Ferme la base de donnes oDb.Close Set oDb = Nothing

4.6.5.2 - Compter les relations utilisant un champ donn


Cette fonction a dj t utilis lors de l'opration qui consistait supprimer un champ dans un objet TableDef. Le principe est simple, un champ est utilis par une relation si : La table dont il provient est prsent dans la proprit Table de la relation et que le nom d'un champ de la relation est gal au nom de ce champ. La table dont il provient est prsent dans la proprit ForeignTable de la relation et qu'au moins un champ de cette relation possde une proprit ForeignName gale au nom de ce champ.

Il nous suffit donc de boucler sur l'ensemble des objets Relation de la base de donnes.
Private Function ChampDansRelation(oBaseDeDonnees As DAO.Database, _ strNomTable As String, strNomChamp As String) As Integer On Error GoTo err Dim bolUtilise As Boolean Dim oRlt As DAO.Relation Dim oFld As DAO.Field 'Parcours les relations For Each oRlt In oBaseDeDonnees.Relations bolUtilise = False - 61 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN If oRlt.Table = strNomTable Then 'Pour chaque champ, contrle le nom du champ For Each oFld In oRlt.Fields If oFld.Name = strNomChamp Then bolUtilise = True Next oFld ElseIf oRlt.ForeignTable = strNomTable Then 'pour chaque champ, contrle le nom tranger For Each oFld In oRlt.Fields If oFld.ForeignName = strNomChamp Then bolUtilise = True Next oFld End If 'Si la relation utilise le champ, on incremente le resultat If bolUtilise Then ChampDansRelation = ChampDansRelation + 1 Next oRlt Exit Function err: ChampDansRelation = -1 End Function

Il devient alors possible de connatre le nombre de relations utilisant le champ NumClient de la table Client. Utilisation :
Dim oDb as DAO.Database Set oDb=CurrentDB MsgBox ChampDansRelation(oDb, "Client", "NumClient")

4.6.5.3 - Supprimer les relations autour d'une table


Il peut s'avrer par fois utile de supprimer les relations portant sur une table avant de pouvoir modifier la structure de la table. Cette opration peut s'avrer fastidieuse et je vous suggre de crer une fonction automatisant cette tche.
Public Function SupprimerRelationTable(oBaseDeDonnees As _ DAO.Database, strNomTable As String) As Integer Dim oRlt As DAO.Relation 'Pour chaque relation, For Each oRlt In oBaseDeDonnees.Relations 'si la table est utilise If oRlt.Table = strNomTable Or oRlt.ForeignTable = strNomTable Then 'Supprime la relation oBaseDeDonnees.Relations.Delete oRlt.Name oBaseDeDonnees.Relations.Refresh 'Incrmente le compteur SupprimerRelationTable = SupprimerRelationTable + 1 End If Next oRlt End Function

La fonction SupprimerRelationTable retourne le nombre de relations supprimes. Utilisation :


Dim oDb As DAO.Database Dim oRlt As DAO.Relation Set oDb = CurrentDb 'Supprime les relations de la table Client MsgBox SupprimerRelationTable(oDb, "Client")

- 62 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

4.7 - L'objet QueryDef


Nous sommes sur le point d'aborder le dernier objet de la partie DDL du modle DAO. Cette partie commencera par une rapide prsentation de l'objet, suivie de la liste des proprits et des mthodes puis enfin, quelques exemples d'utilisation en VBA.

4.7.1 - Dfinitions
Access est un des rares SGBDR permettant de stocker des requtes SQL dans la base de donnes sans qu'il ne s'agissent de vues. Certes, une vue est le rsultat de cette requte mais son contenu est statique. Pour visualiser les modifications intervenues dans le jeu d'enregistrements entre deux instants, il est ncessaire de recrer la vue. Une requte stocke dans une base de donnes Access est dynamique. Elle est rexecute chaque fois que vous la rouvrez. De telles requtes sont modlises par l'objet QueryDef dans DAO. Ces requtes peuvent tre de plusieurs types : slection, union, insertion, mise jour, suppression, analyse croise ... Requtes paramtres : DAO propose de grer les paramtres des requtes via la collection Parameters de l'objet QueryDef. Ces requtes sont trop souvent oublies dans Microsoft Access et remplaces par des requtes SQL codes directement dans VBA. Pourtant, la manipulation de ces requtes est trs simple :
PARAMETERS Param_Num Text ( 10 ); SELECT * FROM Client WHERE NumClient=Param_Num;

La clause PARAMETERS liste l'ensemble des paramtres avec leur type et (optionnellement) leur taille. La seconde partie de la requte, est celle que vous auriez crit sans paramtre. Ainsi, pour ouvrir un Recordset sur le client possdant le numro AF36, le code VBA serait :
Dim oDb As DAO.Database Dim oQdf As DAO.QueryDef Dim oRst As DAO.Recordset Set oDb = CurrentDb Set oQdf = oDb.QueryDefs("R01") oQdf.Parameters("Num").Value = "AF36" Set oRst = Qdf.OpenRecordset

Afin de comparer, voici le mme code sans utiliser les requtes paramtres :
Dim oDb As DAO.Database Dim oSQL As String Dim oRst As DAO.Recordset Dim StrSQL As String Set oDb = CurrentDb StrSQL = "SELECT * FROM Client " & _ "WHERE NumClient=" & Chr(34) & "AF36" & Chr(34) Set oRst = oDb.OpenRecordset(StrSQL)

L'utilisation des requtes paramtres apparait donc plus intuitive et vite de manipuler des fonctions de conversion de chane. De plus, si demain, nous souhaitons modifier notre requte pour y ajouter une jointure, il nous suffit de
- 63 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

modifier le code SQL correspondant dans la requte paramtre. Si au contraire nous n'utilisons pas ces requtes, il nous faut alors modifier notre code VBA aux diffrents endroit o la "requte" est mentionne. Si vous ouvrez un objet Database Db2 depuis la base de donnes Db1 et que vous xecutez un objet QueryDef de Db2, les donnes seront prleves depuis Db2 et non dans Db1. Chaque objet QueryDef travaille sur les donnes de l'objet Database qui le contient.

4.7.2 - Liste des proprits


Vous trouverez ci-dessous la liste des proprits disponibles pour les objets QueryDef. La proprit Prepare n'est pas documente dans ce tutoriel.

4.7.2.1 - Connect
Lecture seule. Type : String La proprit Connect renvoie la chaine de connexion utilise par la requte lorsque celle ci provient d'une autre base de donnes.

4.7.2.2 - DateCreated
Lecture seule. Type : Date Cette proprit renvoie la date laquelle a t cr la requte.

4.7.2.3 - Fields
Lecture seule. Type : Collection Une nouvelle fois, nous rencontrons cette collection qui regroupe l'ensemble des champs retourns par la requte. Notez que vous pouvez diffrencier le nom d'un champ et son alias en utilisant la proprit SourceField de l'objet Field.

4.7.2.4 - LastUpdated
Lecture seule. Type : Date Cette proprit renvoie la date laquelle a t modifie la requte pour la dernire fois.

- 64 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

4.7.2.5 - MaxRecords
Type : Long La proprit MaxRecords correspond au nombre d'enregistrements renvoyer au maximum. Cette proprit peut tre utilise lorsque le poste client ne dispose pas de ressources suffisantes afin de traiter l'ensemble des donnes. Cette proprit est disponible uniquement pour les requtes utilisant une source de donnes ODBC.

4.7.2.6 - Name
Type : String La proprit Name reprsente le nom de la requte. Il doit tre unique au sein de la collection Database.QueryDefs. Lorsque vous utilisez la mthode CreateQueryDef et que vous ne spcifiez pas l'argument Name, la requte n'est pas sauvegarde dans la base de donnes la fin du traitement.

4.7.2.7 - Parameters
Type : Collection Cette collection regroupe l'ensemble des paramtres d'un objet QueryDef. Il est impossible d'ajouter ou de supprimer des lments de cette collection. Un exemple d'utilisation de requte paramtre est disponible dans les dfinitions des QueryDefs ci-dessus.

4.7.2.8 - Properties
Type : Collection La collection Properties regroupe l'ensemble des proprits de l'objet QueryDef.

4.7.2.9 - RecordsAffected
Lecture seule. Type : Long Dans le cas d'une requte action (Insert,Update,Delete), la proprit RecordsAffected retourne le nombre d'enregistrements affects par l'ordre SQL.

4.7.2.10 - ReturnsRecords
Type : Boolean Cette proprit dfinit ou renvoie une valeur indiquant si une requte retourne des enregistrements.

- 65 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

La proprit ReturnsRecords est disponible uniquement pour les requtes SQL directes.

4.7.2.11 - SQL
Type : String La proprit SQL correspond au code SQL de la requte. Cette proprit correspond l'argument SQL de la mthode Database.CreateQueryDef.

4.7.2.12 - Type
Type : Long La proprit Type renvoie le type de la requte. Cette proprit est dfinie automatiquement lorsque vous crez l'objet QueryDef. Toutefois, elle peut vous permettre de recenser les objets QueryDef suivant leur rle. Les valeurs possibles sont : Constante Signification

dbQAction dbQAppend dbQCompound dbQCrosstab dbQDDL dbQDelete dbQMakeTable dbQProcedure dbQSelect dbQSetOperation dbQSPTBulk dbQSQLPassThrough dbQUpdate

Action Ajout Non documente Analyse croise Dfinition de donnes Suppression CreateTable Procdure stocke Slection Union Requte ne renvoyant pas d'enregistrement Requte SQL Directe Mise jour

4.7.2.13 - Updatable
Lecture seule. Type : Boolean Cette proprit renvoie True si les donnes de la requte ne peuvent tre modifies.

4.7.3 - Liste des mthodes 4.7.3.1 - CreateProperty


La mthode CreateProperty cre un nouvel objet Property. Plus de dtails sont disponibles dans le chapitre 4.2.5 Proprits spcifiques.

- 66 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

4.7.3.2 - Execute
La mthode Execute xecute une requte Action. Une erreur sera leve si vous tentez d'excuter une requte de slection. Syntaxe :
querydef.Execute options

L'argument options doit tre une (ou une combinaison) des constantes suivantes : Constante Signification Interdit l'accs en criture pour les autres utilisateurs (Valeur par dfaut) Excute des mises jour sans vrifier la cohrence (intgrit rferentielle) Excute des mises jour en vrifiant la cohrence Excute une requte SQL Direct En cas d'erreur, les mises jour sont annules Gnre une erreur d'excution si un autre utilisateur modifie les donnes que vous tes en train de modifier

dbDenyWrite dbInconsistent dbConsistent

dbSQLPassThrough dbFailOnError dbSeeChanges

Vous pouvez utiliser la proprit RecordsAffected pour connatre le nombre d'enregistrements modifis.

4.7.3.3 - OpenRecordset
La mthode OpenRecordset ouvre un jeu d'enregistrements sur le rsultat de la requte. Syntaxe :
Set recordset = object.OpenRecordset (type, options, lockedits)

Cette mthode sera largement aborde dans le chapitre suivant.

4.7.4 - Oprations sur les requtes 4.7.4.1 - Cration d'une requte


Dans notre exemple nous allons crer une requte de slection complte de la table clients. Il s'agit d'une requte simple et la mthode appliquer est la mme pour tout type de requte.
Sub CreerRequete() On Error GoTo Err Dim oDb As DAO.Database Dim strCodeSql As String - 67 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN 'Instancie l'objet database Set oDb = CurrentDb 'Stocke le code SQL dans une variable strCodeSql = "SELECT * FROM Client" 'Cre la requte oDb.CreateQueryDef "R01_SelectionClient", strCodeSql Finally: oDb.Close Set oDb = Nothing Err: 'Gre les erreurs Select Case Err.Number Case 3012: MsgBox "La requte existe dj" Case Else: MsgBox "Une erreur inconue est survenue" End Select Resume Finally End Sub

4.7.4.2 - Modifier le code d'une requte


Afin de modifier le code SQL, il faut procder en deux tapes : Rcuperer l'objet QueryDef correspondant (S'il existe). Modifier la proprit SQL de l'objet.
Public Function ModifierSQL(oBaseDeDonnees As DAO.Database, _ strNomRequete As String, strCodeSQL As String) As Boolean On Error GoTo Err Dim oQdf As DAO.QueryDef 'Instancie l'objet QueryDef Set oQdf = oBaseDeDonnees.QueryDefs(strNomRequete) 'Modifie le code SQL oQdf.SQL = strCodeSQL 'Renvoie True ModifierSQL = True Exit Function Err: 'Gere les erreurs Select Case Err.Number Case 3265: MsgBox "Impossible de trouver la requte modifier" Case Else: MsgBox "Une erreur inattendue est survenue" End Select End Function

Utilisation :
Dim oDb As DAO.Database Set oDb = CurrentDb If ModifierSQL(oDb, "R01_SelectionClient", "SELECT NumClient FROM Client") Then MsgBox "Le code SQL de la requte a t modifi avec succs" End If

4.7.4.3 - Lister les requtes


La proprit Type retourne le type d'un objet QueryDef. Il est donc possible de lister l'ensemble des requtes de slection.
Dim oDb As DAO.Database Dim oQdf As DAO.QueryDef - 68 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN 'Instancie l'objet Database Set oDb = CurrentDb 'Boucle sur les objets QueryDef For Each oQdf In oDb.QueryDefs 'S'il s'agit d'une requte de slection, alors afficher son nom If oQdf.Type = dbQSelect Then MsgBox oQdf.Name, , "Slection" Next oQdf

- 69 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

5 - Accs aux donnes 5.1 - Dfinition


Sous Visual Basic, une application est capable d'accder aux donnes via un objet Recordset. Cet objet correspond un jeu d'enregistrements communment appel curseur (de l'anglais CURSOR : CURrent Set Of Rows). Si vous faites vos premiers pas dans le monde des Recordset, vous pouvez imaginer cela comme le tableau d'une requte en mode feuille de donnes. Le Recordset est alors compos de plusieurs lignes (enregistrements) et de plusieurs colonnes (champs). Lorsque vous accdez la valeur d'un champ, vous le fates pour l'enregistrement courant dans le Recordset. Il en est de mme dans la feuille de donnes d'une requete. La ligne courante est alors matrialise par un triangle dans le slecteur d'enregistrement. Celle ci pourrait se matrialiser par le slecteur d'enregistrement dans une feuille de donnes.

Les Recordset donnent donc la possibilit de rcuperer le rsultat d'une requte dans une variable, de l'analyser, de le modifier, etc... tout comme vous le feriez manuellement dans une feuille de donnes ou un formulaire.

5.1.1 - Les diffrents types de Recordset


Il existe cinq types de Recordset : 1. Recordset de type Table : Un Recordset de type Table permet d'accder directement au contenu d'une table. Son contenu est dynamique, ce qui signifie que les mises jour sont directement rpercutes dans le jeu d'enregistrement. La source d'un tel Recordset est le nom d'une table. Attention ce type est incompatible avec les tables lies (provenant d'une autre base de donnes) 2. Recordset de type Dynaset : Un Recordset de type Dynaset correspond au rsultat d'une instruction SQL retournant des enregistrements. Son contenu est dynamique et sa source peut tre soit le nom d'une table, d'une requte ou bien une instruction SQL valide. 3. Recordset de type Snapshot : Un Recordset de type Snapshot correspond une photographie des donnes un instant donn (son ouverture). Les modifications apportes dans la base de donnes aprs l'ouverture d'un tel curseur ne sont pas rpercutes dans le jeu d'enregistrements. Son contenu est donc statique et sa source est dfinit comme celle d'un Recordset de type Dynaset. 4. Recordset de type ForwardOnly :

- 70 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Il s'agit d'un Recordset de type Snapshot la diffrence qu'il ne permet de se dplacer exclusivement vers l'avant. Il est impossible de repartir au dbut du jeu d'enregistrement, ni mme de reculer au cours de la lecture des donnes. 5. Recordset de type Dynamic : Ce type de Recordset est semblable au type Dynaset la diffrence qu'il s'applique exclusivement aux sources de donnes ODBC Direct.

5.2 - Ouvrir et fermer un recordset


Depuis Access et VBA, il est possible d'utiliser plusieurs mthodes afin d'ouvrir un jeu d'enregistrements.

5.2.1 - Depuis un objet Database


L'objet Database (et donc indirectement CurrentDB) est muni de la mthode OpenRecordset qui instancie un nouvel objet Recordset et l'ajoute la collection Database.Recordsets. La syntaxe de cette mthode est la suivante :
Set recordset = Database.OpenRecordset (source, [type, options, lockedits])

source : Il s'agit de la source d'enregistrements du Recordset. Il peut s'agir du nom d'une table, d'une requte ou d'une instruction SQL valide retournant des enregistrements (SELECT). Dans le cas d'un Recordset de type Table, cet argument est restreint au nom d'une table. Pour tre valide, l'instruction SQL doit tenir compte des diffrents types de champ dans l'expression des critres. Ainsi, si le champ NomClient est de type texte, la variable source slectionnant le client nomm Dupont sera :
Source="SELECT * FROM Client WHERE NomClient=" & chr(34) & "Dupont" & chr(34)

La fonction Chr(34) permet d'encadrer un critre de type texte avec des guillemets. En effet, nous n'aurions pas pu crire :
Source="SELECT * FROM Client WHERE NomClient="Dupont""

En effet, dans ce cas, le " avant Dupont correspondrait la fermeture de guillemet associe au premier caractre " (avant SELECT). Une erreur serait donc lev par le compilateur. Une solution possible est donc d'utiliser le code Ascii du caractre ". Le contenu de la variable utilisant la fonction Chr sera aprs concatnation :
SELECT * FROM Client WHERE NomClient="Dupont"

Toutefois, il reste encore un problme. Si dans la valeur recherche figure un guillemet, le moteur Jet va l'interprter lui aussi comme une fin de chaine de caractre. La solution est de doubler les guillemets dans l'expression du critre :

Source="SELECT * FROM Client WHERE NomClient=" & chr(34) & Replace(MaVariable,chr(34),chr(34) & chr(34)) & chr(34)

Ainsi, si MaVariable est gale Monsieur "X", alors la fonction Replace retournera Monsieur ""X"". La source du Recordset sera, aprs concatnation :

- 71 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

SELECT * FROM Client WHERE NomClient="Monsieur ""X"""

Le type Date est plus simple traiter, il faut encadrer la valeur du critre par des #. Notons tout de mme que les dates doivent tre en format amricain : mm/jj/yyyy. Un recordset slectionnant les commandes du 10 dcembre 2003 sera initialis avec la source suivante :
Source="SELECT * FROM Commande WHERE DateCommande=#12/10/2003#"

Type : Cet argument correspond au type du recordset gnrer. Les constantes disponibles sont : Constante dbOpenTable dbOpenDynamic dbOpenDynaset dbOpenSnapshot dbOpenForwardOnly Type de recordset Table Dynamique (ODBC Direct) Feuille de rponse dynamique Instantan En avant seulement

Options : Ce paramtre dfinit les paramtres optionnels du Recordset. Il s'agit d'une (ou une combinaison) des constantes suivantes : Constante Effets Permet aux utilisateurs d'ajouter de nouveaux enregistrements l'objet Recordset, tout en leur interdisant de modifier ou de supprimer les enregistrements existants (objet Recordset de type Feuille de rponses dynamique Microsoft Jet (Dynaset) uniquement). Transmet une instruction SQL une source de donnes ODBC connecte Microsoft Jet en vue de son traitement (objet Recordset de type Instantan Microsoft Jet (Snapshot) uniquement). Gnre une erreur d'excution si un utilisateur modifie les donnes en cours de modification par un autre utilisateur (objet Recordset de type Feuille de rponses dynamique Microsoft Jet (Dynaset) uniquement). Interdit aux autres utilisateurs de modifier ou d'ajouter des enregistrements Interdit aux autres utilisateurs de lire les donnes d'une table Autorise les mises jour incohrentes Autorise uniquement les mises jour cohrentes

dbAppendOnly

dbSQLPassThrough

dbSeeChanges

dbDenyWrite dbDenyRead dbInconsistent dbConsistent

Certaines constantes ont t volontairement oublies dans cette liste du fait qu'elles sont soit inapplicables sous Access, soit dconseilles. LockEdits : Il s'agit du mode de verrouillage des donnes utilis par le Recordset. Les constantes disponibles sont :
- 72 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

dbReadOnly dbPessimistic

Constante

dbOptimistic

Verrouillage Interdit aux utilisateurs d'apporter des modifications l'objet Recordset Utilise le verrouillage pessimiste afin de dterminer de quelle faon les modifications sont apportes l'objet Recordset dans un environnement multi-utilisateur. La page contenant l'enregistrement que vous modifiez est verrouille ds que vous utilisez la mthode Edit (option par dfaut pour les espaces de travail Microsoft Jet). Utilise le verrouillage optimiste afin de dterminer de quelle faon les modifications sont apportes l'objet Recordset dans un environnement multi-utilisateur. La page contenant l'enregistrement n'est pas verrouille tant que l'excution de la mthode Update n'est pas termine

Certaines constantes ont t volontairement oublies dans cette liste du fait qu'elles sont inapplicables sous Access. Exemple :
Dim Dim Set Set oRst as DAO.Recordset oDb as DAO.Database oDb=CurrentDb oRst=oDb.OpenRecordset("SELECT * FROM Client WHERE NumClient=2",dbOpenDynaset)

Cet exemple ouvre un Recordset retournant le client possdant le numro 2.

5.2.2 - Depuis un objet QueryDef


Si vous souhaitez accder aux donnes d'une requte enregistre vous pouvez utiliser la mthode OpenRecordset de l'objet QueryDef correspondant plutt que d'utiliser celle de l'objet Database qui ncessite de passer en paramtre le nom de la requte. La syntaxe de cette mthode est la suivante :
Set recordset = QueryDef.OpenRecordset ([type, options, lockedits])

Les arguments utiliser sont les mmes que ceux de la mthode Database.OpenRecordset. Notons toutefois qu'il est impossible d'ouvrir un Recordset de type Table sur un objet QueryDef. Dans le cas d'une requete paramtre, vous devez affecter les paramtres avant d'ouvrir le recordset. Il est impossible d'ouvrir un recordset sur une requete qui demande l'utisateur de saisir des critres via une boite de dialogue (type inputbox). Une erreur d'xecution ( X arguments attendus serait alors leve).

5.2.3 - Depuis un formulaire Access


Sans que vous le sachiez, vous avez dj manipuler des objets Recordset par le biais d'un formulaire. En effet, tout formulaire (et tat) Access possdant une source de donnes (Proprit Source / RecordSource) utilise un curseur
- 73 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

pour afficher et manipuler les donnes qu'il contient. Vous pouvez vous mme agir sur ce jeu d'enregistrement via la proprit Recordset du formulaire. Ainsi, si vous utilisez la mthode Movenext sur le Recordset du formulaire, vous vous apercevrez que votre formulaire a atteint l'enregistrement suivant. Notons aussi que tout dplacement dans le Recordset du formulaire entraine l'appel de l'evenement Form_Current (sur activation) du formulaire. Syntaxe :
Set recordset=Me.Recordset

La mthode RecordsetClone d'un formulaire permet de dupliquer le jeu d'enregistrements du formulaire afin que vous puissiez manipuler les donnes sans que ces modifications ne soient rpercutes sur le formulaire et sans qu'aucun vnement ne soit dclench. Pour que le formulaire prenne en compte les modifications apportes sur le jeu d'enregistrements, il est ncessaire d'appeler la mthode Requery de ce formulaire.
Set recordset=Me.RecordsetClone

5.2-4 - Fermer un Recordset


Lorsque vous manipulez les recordsets, une quantit importante de donnes est chage en mmoire. Pour la librer il est ncessaire de procder en deux temps : 1 2 appel de la mthode Recordset.Close, affectation de Nothing la variable.

Si la phase Set Recordset=Nothing est optionnelle car les variables seront invitablement dtruites la fin de la procdure (hors variables publiques dtruite en fin d'application), l'appel Close quant lui un caractre obligatoire. En effet, une non fermeture systmatique des Recordsets est l'origine de l'accroissement si particulier de la taille des bases de donnes Access, obligeant l'utilisateur recourrir au compactage rgulirement. Une bonne pratique consiste placer la ligne suivante ds qu'un recordset n'est plus utile :
oRst.Close : Set oRst=Nothing

5.3 - Positions et dplacements 5.3.1 - Se dplacer dans un Recordset


Lorsque vous initialisez un jeu d'enregistrements, l'enregistrement courant est le premier si le recordset n'est pas vide. Toutefois, il existe deux positions particulires : une avant le premier enregistrement. Lorsque vous tes cet emplacement, la proprit BOF du Recordset est gale True une aprs le dernier enregistrement. Dans ce cas, la proprit EOF est gale True.

Dans le cas o le jeu d'enregistrement est vide, la position courante se trouve la fois avant le premier enregistrement et aprs le dernier. Ainsi, pour tester si le Recordset est vide ou pas, il suffit d'utiliser la condition suivante :
If Not oRecordset.EOF Then Msgbox "Le jeu d'enregistrements n'est pas vide" else Msgbox "Le jeu d'enregistrements est vide" - 74 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN End if

Cinq mthodes sont disponibles pour se dplacer dans le Recordset : MovePrevious permet d'atteindre l'enregistrement prcdent. MoveNext permet d'atteindre l'enregistrement suivant. MoveFirst permet d'atteindre le premier enregistrement. MoveLast permet d'atteindre le dernier enregistrement. Move permet un dplacement relatif par rapport la position courante..

Exemple :
'Se place sur le premier enregistrement oRecordset.MoveFirst 'Se place sur le dernier enregistrement oRecordset.MoveLast 'Se place sur l'enregistrement prcdent oRecordset.MovePrevious 'Se place sur l'enregistrement suivant oRecordset.MoveNext 'Recule de trois enregistrements oRecordset.Move -3 'Avance de trois enregistrements oRecordset.Move 3

Lorsque vous atteignez le dernier enregistrement et que vous utilisez la mthode MoveNext, la proprit EOF est gale True et la position courante n'est plus un enregistrement. Vous tes la fin du recordset et un nouveau dplacement vers l'avant entrainera une erreur d'excution. (Il en va de mme pour BOF et les dplacements en arrire) Pour parcourir l'ensemble des enregistrements d'un Recordset, vous procderez ainsi :
'Tant que non fin du recordset While Not oRecordset.EOF 'Passer au suivant oRecordset.MoveNext Wend

5.3.2 - Trouver un enregistrement


Les mthodes dont le nom commence par Find permettent d'atteindre un enregistrement dont les donnes vrifient le critre pass en paramtre. Ce critre correspond la clause WHERE d'une requte SQL. La diffrence entre les diverses mthodes rside dans le sens de la recherche. FindNext recherche le prochain enregistrement ( partir de la position courante) vrifiant le critre. FindPrevious effectue la mme recherche mais vers l'arrire. FindFirst trouve le premier enregistrement ( partir du dbut du jeu d'enregistrement) vrifiant le critre. FindLast trouve le dernier enregistrement ( partir de la fin du jeu d'enregistrement).

Ainsi, pour se positionner sur le premier enregistrement dont le champ NomClient commence par T dans un formulaire :
Dim strCritere as string - 75 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN strCritere="NomClient LIKE " & chr(34) & "T*" & chr(34) Me.Recordset.FindFirst strCritere

Si aucun enregistrement ne vrifie le critre, la proprit NoMatch du recordset est gale True. Exemple :
Dim strCritere as string strCritere="NomClient LIKE " & chr(34) & "T*" & chr(34) Me.Recordset.FindFirst strCritere If Me.Recordset.NoMatch Then Msgbox "Aucun enregistrement n'a t trouv"

5.3.3 - Mmoriser une position


Parfois, vous souhaitez naviguer dans le jeu d'enregistrements puis revenir la position ou vous tiez avant. La proprit Bookmark du Recrodset retourne un signet vers l'enregistrement. Il s'agit d'un tableau contenant des donnes de type Byte.
Dim BytPosition() as Byte BytPosition=oRecordset.Bookmark

Si par la suite, vous souhaitez revenir cette position, il suffit d'affecter la valeur mmorise la proprit Bookmark.
oRecordset.Bookmark=BytPosition

5.4 - Manipulation des donnes 5.4.1 - Lire un enregistrement


Il est possible de lire les donnes de l'enregistrement courant l'aide de la collection Fields. Cette collection fonctionne comme les autres collection DAO et il est possible d'appeler chaque lment par son nom ou par sa position dans la collection.
Dim oRst as DAO.Recordset Dim oDb as DAO.Database Set oDb=CurrentDb Set oRst=oDb.OpenRecordset("SELECT NumClient,NomClient FROM Client WHERE NumClient=2",dbOpenDynaset) Msgbox "Le nom du client est : " & Rst.Fields("NomClient").Value 'Libration des objets oRst.Close oDb.Close Set oRst=Nothing Set oDb=Nothing

Ou
Dim oRst as DAO.Recordset Dim oDb as DAO.Database Set oDb=CurrentDb Set oRst=oDb.OpenRecordset("SELECT NumClient,NomClient FROM Client WHERE NumClient=2",dbOpenDynaset) Msgbox "Le nom du client est : " & Rst.Fields(1).Value

- 76 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN 'Libration des objets oRst.Close oDb.Close Set oRst=Nothing Set oDb=Nothing

La proprit Value est le membre par dfaut d'un objet Field. Vous pouvez donc utiliser :
Msgbox "Le nom du client est : " & Rst.Fields(1)

5.4.2 - Modifier un enregistrement


La modification d'un enregistrement peut se dcomposer en 4 tapes :

L'exemple suivant fixe la date de toutes les commandes aujoud'hui.


Dim oRst as DAO.Recordset Dim oDb as DAO.Database Set oDb=CurrentDb Set oRst=oDb.OpenRecordset("TblCommande",dbOpenTable) While Not oRst.EOF 'Passe en mode modification oRst.Edit 'Affecte la date actuelle oRst.Fields("DateCommande").Value=Now() 'Met Jour oRst.Update 'Passe au suivant oRst.MoveNext Wend 'Libration des objets oRst.Close oDb.Close Set oRst=Nothing Set oDb=Nothing

Notre exemple ralise un Update massif sur l'ensemble de la table commande. Toutefois ne perdez pas de vue que dans bien des cas, une instruction SQL peut suffir et reste bien plus performante qu'une boucle sur un jeu d'enregistrement.
CurrentDb.Execute "UPDATE TblCommande SET DateCommande=#" & Now() & "#"

- 77 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

5.4.3 - Ajouter un enregistrement


La mthode AddNew d'un Recordset permet d'ajouter un enregistrement. Aprs avoir assign les valeurs aux diffrents champ, vous devez faire appel la mthode Update pour mettre jour les donnes ou bien la mthode CancelUpdate pour annuler l'ajout. L'enregistrement nouvellement cr est plac la fin du jeu d'enregistrement, except dans le cas d'un Recordset de type Table o l'enregistrement est plac suivant l'ordre des index de la table. Dans tout les cas, le Recordset revient sa position d'origine avant l'appel de la mthode Update. Exemple :
Dim oRst as DAO.Recordset Dim oDb as DAO.Database Set oDb=CurrentDb Set oRst=oDb.OpenRecordset("TblProduit",dbOpenTable) 'Passe en mode Ajout oRst.AddNew 'Affecte les diffrents champs oRst.Fields("Reference").Value="SRS200" oRst.Fields("Libelle").Value="Souris optique sans fil" 'Met Jour oRst.Update 'Libration des objets oRst.Close oDb.Close Set oRst=Nothing Set oDb=Nothing

Vous devez affecter chacun des champs dont la proprit Required est gale True, sans quoi une erreur sera leve. De mme vous devez respecter les contraintes d'index que vous avez dfinit sur la table. Ainsi, une cl primaire ne peut contenir de doublons. Dans le cas o un des champs est de type NumroAuto, il est impossible d'affecter une valeur ce champ. La numrotation automatique est gre par le moteur Jet. Toutefois, pour des raisons diverses et varies, vous pouvez avoir le besoin de connaitre la nouvelle valeur du NumroAuto cr. La valeur d'un tel champ est disponible avant l'appel de la mthode Update. Prenons l'exemple d'une table client dont le champ NumClient est auto-incrment :
Dim oRst as DAO.Recordset Dim oDb as DAO.Database Dim LngNouvelleValeur as Long Set oDb=CurrentDb Set oRst=oDb.OpenRecordset("TblClient",dbOpenTable) 'Passe en mode Ajout oRst.AddNew 'Affecte les diffrents champs oRst.Fields("NomClient").Value="DUPONT" oRst.Fields("PrenomClient").Value="Martin" 'Rcupre le nouvel identifiant LngNouvelleValeur=oRst.Fields("NumClient").Value 'Met Jour oRst.Update 'Affiche le numro client de 'l'enregistrement nouvellement cr Msgbox "Le client " & NouvelleValeur & " a t cr" 'Libration des objets oRst.Close oDb.Close Set oRst=Nothing Set oDb=Nothing

- 78 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Dans le cas d'un nombre important d'enregistrements ajouter, un ordre SQL (INSERT) envoy la mthode Execute de l'objet Database sera plus performant que de charger un curseur contenant tous les enregistrements en mmoire. Nous aurions donc avec l'exemple de la souris optique :
Dim StrChaineSQL As String StrChaineSQL="INSERT INTO TblProduit (Reference,Libelle) VALUES (" & chr(34) & "SRS200" & chr(34) & _ "," & chr(34) & "Souris optique sans fil" & chr(34) & ")" CurrentDb.Execute StrChaineSQL

Toutefois, avec cette syntaxe il est impossible de retrouver la valeur d'un champ NumroAuto lors de l'ajout d'un enregistrement. Certains affirmeront qu'il suffit alors de rcuprer la valeur maximum du champ concern pour ne slectionner que le dernier enregistrement de la table, toutefois, cela ne garantit pas qu'il s'agisse de l'enregistrement que vous venez d'ajouter. En effet, un autre utilisateur peut avoir ajout un autre enregistrement immdiatement aprs vous.

5.4.4 - Supprimer un enregistrement


La mthode Delete d'un objet Recordset de type Table ou Dynaset permet de supprimer l'enregistrement courant. Aprs la suppression, l'enregistrement en cours n'est plus dfini. Il est considr comme supprim et une erreur sera leve si vous tentez d'y accder. Il vous faut donc modifier la position courante du curseur l'aide des mthodes MoveNext ou MovePrevious. L'exemple suivant supprimer toute les commandes du client numro 13
Dim oDb as DAO.Database Dim oRst as DAO.Recordset 'Instancie la base de donnes Set oDb=CurrentDb 'Ouvre le curseur Set oRst=oDb.OpenRecordset("SELECT * FROM TblCommandes WHERE NumClient=13") 'Parcours le jeu d'enregistrement jusqu' la fin While Not oRst.EOF 'Supprime l'enregistrement oRst.Delete 'Passe au suivant oRst.MoveNext Wend 'Libration des objets oRst.Close oDb.Close Set oRst=Nothing Set oDb=Nothing

5.4.5 - Compter les enregistrements


Il existe deux faons de procder pour compter le nombre d'enregistrements d'un Recordset. La premire consiste utiliser une requete utilisant l'instruction SQL Count et de lire cette valeur. Ainsi, le nombre de clients habitant Paris peut tre dtermin par :
Dim oDb as DAO.Database Dim oRst as DAO.Recordset Dim LngNbEnregistrement As Long 'Instancie la base de donnes

- 79 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN Set oDb=CurrentDb 'Ouvre le curseur retournant le nombre de clients rsidant Paris Set oRst=oDb.OpenRecordset("SELECT Count(*) FROM TblCLients WHERE Ville=" & Chr(34) & "Paris" & Chr(34)) 'Lit le rsultat LngNbEnregistrement=oRst.Fields(0).Value 'Libration des objets oRst.Close oDb.Close Set oRst=Nothing Set oDb=Nothing

Notons qu'une requte utilisant la fonction de regroupement Count retourne au moins un enregistrement. De ce fait le curseur ne sera jamais vide son ouverture, il n'est donc pas obligatoire de tester l'existence d'enregistrement au sein du recordset avant de lire sa premire ligne. La seconde faon de procder consiste utiliser la proprit RecordCount du Recordset. Cette proprit renvoie le nombre d'enregistrements d'un recordset de type Table ou le nombre d'enregistrements accds lorsqu'il s'agit d'un Recordset d'un autre type. Ainsi, pour compter le nombre d'enregistrements d'un recordset de type table, nous pouvons utiliser :
Dim oDb as DAO.Database Dim oRst as DAO.Recordset Dim LngNbEnregistrement As Long 'Instancie la base de donnes Set oDb=CurrentDb 'Ouvre le curseur retournant tous les clients Set oRst=oDb.OpenRecordset("TblCLients",dbOpenTable) 'Compte les enregistrements LngNbEnregistrement=oRst.RecordCount 'Libration des objets oRst.Close oDb.Close Set oRst=Nothing Set oDb=Nothing

Dans le cas d'un autre type de Recordset, nous devons utiliser MoveLast afin d'atteindre le dernier enregistrement. La proprit RecordCount retournera alors le nombre d'enregistrements de l'objet.
Dim oDb as DAO.Database Dim oRst as DAO.Recordset Dim LngNbEnregistrement As Long 'Instancie la base de donnes Set oDb=CurrentDb 'Ouvre le curseur retournant le nombre de clients rsidant Paris Set oRst=oDb.OpenRecordset("SELECT * FROM TblCLients WHERE Ville=" & Chr(34) & "Paris" & Chr(34),dbOpenDynaset) 'Atteint le dernier enregistrement oRst.MoveLast 'Compte les enregistrements accds (soit le total) LngNbEnregistrement=oRst.RecordCount 'Libration des objets oRst.Close oDb.Close Set oRst=Nothing Set oDb=Nothing

- 80 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

5.4.6 - Filtrer les donnes


Il est possible d'ouvrir un nouvel objet Recordset depuis un premier Recordset tout en restreignant la selection des donnes l'aide d'un filtre. Pour cela, vous devez spcifier un filtre la proprit Filter du premier Recordset puis utiliser sa mthode OpenRecordset afin de retourner un nouveau jeu d'enregistrements filtr. Le filtre appliquer est une chane de caractres correspondant la clause WHERE d'une requte (sans le WHERE). Prenons comme exemple une table TblClients dont on ne slectionne que les clients rsidant Paris.
Dim oDb as DAO.Database Dim oRst as DAO.Recordset Dim oRstFiltre as DAO.Recordset 'Instancie la base de donnes Set oDb=CurrentDb 'Ouvre le curseur retournant tous les clients Set oRst=oDb.OpenRecordset("SELECT * FROM TblClients",dbOpenDynaset) 'Applique le filtre de slection des habitants de Paris oRst.Filter="Ville=" & Chr(34) & "Paris" & Chr(34) 'Ouvre un nouveau curseur Set oRstFiltre=oRst.OpenRecordset '*************************************** 'ici, traitement sur le recordset filtre '*************************************** 'Libration des objets oRst.Close oRstFiltre.Close oDb.Close Set oRst=Nothing Set oRstFiltre=Nothing Set oDb=Nothing

Notons toutefois que dans la majorit des cas, il est plus rapide d'ouvrir un nouvel objet Recordset directement depuis un objet Database en spcifiant une requte SQL complte l'argument source.

Dim oDb as DAO.Database Dim oRstFiltre as DAO.Recordset 'Instancie la base de donnes Set oDb=CurrentDb 'Ouvre un curseur retournant tous les clients rsidant Paris Set oRstFiltre=oDb.OpenRecordset("SELECT * FROM TblClients WHERE Ville=" & Chr(34) & "Paris" & Chr(34)",dbOpenDynaset '*************************************** 'ici, traitement sur le recordset filtre '*************************************** 'Libration des objets oRstFiltre.Close oDb.Close Set oRstFiltre=Nothing Set oDb=Nothing

5.5 - Lecture par bloc

- 81 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

5.5.1 - Gnralits
La lecture par bloc est un point trs important mais malheureusement fort oubli de DAO. En effet, la mthode GetRows permet de retourner un tableau possdant un nombre donn d'enregistrements. Ces enregistrements sont extraits partir de la position courante du Recordset. La syntaxe est la suivante :
Set varArray = recordset.GetRows (numrows)

VarArray est un tableau deux dimensions recevant les donnes. Le premier indice correspond au champ et le second au numro de l'enregistrement. Recordset est le recordset possdant les donnes. Numrows correspond au nombre d'enregistrements lire. Dans le cas o le nombre d'enregistrements disponibles est infrieur au nombre extraire, la mthode GetRows retourne un tableau dont le nombre d'lment sera gal au nombre d'enregistrements disponibles. Il est donc conseill d'utiliser la mthode UBound pour connaitre la borne suprieure du tableau. Aprs extraction, la position courante du Recordset est dfinit sur l'enregistrement suivant le dernier lu, vous pouvez donc enchaner une autre lecture vers l'avant. Dans le cas o vous souhaiteriez lire les X enregistrements prcdents, il vous faut atteindre le premier enregistrement lire l'aide de l'instruction Move. (Sans toutefois atteindre la position BOF) Lorsque le nombre de donnes lire devient important, il s'avre que l'utilisation de la mthode GetRows pour accder aux donnes reprsente un gain de rapidit pouvant atteindre 20 %.

5.5.2 - Exemple
Cet exemple met en oeuvre l'utilisation de la mthode GetRows afin de raliser un formulaire affichant les enregistrements par blocs de 10. Les donnes proviennent de la table Clients de la base de donnes Comptoir.mdb (Rpertoire samples d'Access). De cette table, nous conserverons uniquement les champs suivants : Code Client, Socit, Ville, Pays Notre formulaire ce compose ainsi :

- 82 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Chaque zone de texte est indpendante et possde un nom gal celui de sa colonne, concatn avec le numro de l'enregistrement quelle affichera. Nous utiliserons deux variables dans la porte du formulaire :
Dim oRstClient As DAO.Recordset 'Stocke le curseur Dim intnbLus As Integer 'Stocke le nb d'enregistrements lus la dernire fois

Le principe est simple, l'ouverture du formulaire, nous chargons le Recordset et affichons les 10 premiers enregistrements.
Private Sub Form_Load() Dim oDb As DAO.Database 'Instancie la base de donnes Set oDb = CurrentDb 'Ouvre le recordset Set oRstClient = oDb.OpenRecordset("Clients", dbOpenTable) 'Lit les 10 premiers LectureVersLAvant End Sub Private Sub LectureVersLAvant() On Error GoTo err RemplirZoneTexte oRstClient.GetRows(10) Exit Sub err: 'Si on est sur le dernier enregistrement - 83 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN 'alors ne rien faire, sinon avertir If err.Number <> 3021 Then MsgBox "Une erreur est survenue pendant la lecture des donnes", vbCritical, "Erreur" End If End Sub

La procdure RemplirZonetexte boucle sur chaque ligne du tableau et affiche la valeur du champ dans la zone de texte correspondante pour la ligne slectionne. Les autres lignes sont ensuites masques.
Sub RemplirZoneTexte(Tableau As Variant) Dim I As Integer 'Rcupre le nombre d'enregistrements Lus intnbLus = UBound(Tableau, 2) + 1 'affecte les valeurs aux zones de texte For I = 0 To intnbLus - 1 'Affiche le code client Controls("TCodeClient" & I + 1) = Tableau(0, I) Controls("TCodeClient" & I + 1).Visible = True 'Affiche la societe Controls("TSociete" & I + 1) = Tableau(1, I) Controls("TSociete" & I + 1).Visible = True 'Affiche la ville Controls("TVille" & I + 1) = Tableau(2, I) Controls("TVille" & I + 1).Visible = True 'Affiche le pays Controls("TPays" & I + 1) = Tableau(3, I) Controls("TPays" & I + 1).Visible = True Next I 'Masque les autres zones de textes For I = intnbLus + 1 To 10 'Masque le code client Controls("TCodeClient" & I).Visible = False 'Masque la societe Controls("TSociete" & I).Visible = False 'Masque la ville Controls("TVille" & I).Visible = False 'Masque le pays Controls("TPays" & I).Visible = False Next I End Sub

Les dplacements vers l'arrire sont plus complexes tant donn que si nous avons lu les 20 premiers, la position courante du Recordset est dfinie 21 et les enregistrements 11 20 sont affichs. Or, la plage souhaite est celle des lignes 1 10. Nous devons donc reculer du nombre d'enregistrements lu la prcdente fois et nous positionner 10 enregistrements en arrire pour commencer la lecture. Toutefois, il se peut que ce nombre de sauts excde le nombre d'enregistrements disponibles vers l'arrire. Le plus simple est alors d'intercepter l'erreur leve (3021) afin de ne pas stopper l'xecution et de se positionner sur le premier enregistrement du curseur.
Private Sub LectureVersLArriere() On Error GoTo err 'Recule du nombre d'enregistrements ncessaire oRstClient.Move -1 * intnbLus - 10 RemplirZoneTexte oRstClient.GetRows(10) Exit Sub err: Select Case err.Number 'Si on a trop recul alors, se positionner sur le premier Case 3021: oRstClient.MoveFirst 'Sinon, Avertir Case Else: MsgBox "Une erreur est survenue pendant la lecture des donnes", vbCritical, "Erreur" End Select End Sub

Vous pouvez aisment obtenir une interface ressemblant ceci :

- 84 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Vous pouvez tlecharger le fichier exemple ici.

5.6 - Liste des proprits


Cette section rcapitule l'ensemble des proprits appliquables au Recordset DAO.

5.6.1 - AbsolutePosition
Type : Long La proprit AbsolutePosition correspond un numro reprsentant la position courante dans le Recordset. Le premier enregistrement possde la position zro. En affectant cette proprit une valeur comprise entre 0 et le nombre d'enregistrements - 1, le curseur va se dplacer de telle sorte atteindre l'enregistrement spcifi. Toutefois, privilgiez l'utilisation de la proprit Bookmark pour mmoriser une position et y retourner. Dans le cas o le jeu d'enregistrements est vide, cette proprit renvoie -1. Elle ne s'applique pas aux Recorset de type Table (dbOpenTable) ni En avant seulement (dbOpenForwardOnly).

5.6.2 - BOF
Lecture seule. Type : Boolean Lorsque la proprit BOF d'un Recordset est gale True, cela signifie que la position courante du curseur est dfinie avant le premier enregistrement.
- 85 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Cette proprit s'applique tous les types de Recordset.

5.6.3 - Bookmark
Type : Variant La proprit Bookmark correspond un signet identifiant de manire unique l'enregistrement au sein du Recordset. Cette proprit est utiliser pour mmoriser une position ou se dplacer dans le jeu. Un exemple est disponible dans la section intitule : 5.3.3 Mmoriser une position. Cette proprit ne s'applique pas aux Recordset de type En avant seulement (dbOpenForwardOnly). Les signets ne sont pas utilisables lorsque la proprit Bookmarkable est gale False.

5.6.4 - Bookmarkable
Lecture seule. Type : Variant La proprit Bookmarkable renvoie True lorsque le curseur accepte les signets (Ce qui est automatiquement le cas pour une base de donnes Access). Si vous travailler en liaison avec certains SGBD, il est ncessaire de tester cette valeur avant d'utiliser la proprit Bookmark. Cette proprit ne s'applique pas Recordset de type En avant seulement (dbOpenForwardOnly).

5.6.5 - CacheSize
Type : Long La proprit CacheSize correspond au nombre d'enregistrements stocks en mmoire cache. Sa valeur doit tre comprise entre 5 et 1200 sans dpasser la quantit de mmoire disponible. La valeur 0 dsactive l'utilisation de la mmoire cache. Cette proprit est utilisable uniquement avec les Recordset de type dynamique ou instantan et lorsque les donnes proviennent d'une source ODBC.

5.6.6 - CacheStart
Type : String La valeur de la proprit CacheStart correspond au signet du premier enregistrement de l'objet Recordset placer en mmoire cache. Vous pouvez utiliser le signet de tout enregistrement pour dfinir la proprit CacheStart. Cette proprit est utilisable uniquement avec les Recordset de type dynamique ou instantan et lorsque les donnes proviennent d'une source ODBC. Cette proprit tant trs bien documente dans l'aide, je vous renvoie vers cette dernire pour de plus amples dtails

- 86 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

5.6.7 - Connection
Lecture seule. Type : Connection Dans un environnement ODBC Direct, la proprit Connection renvoie l'objet Connection depuis lequel le Recordset a t ouvert. Cette proprit n'est pas disponible pour les curseurs de type Table.

5.6.8 - DataCreated
Lecture seule. Type : Date Pour un Recordset de type Table, cette proprit retourne la date de cration de la table.

5.6.9 - EditMode
Lecture seule. Type : Long La proprit EditMode renvoie une valeur indiquant l'tat de modification de l'enregistrement courant. Il s'agit d'une des constantes suivantes : Constante Signification Aucune opration de modification en cours. La mthode Edit a t invoque et l'enregistrement actuel est dans le tampon de copie. (La mthode Update n'a pas encore t appele) La mthode AddNew a t invoque et l'enregistrement actuel dans le tampon de copie est un nouvel enregistrement qui n'a pas t enregistr dans la base de donnes.

dbEditNone

DbEditInProgress

dbEditAdd

Cette proprit s'applique tous les types de Recordset. Ainsi dans un code complexe, il est possible de connaitre le statut de votre Recordset. Ainsi, pour savoir si nous sommes sur le point de valider l'ajout d'un enregistrement, nous devrons valuer :
If oRecordset.EditMode=dbEditAdd then Msgbox "Un ajout est en cours"

Toutefois, si votre code est bien structur, vous devez tre capable de connaitre le statut de votre curseur chaque ligne de code. L'utilisation de cette proprit doit donc se limiter a des cas extrmes, ou pour debugguer un code existant.
- 87 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

5.6.10 - EOF
Lecture seule. Type : Boolean Lorsque la proprit EOF d'un Recordset est gale True, cela signifie que la position courante du curseur est dfinie aprs le dernier enregistrement. Cette proprit s'applique tous les types de Recordset.

5.6.11 - Fields
Lecture seule. Type : Collection Cette collection regroupe l'ensemble des champs du Recordset. De plus amples informations sur les objets Field sont disponibles dans la section 4.4 L'objet Field. Cette proprit s'applique tous les types de Recordset.

5.6.12 - Filter
Type : String La proprit Filter permet de spcifier un filtre qui sera appliqu lors de l'appel de la mthode OpenRecordset. Il s'agit de la clause WHERE d'une requte SQL (sans le mot cl WHERE). De plus amples informations sont disponibles dans la section 5.4.6 Filtrer les donnes.

5.6.13 - Index
Type : String La proprit Index correspond au nom de l'index utilis dans un Recordset pour rechercher les enregistrements dans un Recordset de type Table exclusivement.

5.6.14 - LastModified
Lecture seule. Type : Variant Cette proprit retourne un signet pointant vers le dernier enregistrement modifi ou ajout au jeu d'enregistrements. Vous pouvez atteindre ensuite cet enregistrement en affectant ce signet la proprit Bookmark. Exemple :
With oRecordset .Bookmark=.LastModified End With - 88 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Cette proprit s'applique tous les types de Recordset hormis le type En avant seulement (dbOpenForwardOnly).

5.6.15 - LastUpdated
Lecture seule. Type : Date La proprit LastUpdated retourne la date laquelle la table d'un Recordset a t modifie pour la dernire fois. Elle n'est appliquable qu'aux objets Recordset de type Table.

5.6.16 - LockEdits
Type : Boolean Cette proprit dfinit le type de verrouillage utilis par le Recordset. Lorsque'elle est gale True (Valeur par dfaut), la page est verrouille ds l'appel de la mthode Edit. Dans le cas contraire (False), la page d'enregistrements est verrouille uniquement lors de l'appel de la mthode Update.

5.6.17 - Name
Type : String La proprit Name reprsente le nom de l'objet. Cette proprit est inutile dans l'utilisation des Recordset tant donn que ceux-ci ne sont pas nomms. Cette proprit est en fait gale aux 256 premiers caractres de l'argument Source utilis lors de la mthode Database.OpenRecordset.

5.6.18 - NoMatch
Lecture seule. Type : Boolean La proprit NoMatch est gale True lorsque l'une des mthodes Find.... n'a pas trouv d'enregistrement vrifiant le critre.

5.6.19 - PercentPosition
Type : Single La proprit PercentPosition correspond une valeur 0 100 indiquant la position approximative dans le Recordset. Bien que vous puissiez la dfinir pour vous dplacer, elle est de faible intrt en criture car approximative. Elle n'est appliquables qu'aux Recordset de type Table, Dynaset et instantan. Vous devez avoir atteint le dernier enregistrement afin que sa valeur soit significative par rapport la globalit du Recordset. Sinon, cette proprit ne se base pas sur le nombre d'enregistrements total mais parcourus. Pour atteindre le dernier enregistrement, vous pouvez utiliser la mthode MoveLast.

- 89 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

5.6.20 - Properties
Lecture seule. Type : Collection Cette collection regroupe l'ensemble des proprits du Recordset, comme spcifi dans la section 4.2 Proprits spcifiques.

5.6.21 - RecordCount
Lecture seule. Type : Long La proprit RecordCount retourne le nombre d'enregistrements total d'un Recordset de type Table ou le nombre d'enregistrements auxquels vous avez eu accs dans un Recordset d'un autre type. Elle n'est pas appliquable aux Recordset de type En avant seulement (dbOpenForwardOnly) De plus amples informations sur cette proprit sont disponible dans la section intitule 5.4.5 Compter les enregistrements

5.6.22 - Restartable
Lecture seule. Type : Long Lorsque cette proprit est gale True, cela signifie qu'il est possible de mettre les donnes jour en rexcutant la requte l'aide de Requery. En d'autres thermes, elle indique si la mthode Requery est supporte par le Recordset. Dans le cas contraire, vous devrez rouvrir le curseur l'aide de la mthode OpenRecordset de l'objet Database ou QueryDef utilis pour y puiser les donnes. Elle est utilisable sur tout type de Recordset, toutefois, elle renvoie toujours False pour un Recordset de type Table.

5.6.23 - Sort
Type : String La proprit Sort permet de spcifier un ordre de tri qui sera appliqu lors de l'appel de la mthode OpenRecordset. Il s'agit de la clause ORDER BY d'une requte SQL (sans le mot cl ORDER BY). Ainsi, il est possible d'instancier un nouvel objet Recordset tri depuis un autre :
Dim oDb as DAO.Database Dim oRst as DAO.Recordset Dim oRstTrie as DAO.Recordset 'Instancie la base de donnes Set oDb=CurrentDb 'Ouvre le curseur retournant tous les clients Set oRst=oDb.OpenRecordset("SELECT Ville,NomClient,PrenomClient FROM TblClients" _ ,dbOpenDynaset) 'Tri sur la ville et le nom du client

- 90 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN oRst.Sort="Ville,NomClient" 'Ouvre un nouveau curseur Set oRstTrie=oRst.OpenRecordset '************************************* 'ici, traitement sur le recordset tri '************************************* 'Libration des objets oRst.Close oRstTrie.Close oDb.Close Set oRst=Nothing Set oRstTrie=Nothing Set oDb=Nothing

Cette proprit ne s'applique qu'aux Recordset de type Dynaset et Instantan. Notons toutefois que dans la majorit des cas, il est plus rapide d'ouvrir un nouvel objet Recordset directement depuis un objet Database en spcifiant une requte SQL complte l'argument source.

5.6.24 - StillExecuting
Lecture seule. Type : Boolean Dans un environnement ODBC Direct, la proprit StillExecuting renvoie True si la requte d'ouverture du Recordset est encore en cours d'excution.

5.6.25 - Transactions
Lecture seule. Type : Boolean Lorsque la proprit Transactions d'un objet Recordset est gale True, cela signifie que vous pouvez utiliser les transactions sur ce Recordset. Pour dmarrer une transaction, utilisez la mthode BeginTrans de l'objet Workspace ayant crer le curseur. Invoquez ensuite la mthode CommitTrans pour mettre jour les donnes ou Rollback pour annuler. Exemple :
Dim oRst as DAO.Recordset Dim oDb as DAO.Database Set oDb=CurrentDb Set oRst=oDb.OpenRecordset("TblCommande",dbOpenTable) 'Demarre la transaction DBEngine.Workspaces(0).BeginTrans While Not oRst.EOF 'Passe en mode modification oRst.Edit 'Affecte la date actuelle oRst.Fields("DateCommande").Value=Now() 'Met Jour oRst.Update 'Passe au suivant oRst.MoveNext Wend 'Demande confirmation If Msgbox("Etes vous sr de vouloir continuer")=VbYes - 91 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN 'Si oui, mettre jour DBEngine.Workspaces(0).CommitTrans Else 'Sinon, annuler DBEngine.Workspaces(0).Rollback End if 'Libration des objets oRst.Close oDb.Close Set oRst=Nothing Set oDb=Nothing

5.6.26 - Type
Lecture seule. Type : Long La proprit Type renvoie le type de curseur utilis conformment aux informations spcifies dans la section : 5.2 Les diffrents types de Recordset.

5.6.27 - Updatable
Lecture seule. Type : Boolean Lorsque la proprit Updatable est gale False, il est impossible de mettre jour les donnes du Recordset.

5.6.28 - UpdateOptions
Type : Long La proprit UpdateOptions correspond au mode de cration d'une clause WHERE dans une requte UPDATE lors d'une mise jour par lot dans un environement ODBC Direct. Dans certains cas, il est ainsi possible de contourner un dclencheur Update du SGBD distant en forant le moteur de base de donnes remplacer une requte UPDATE par une requte DELETE suivie d'une requte INSERT. Toutefois, cette proprit ne sera pas d'avantage documente dans ce document et je vous propose de consulter l'aide Access pour plus de dtails.

5.6.29 - ValidationRule
Lecture seule. Type : String La proprit ValidationRule dfinit la rgle de validation qui sera utilise pour valider les donnes lors de l'appel de la mthode Update.

5.6.30 - ValidationText
Lecture seule. Type : String
- 92 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

La proprit ValidationText correspond au message qui sera affich lors d'une mise jour si les donnes ne vrifie pas la rgle spcifie dans ValidationRule.

5.7 - Liste des mthodes


Voici un rcapitulatif des mthodes de la classe Recordset.

5.7.1 - AddNew
La mthode AddNew permet d'ajouter un nouvel enregistrement au Recordset. Elle est illustre dans la section 5.4.3 Ajouter un enregistrement. Exemple :
With oRecordset .AddNew .Fields("Nom")="Toto" .Update End With

5.7.2 - CancelUpdate
La mthode CancelUpdate est invoquer aprs les mthodes Edit ou Addnew pour annuler la mise jour. Dans le cas d'un ajout, la position du Recordset est redfinie ce qu'elle tait avant l'appel de AddNew. Exemple :
With oRecordset .AddNew .Fields("Nom")="Toto" 'Annule l'insertion .CancelUpdate End With

5.7.3 - Clone
La mthode Clone retourne un Recordset identique celui sur lequel elle est applique. Le recordset clon ne possde pas d'enregistrement courant vous devez alors vous positionner sur l'enregistrement de votre choix. Notons que les signets sont interchangeables entre chaque Recordset. Ainsi, il est possible de positionner le clone au mme endroit que la source avec :
Dim oRst as DAO.Recordset Dim oRstClone as DAO.Recordset '**************************** 'ici Code d'ouverture de Rst '**************************** 'Copie du recordset Set oRstClone=oRst.Clone 'Dfinit le mme enregistrement courant oRstClone.Bookmark=oRst.Bookmark

Une fois oRst clon, vous pouvez le fermer sans aucune incidence sur RstClone.

- 93 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Cette mthode n'est pas compatible avec les objets Recordset de type En avant seulement (dbOpenForwardOnly)

5.7.4 - Close
La mthode Close ferme le Recordset. Toutefois, celle-ci ne libre pas la variable objet de la mmoire. Pour la librer, vous devez attendre la fin de la procdure et la destruction de la variable ou affecter Nothing cette dernire. Exemple :
oRecordset.Close Set oRecordset=Nothing

5.7.5 - CreateQueryDef
La mthode CreateQueryDef copie l'objet QueryDef utilis pour ouvrir le Recordset. Celui-ci doit imprativement avoir t ouvert l'aide de la mthode OpenRecordset d'un objet QueryDef. Syntaxe :
Set querydef = oRecordset.CopyQueryDef

Cette mthode ne s'applique pas aux Recordset de type Table (Puisqu'ils ne sont pas ouverts depuis un objet QueryDef).

5.7.6 - Delete
La mthode Delete supprime un enregistrement du Recordset. Elle est illustre dans la section 5.4.4 Supprimer un enregistrement. Une fois l'enregistrement supprim, la position du Recordset n'est plus valide, vous devez donc atteindre un autre enregistrement. Exemple :
With oRecordset .Delete Msgbox "Suppression russie" .MoveNext End With

5.7.7 - Edit
La mthode Edit copie l'enregistrement dans le tampon et passe le Recordset en mode acEditInProgress afin que vous puissiez modifier les donnes. Un exemple d'utilisation est disponible dans la section : 5.4.2 Modifier un enregistrement.

5.7.8 - FindFirst, FindLast, FindNext, FindPrevious


Ces mthodes sont utiliser pour trouver des enregistrements au sein du jeu. Une section complte leur est ddie : 5.3.2 Trouver un enregistrement. Elles ne sont disponibles que pour les Recordset de type Dynaset et Instantan.
- 94 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

5.7.9 - GetRows
La mthode GetRows lit et retourne dans un tableau deux dimensions X enregistrements partir de l'enregistrement courant (X tant un nombre positif spcifi dans le seul argument de GetRows). Un exemple de formulaire lisant les donnes par bloc est disponible dans la section 5.5 Lecture par bloc.

5.7.10 - Move, MoveFirst, MoveLast, MoveNext, MovePrevious


Ces mthodes sont utiliser pour se dplacer au sein du jeu d'enregistrements comme indiqu dans la section 5.3.1 Se dplacer dans un Recordset. Elles sont disponibles pour tout type de Recordset hormis les mthodes MoveFirst et MovePrevious qui oprent des dplacements vers l'arrire et qui sont donc incompatibles avec les curseurs de type En avant seulement (dbOpenForwardOnly).

5.7.11 - OpenRecordset
La mthode OpenRecordset instancie un nouvel objet Recordset possdant la mme source de donnes que le Recordset original mais en tenant compte des ventuelles proprits Filter et Sort. Voici un exemple d'utilisation appliquant un filtre :
Dim oDb as DAO.Database Dim oRst as DAO.Recordset Dim oRstFiltre as DAO.Recordset 'Instancie la base de donnes Set oDb=CurrentDb 'Ouvre le curseur retournant tous les clients Set oRst=oDb.OpenRecordset("SELECT * FROM TblClients",dbOpenDynaset) 'Applique le filtre de slection des habitants de Paris oRst.Filter="Ville=" & Chr(34) & "Paris" & Chr(34) 'Ouvre un nouveau curseur Set oRstFiltre=oRst.OpenRecordset '*************************************** 'ici, traitement sur le recordset filtre '***************************************

Cette mthode n'est pas disponible pour les Recordset de type En avant seulement (dbOpenForwardOnly).

5.7.12 - Requery
La mthode Requery met jour les donnes contenues dans un objet Recordset en excutant de nouveau la requte sur laquelle l'objet est fond. Notons que certains SGBD ne supportent pas l'utilisation de la mthode Requery. Dans ce cas, vous pouvez interroger la proprit Restartable afin de connatre si Requery est applicable.

5.7.13 - Update
La mthode Update permet d'enregistrer les donnes depuis le tampon de copie vers la base de donnes. Cette mthode est invoquer aprs l'affectation des diffrents champs suite un appel la mthode Edit ou AddNew. Pour ne pas enregistrer les donnes, vous devez utiliser la mthode CancelUpdate.

- 95 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Pour de plus amples informations, vous pouvez consulter la section 5.4.2 Modifier un enregistrement.

- 96 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

6 - Conclusion
Tout au long de ce document, vous avez pu constater que DAO offre de multiples possibilits quant la manipulation d'une base de donnes. Toutefois, chaque action doit tre rflchie et en aucun cas vous ne devez perdre de vue que la cohrence et l'intgrit des donnes sont primordiales. A aucun moment vous ne devez prendre le risque de perdre des enregistrements. Depuis quelques annes, DAO tente tre remplac par le modle objet ADO (ActiveX Data Object). Cependant, il reste un moyen simple d'accder votre base de donnes dans du code VBA. La hirarchie du modle DAO tant trs proche de la fentre base de donnes sous Access, son approche est trs intuitive et ne ncessite pas de relles connaissances dans le monde de la programmation oriente objet. Je tiens remercier l'ensemble de l'quipe Access pour ses prcieux conseils et sa relecture ainsi que MED ALAOUI SOSSE pour sa traduction en arabe. Je reste votre disposition par MP pour d'ventuelles remarques.

- 97 Copyright 2005 - WARIN Christophe. Aucune reproduction, mme 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' 3 ans de prison et jusqu' 300 000 E de dommages et intrts.
http://warin.developpez.com/access/dao/