Vous êtes sur la page 1sur 96

Dfinition et manipulation de donnes avec DAO

Par Christophe WARIN


Date de publication : 9 mai 2005
Dernire mise jour : 30 juillet 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...............................................................................................................................13
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.......................................................................................................................... 14
3.1.3.5 - CreateWorkspace........................................................................................................................15
3.1.3.6 - Idle...............................................................................................................................................15
3.1.3.7 - OpenDatabase............................................................................................................................ 15
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...........................................................................................................................................17
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............................................................................................................................... 18
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.......................................................................................................................................... 22
3.3.1 - Gnralits.......................................................................................................................................... 22
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
-2-

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' trois ans de prison et jusqu' 300 000 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.................................................................................................................................... 25
3.3.2.6 - QueryDefs................................................................................................................................... 25
3.3.2.7 - RecordsAffected.......................................................................................................................... 25
3.3.2.8 - Recordsets.................................................................................................................................. 26
3.3.2.9 - Relations..................................................................................................................................... 26
3.3.2.10 - TableDefs.................................................................................................................................. 26
3.3.2.11 - Transactions.............................................................................................................................. 26
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............................................................................................................................ 27
3.3.3.3 - CreateQueryDef.......................................................................................................................... 27
3.3.3.4 - CreateRelation............................................................................................................................ 28
3.3.3.5 - CreateTableDef........................................................................................................................... 28
3.3.3.6 - Execute....................................................................................................................................... 28
3.3.3.7 - NewPassword............................................................................................................................. 28
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...........................................................................................................................................32
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....................................................................................................... 34
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
-3-

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' trois ans de prison et jusqu' 300 000 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
-4-

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' trois ans de prison et jusqu' 300 000 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.......................................................................................................................................... 62
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................................................................................................................................ 64
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.............................................................................................................................................85
5.6.4 - Bookmarkable......................................................................................................................................86
5.6.5 - CacheSize........................................................................................................................................... 86
5.6.6 - CacheStart...........................................................................................................................................86
-5-

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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

5.6.7 - Connection...........................................................................................................................................86
5.6.8 - DataCreated........................................................................................................................................ 87
5.6.9 - EditMode..............................................................................................................................................87
5.6.10 - EOF................................................................................................................................................... 87
5.6.11 - Fields................................................................................................................................................. 88
5.6.12 - Filter...................................................................................................................................................88
5.6.13 - Index.................................................................................................................................................. 88
5.6.14 - LastModified...................................................................................................................................... 88
5.6.15 - LastUpdated...................................................................................................................................... 88
5.6.16 - LockEdits........................................................................................................................................... 89
5.6.17 - Name................................................................................................................................................. 89
5.6.18 - NoMatch............................................................................................................................................ 89
5.6.19 - PercentPosition..................................................................................................................................89
5.6.20 - Properties.......................................................................................................................................... 89
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............................................................................................................................................................96

-6-

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' trois ans de prison et jusqu' 300 000 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

Arabe

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

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.

-7-

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' trois ans de prison et jusqu' 300 000 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)

-8-

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' trois ans de prison et jusqu' 300 000 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

-9-

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' trois ans de prison et jusqu' 300 000 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' trois ans de prison et jusqu' 300 000 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' trois ans de prison et jusqu' 300 000 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' trois ans de prison et jusqu' 300 000 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.

3.1.2.10 - Workspaces
Type : Collection
- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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"

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 :

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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

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)

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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 :
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.

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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
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.
- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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.
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.

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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.
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")

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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 :

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
- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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", _
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

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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 :
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.

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

- 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")
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.

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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 :
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

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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
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

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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
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.

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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.

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)

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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)

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.

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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' trois ans de prison et jusqu' 300 000 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' trois ans de prison et jusqu' 300 000 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

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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.
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 :

dbBigInt
dbBinary

Constante

16
9

dbBoolean
dbByte
dbChar

1
2
18

dbCurrency
dbDate
dbDecimal
dbDouble
dbFloat
dbGUID
dbInteger
dbLong
dbLongBinary

5
8
20
7
21
15
3
4
11

dbMemo
dbNumeric
dbSingle
dbText
dbTime
dbTimeStamp
dbVarBinary

12
19
6
10
22
23
17

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)

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
- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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.
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

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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 :
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 :

- 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' trois ans de prison et jusqu' 300 000 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
Set oTbl = oDb.TableDefs("Commande")
oTbl.name= "essai"

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.

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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
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

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

dbSystemObject
dbHiddenObject
dbAttachedTable
dbAttachedODBC

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.

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

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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.

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
- 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' trois ans de prison et jusqu' 300 000 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 vrifient
pas la rgle spcifie dans ValidationRule.

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 :

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

tabledef.RefreshLink

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 :

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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 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' trois ans de prison et jusqu' 300 000 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' trois ans de prison et jusqu' 300 000 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' trois ans de prison et jusqu' 300 000 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 :

dbAutoIncrField

Constante

dbDescending
dbFixedField
dbHyperlinkField
dbSystemField
dbUpdatableField
dbVariableField

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.

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' trois ans de prison et jusqu' 300 000 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' trois ans de prison et jusqu' 300 000 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' trois ans de prison et jusqu' 300 000 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' trois ans de prison et jusqu' 300 000 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 :

dbBigInt
dbBinary

Constante

16
9

dbBoolean
dbByte
dbChar

1
2
18

dbCurrency
dbDate
dbDecimal
dbDouble
dbFloat
dbGUID
dbInteger
dbLong
dbLongBinary

5
8
20
7
21
15
3
4
11

dbMemo
dbNumeric
dbSingle
dbText
dbTime
dbTimeStamp
dbVarBinary

12
19
6
10
22
23
17

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)

- 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' trois ans de prison et jusqu' 300 000 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' trois ans de prison et jusqu' 300 000 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' trois ans de prison et jusqu' 300 000 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' trois ans de prison et jusqu' 300 000 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 :

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Select Case err.Number


Case 3010, 3191: MsgBox "Le champ " & strNouveauNom & " existe dj"
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' trois ans de prison et jusqu' 300 000 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' trois ans de prison et jusqu' 300 000 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

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

'Ajoute l'index la table


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' trois ans de prison et jusqu' 300 000 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' trois ans de prison et jusqu' 300 000 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' trois ans de prison et jusqu' 300 000 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
'Rafrahit la collection Relations
oDb.Relations.Refresh
- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

'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
If oRlt.Table = strNomTable Then
'Pour chaque champ, contrle le nom du champ
- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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")

4.7 - L'objet QueryDef

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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 = oQdf.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
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.

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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.

4.7.2.5 - MaxRecords
Type : Long

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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.
La proprit ReturnsRecords est disponible uniquement pour les requtes SQL directes.

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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
dbQAction
dbQAppend
dbQCompound
dbQCrosstab
dbQDDL
dbQDelete
dbQMakeTable
dbQProcedure
dbQSelect
dbQSetOperation
dbQSPTBulk
dbQSQLPassThrough
dbQUpdate

Signification
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' trois ans de prison et jusqu' 300 000 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 :

dbDenyWrite

Constante

dbInconsistent
dbConsistent
dbSQLPassThrough
dbFailOnError
dbSeeChanges

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

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' trois ans de prison et jusqu' 300 000 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' trois ans de prison et jusqu' 300 000 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' trois ans de prison et jusqu' 300 000 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 :
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 :
- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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 :
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.
- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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 :

dbAppendOnly

Constante

dbSQLPassThrough

dbSeeChanges

dbDenyWrite
dbDenyRead
dbInconsistent
dbConsistent

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

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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

dbReadOnly

Constante

dbPessimistic

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' trois ans de prison et jusqu' 300 000 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' trois ans de prison et jusqu' 300 000 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
strCritere="NomClient LIKE " & chr(34) & "T*" & chr(34)
- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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
'Libration des objets
- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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.

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

CurrentDb.Execute "UPDATE TblCommande SET DateCommande=#" & Now() & "#"

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

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

Set oDb=Nothing

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
- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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 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' trois ans de prison et jusqu' 300 000 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' trois ans de prison et jusqu' 300 000 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' trois ans de prison et jusqu' 300 000 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
'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

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

'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' trois ans de prison et jusqu' 300 000 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.
Cette proprit s'applique tous les types de Recordset.

5.6.3 - Bookmark
Type : Variant
- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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

5.6.7 - Connection
Lecture seule.
Type : Connection

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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 :

dbEditNone

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.

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.

5.6.10 - EOF
Lecture seule.
Type : Boolean
- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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

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

5.6.15 - LastUpdated
Lecture seule.
- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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.

5.6.20 - Properties
Lecture seule.
Type : Collection

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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
oRst.Sort="Ville,NomClient"
'Ouvre un nouveau curseur
Set oRstTrie=oRst.OpenRecordset
'*************************************
'ici, traitement sur le recordset tri
'*************************************
'Libration des objets
oRst.Close

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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
'Si oui, mettre jour
DBEngine.Workspaces(0).CommitTrans
Else
'Sinon, annuler
DBEngine.Workspaces(0).Rollback
End if
'Libration des objets
oRst.Close
- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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
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.

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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.
Cette mthode n'est pas compatible avec les objets Recordset de type En avant seulement (dbOpenForwardOnly)

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Dfinition et manipulation de donnes avec DAO par Christophe WARIN

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' trois ans de prison et jusqu' 300 000 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.
Pour de plus amples informations, vous pouvez consulter la section 5.4.2 Modifier un enregistrement.
- 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' trois ans de prison et jusqu' 300 000 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.

- 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' trois ans de prison et jusqu' 300 000 de dommages et intrts.
http://warin.developpez.com/access/dao/

Vous aimerez peut-être aussi