Visual
Visual
Basic pour Applications
Basic pour Applications
DAO
DAO
-
-
ADO
ADO
IQ2 – BDD
© Richard CHBEIR
: richard.chbeir@iut-dijon.u-bourgogne.fr
Bibliographie :
• "VBA pour Access 2000", Edition Eyrolles, ISBN : 2-212-09100-1
• "ASP 3.0 Professionnel", Edition Eyrolles, ISBN: 2-212-09151-6
Plan du chapitre
Plan du chapitre
Introduction
Les composants Access
Les méthodes d'accès aux données
Le modèle DAO
Le modèle ADO
Quelques conseils
Introduction
D
D
é
é
finition
finition
VBA est un langage de programmation commun à tous
les produits Microsoft
Moyen rapide de développer
Permet d'interagir avec l'environnement Windows
Programmation événementielle
Souris: Déplacement, clique du bouton droit, glisser, déplacer, etc.
Clavier: saisie, touche relâchée, etc.
Gestion des fenêtres
Exécution des commandes systèmes
Distinction
Distinction
Ne pourra en aucun cas
s'exécuter de manière
autonome.
Il existe cependant une version "Run time" d'Access,
nommée "Kit Office Développement Environnement
(Kit ODE)", qui permet de distribuer une application
développée sous Access sans avoir à installer Access sur les
postes destinés à faire fonctionner cette application.
Permet de créer des
applications
indépendantes
Complètement lié à un des
produits Microsoft office
VB
VBA
Version 1 et
2 d'Access
Access
Basic
Syntaxe avec le code en couleur
Explorateur d’objets
Aide contextuelle syntaxique depuis les lignes de
code
Possibilité de définir des segments de code se
compilant conditionnellement
Espions
Points d’arrêt
Caract
Environnement de
Environnement de
d
d
é
é
veloppement IDE
veloppement IDE
Déclaration
Fonction
Procédure
Exploration
Propriétés
Fenêtre Code
Comment tester
Comment tester
Fenêtre d
Fenêtre d
’
’
ex
ex
é
é
cution
cution
Ex
Ex
é
é
cution d
cution d
’
’
une proc
une proc
é
é
dure
dure
Les composants Access
Composants majeurs
Composants majeurs
Access comporte deux composants :
Microsoft Jet
Contrôle le stockage des données
Définit les objets de la BD
Le moteur de l’application
Contrôle la programmation
Contrôle l’interface
Comment ça fonctionne ?
Quand vous ouvrez une BD, le moteur de l’application
utilise
Microsoft Jet
pour déterminer les noms des tables, des
requêtes, etc.
Microsoft Jet 4.0
Microsoft Jet 4.0
C'est le
Gestionnaire de fichiers
Gestionnaire de fichiers
Il possède les caractéristiques suivantes :
Moteur à 32 bits
Support Unicode
Jeux de caractères à deux octets par caractère
Types de données compatibles avec SQL Server
SQL 92
Structure simplifi
Structure simplifi
é
é
e du
e du
mod
mod
è
è
le Application
le Application
Application
Screen
DoCmd
Reports
Forms
Control
Properties
Debug
Le langage VBA
Types de donn
Types de donn
é
é
es
es
Byte
entiers positifs compris entre 0 et 255,
Boolean
True et False,
Integer ou %
entiers entre -32 768 et 32 767,
Currency ou @
valeurs entre -922 337 203 685 477,5808 et 922 337 203 685 477,5807
String ou $
Entre 0 et environ 63 Ko de caractères
Long ou &
Types de donn
Types de donn
é
é
es
es
Decimal
Single ou !
Double ou #
Date
pour stocker les dates (
1/01/100 – 31/12/9999
) et les heures
Object
Tous types d'objets,
Variant (Par défaut)
Type de données particulier pouvant contenir des données numériques,
des chaînes ou des dates, des types définis par l'utilisateur ainsi que les
valeurs spéciales Empty et Null
D
D
é
é
clarations
clarations
Des variables (
DIM
)
DIM entier as INTEGER
DIM type as Variant
DIM x(10, 25) as Single
REDIM x(10, 40) as INTEGER
Des constantes (
CONST
)
Const PI As Single = 3.14
Des structures de données définies par l’utilisateur
Type
Adresse
Numero as Integer
NomRue as String * 30
Ville as String * 50
CodePostal as INTEGER
End TYPE
…..
D
D
é
é
clarations
clarations
Des procédures (
SUB
)
Des fonctions (
function
)
Function
NoteAleatoire() As Single
Dim
ValeurAlea
As Single
ValeurAlea = Rnd() * 20
NoteAleatoire = Format(ValeurAlea, "0.0")
End Function
Sub
Attribution_Note_Aleatoire()
Dim
Notes As
Recordset
. . .
Port
Port
é
é
e d'une variable
e d'une variable
Private
Permet de définir des variables privées
Une procédure privée englobe des variables privées
Public (ou Global)
Permet de définir des variables publiques
Static
Permet de (re)définir des variables dont le contenu
est non modifiable
Op
Op
é
é
rateurs
rateurs
Mathématiques
+, -, *, /, ^
De comparaison
<, <, =, <=, >=, <>
Logiques
Branchement et boucles
Branchement et boucles
Instruction IF
IF
(a=5)
Then
…
Else
…
ENDIF
Instruction IIf(condition, truepart, falsepart)
Instruction GOTO
GoTO
Fin
…..
:FIN
Instruction FOR…NEXT
For
i=1
to
10
---Next
i
Instruction While
While
i<=10
---Wend
Branchement et boucles
Branchement et boucles
Instruction DO..LOOP
Do
[{While | Until} condition]
[statements]
Loop
Vous pouvez également utiliser la syntaxe suivante :
Do
[statements]
Loop
[{While | Until} condition]
Instruction Select Case
Select CASE
valeur
Case0 to2 …. Case3 to5 … Case6 Case ELSE
END SELECT
L’instruction CALL
Transfère le contrôle à une procédure ou à une Fonction (interne ou externe)
R
R
é
é
f
f
é
é
rencer des objets
rencer des objets
Plusieurs méthodes :
NomCollection
!
[Nom de l’Objet]
Ex: Forms![Clients]
NomCollection
(
"Nom de l’Objet"
)
Ex: Forms("Clients")
NomCollection(Numéro de l’Objet)
Ex: Forms(0) et Forms(Forms.Count-1)
Pour accéder à un sous-object ou à une méthode, on
utilise aussi le
.
Gestion d
Gestion d
’
’
erreurs
erreurs
On error … ⇒ Génération d'une constante Err
Resume NEXT
Le programme continue sans abandonner
ERL
Renvoie le numéro de la ligne où l’erreur s’est produite
Err.Number
Contient le code de l’erreur
Error$(Err) ou Err.Description
Donne les détails de ERR
On Error GoTo
Err_Click
….
Fonctions int
Fonctions int
é
é
gr
gr
é
é
es
es
Sur les chaînes
Left (chaîne, taille), Right, Replace, etc.
Arithmétiques
ABS, LOG, EXP, etc.
Commandes
CHDIR, CHDRIVE, DIR£, MKDIR, RMDIR, etc.
Heure/date
Date$, Now, etc.
Affichage
Librairies
Librairies
Les librairies proposées dans très variées
Pour les intégrer dans un module:
Dans l'IDE de Visual Basic
Outils/références
M
M
é
é
thodes d'acc
thodes d'acc
è
è
s aux
s aux
donn
M
M
é
é
thodes d'acc
thodes d'acc
è
è
s aux
s aux
donn
donn
é
é
es
es
Plusieurs librairies sont proposées. Mais Principalement
:
DAO (Data Access Objects)
Interface permettant l'accès aux données qui communique avec
Microsoft Jet
et des sources de données compatibles ODBC
pour se connecter à, récupérer, manipuler et mettre à jour des
données et
la structure
de base de données.
ADO (ActiveX Data Objects)
Interface d'accès aux données qui communique avec des
sources de données compatibles
OLE DB
pour la connexion,
la récupération, la manipulation et la mise à jour de données
Le mod
Le mod
Le mod
è
è
le DAO
le DAO
Access
VBA
DAO
ODBCDirect
ODBC
ISAM
dbase
ODBC SQL
Server
ODBC
Oracle
*.mdb
*.dbf
SQL Server
Oracle
Microsoft JET
Caract
Caract
é
é
ristiques de DAO
ristiques de DAO
Adapté à la gestion des BD hétérogènes
Oracle, SQL server, Access, Sybase, Paradox, etc.
Conçu pour des applications client/serveur
Dépend d'un groupe international (et pas de
Microsoft ☺)
Structure du mod
Structure du mod
è
è
le DAO
le DAO
DBEngine
Workspaces
Errors
Connections
Databases
Groups
Users
QueryDefs
Recordsets
TableDefs
Containers
Relations
Parameters
Fields
Indexes
Documents
Acc
Acc
è
è
s
s
à
à
une BD
une BD
Ouverture
OpenDataBase(Name, Exclusif, ReadOnly)
Fermeture
Close
Exemple (Déclaration de trois bases)
Sub Accès_femeture_base()
' 1- Déclaration des bases
DIM MaBD1 As DataBase
DIM MaBD2, MaBD3 As DataBase
. . . .
' 2- Affectation des bases
Set MaBD1 = OpenDataBase("c:\temp\fichierDB1.mdb") ' base locale
Set MaBD2 = OpenDataBase("\\serveur_IUT\Partage\fichierDB2.mdb", TRUE) ' base partagée en mode exclusif
Set MaBD3 = OpenDataBase("fichierDB3.mdb", FALSE, TRUE) ' base locale ouverte en lecture seule
. . . .
' 3- Fermer les bases
Tables
Tables
Création
(d'une table Etudiants avec deux champs Nom et Numéro)
Sub Création_Table()
'1- déclaration de la base
Dim db As database
'1- déclaration d'une variable de type Table
Dim definition_table As TableDef
'1- déclaration d'une variable de type champ
Dim champ_Nom, Champ_Num As Field
. . . .
'2- Affectation
Set db = currentDb()
Set definition_table = db.CreateTableDef("Etudiant")
Set champ_Nom = definition_table.CreateField("Nom", dbText, 50)
Set champ_Num = definition_table.CreateField("Numéro", dbInteger) definition_table.Fields.append champ_Nom
definition_table.Fields.append champ_Num . . . .
Tables
Tables
Suppression
(de la table Etudiants)
Déclaration
(d'une variable qui représente la table Etudiants)
Sub Suppresion_table() '1- déclaration de la base Dim db As database '2- Affectation Set db = currentDb() ' Suppresion de la table Db.TableDefs.Delete "Etudiants" End Sub Sub Attribution_table() '1- déclaration de la base Dim db As Database
Dim definition_table As Recordset
Requêtes
Requêtes
Création
(d'une requête des Clients lyonnais)
Suppression
(de la requête Client lyonnais)
Sub création_requete()
'1- déclaration
Dim db As Database
Dim definition_requete As QueryDef
'2- Affectation
Set db = CurrentDb()
Set definition_requete = db.CreateQueryDef("Clients Lyonnais", "Select * from Clients where Ville='Lyon'")
End Sub Sub Suppresion_requête() '1- déclaration de la base Dim db As database '2- Affectation Set db = currentDb() ' Suppresion de la requete
Requêtes
Requêtes
Déclaration
(de la requête Clients lyonnais)
Sub Attribution_requete()
'1- déclaration de la base
Dim db As Database
Dim requete As Recordset
'2- Affectation
Set db = CurrentDb()
Set requete = db.OpenRecordset("Clients lyonnais", dbOpenDynaset)
End Sub
Sub Attribution_requete_methode2 ()
'1- déclaration de la base
Dim db As Database
Dim requete As Recordset
Dim definition_requete As QueryDef
'2- Affectation
Set db = CurrentDb()
Set definition_requete = db.QueryDefs("Clients lyonnais")
Acc
Acc
é
é
der aux enregistrement
der aux enregistrement
d'une table
d'une table
Plusieurs moyens, mais principalement :
RecordSet
RecordSet
Applicable sur les tables et les requêtes
Trois éléments sont essentiels
La base de données concernée
Les enregistrements dans la base
Le type de RecordSet
Déclaration d'une variable
Pour représenter la table "Clients"
'1- déclaration des variables
Dim
Dim
db
db
As
As
Database
Database
Dim
Dim
tb_clients
tb_clients
As
As
Recordset
Recordset
'2- Affectation
Set
db
=
CurrentDb
()
dbOpensnapshot)
dbOpensnapshot)
DbOpentable)
DbOpentable)
RecordSet
RecordSet
Propose plusieurs méthodes :
De positionnement
MoveFirst | MoveNext | MoveLast | MovePrevious | Move n
BOF, EOF
De recherche
FindFirst | FindLast | FindNext | FindPrevious
De manipulation
Delete
Update
Edit
Addnew
Field
Requery (mise-à-jour)
Diverses
Bookmark
RecordCount
RecordSet
RecordSet
Positionnement sur un enregistrement
Propriété Bookmark
Indique l’enregistrement courant
Cette propriété mise à jour à chaque déplacement dans le recordset
Exemple
Dim
Dim
db
db
As
As
Database
Database
Dim
Dim
tb_clients
tb_clients
As
As
Recordset
Recordset
Dim
Dim
enregistrement
enregistrement
As
As
Variant
Variant
'2
'2
-
-
Affectation
Affectation
Set
Set
db
db
=
=
CurrentDb
CurrentDb
()
()
Set
Set
tb_client
tb_client
=
=
db.OpenRecordset
db.OpenRecordset
("Clients",
("Clients",
dbOpenDynaset
dbOpenDynaset
)
)
tb_client.FindFirst
tb_client.FindFirst
"[Code Client] = 'ANTON'"
"[Code Client] = 'ANTON'"
enregistrement =
enregistrement =
tb_client.Bookmark
tb_client.Bookmark
' on se d
RecordSet
RecordSet
Méthodes
FindFirst | FindLast | FindNext | FindPrevious
Permet de trouver un enregistrement selon un critère donné
utilisation des opérateurs de comparaison, logique, et/ou de
l’opérateur LIKE
Exemple
On veut savoir si on a des clients dont le code commence par A
'1- déclaration des variables
Dim
Dim
db
db
As
As
Database
Database
Dim
Dim
tb_clients
tb_clients
As
As
Recordset
Recordset
'2- Affectation
Set
Set
db = CurrentDb()
db = CurrentDb()
Set
Set
tb_client = db.OpenRecordset("Clients", dbOpenDynaset)
tb_client = db.OpenRecordset("Clients", dbOpenDynaset)
'3
'3
-
-
Rerchercher les clients dont le code commence par A
Rerchercher les clients dont le code commence par A
tb_client.FindFirst "[Code Client] LIKE 'A*'"
tb_client.FindFirst "[Code Client] LIKE 'A*'"
'4
'4
-
-
Affichage d'un message quand l'enregistrement est trouv
Affichage d'un message quand l'enregistrement est trouv
é
é
If
Comment acc
Comment acc
é
é
der
der
à
à
un
un
champ ?
champ ?
• En utilisant
Fields :
stocke les différents champs d ’un enregistrement. Chaque champ est représenté par un objet
instance de la classe Field
Le nombre de Fields est déterminé par la méthode
Count
Remarque : la classe field permet de représenter un champ. On y trouve principalement les
propriétés
name
et
value
qui renvoie respectivement le nom et la valeur du champ.
Exemple
Dim
rs
As
Recordset
rs.Fields("nom_produit")
'valeur du champ nom_produit
rs ("nom_produit")
'valeur du champ nom_produit
rs.[nom_produit]
'valeur du champ nom_produit
rs![nom_produit]
'valeur du champ nom_produit
rs.Fields(1)
'valeur du premier champ
Question 1
Question 1
Comment afficher la liste des champs de la table
"Etudiants" ainsi que le contenu de chaque
champ ?
Sub
afficher_contenu_table_clients()
Dim
db
As
Database
Dim
tb_clients
As
Recordset
Set
db = CurrentDb()
Set
tb_client = db.OpenRecordset("Clients", dbOpenDynaset)
For
i = 0
To
tb_client.Fields.Count - 1
Debug.Print
tb_client.Fields(i).Name
Next
i
While Not
tb_client.EOF
For
i = 0
To
tb_client.Fields.Count - 1
Debug.Print
tb_client.Fields(i).Value
Next
i
Ajout d'un enregistrement
Ajout d'un enregistrement
Elle se fait en respectant les étapes suivantes :
1.
Utiliser la méthode AddNew
du Recordset pour créer un
nouvel enregistrement vide et s’y positionner
2.
Donner une valeur aux champs (Fields) du Recordset
On peut également passer ces valeurs comme paramètres de la
méthode AddNew
3.
Utiliser la méthode Update
du Recordset pour enregistrer le
nouvel enregistrement dans la base
RecordSet
RecordSet
Exemple d'ajout
On veut ajouter le client IQ2 ayant le code 'IUTIQ'
Dim
Dim
db
db
As
As
Database
Database
Dim
Dim
tb_clients
tb_clients
As
As
Recordset
Recordset
Set
Set
db = CurrentDb()
db = CurrentDb()
Set
Set
tb_client = db.OpenRecordset("Clients", dbOpenDynaset)
tb_client = db.OpenRecordset("Clients", dbOpenDynaset)
'1
'1
-
-
Demander la cr
Demander la cr
é
é
ation
ation
Tb_client.AddNew
Tb_client.AddNew
'2
'2
-
-
Fournir les valeurs des champs
Fournir les valeurs des champs
Tb_client.[Code Client] = "IUTIQ"
Tb_client.[Code Client] = "IUTIQ"
Tb_client![Nom] = "IQ2"
Tb_client![Nom] = "IQ2"
'3
'3
-
-
Enregistrer les donn
Enregistrer les donn
é
é
es
es
Tb_client.Update
RecordSet
RecordSet
Modification d ’enregistrements
1. Se positionner sur l ’enregistrement à modifier 2. Utiliser la méthode Edit
3. Modifier la valeur des champs 4. Utiliser la méthode update
Exemple
On veut changer le nom du client dont le code est 'ANTON'
Dim db As Database
Dim tb_clients As Recordset
Set db = CurrentDb()
Set tb_client = db.OpenRecordset("Clients", dbOpenDynaset) tb_client.FindFirst "[Code Client] = 'ANTON'"
' On aurait pu faire directement
'Set tb_client = db.OpenRecordset("Select * from Clients where [Code client] = 'ANTON'")
If Not tb_client.NoMatch Then
'If (tb_client.RecordCount != 0) Then
MsgBox "trouvé" tb_client.Edit
RecordSet
RecordSet
Suppression d ’enregistrements
1.
Se positionner sur l ’enregistrement à supprimer
2.
Utiliser la méthode delete
Remarque : l ’enregistrement courant n ’est plus valide … pensez
donc à le déplacer (avec MoveNext ou autres)
Exemple
Supprimer le client dont le Code est ANTON
Dim db As Database
Dim tb_clients As Recordset
Set db = CurrentDb()
Set tb_client = db.OpenRecordset("Clients", dbOpenDynaset) tb_client.FindFirst "[Code Client] = 'ANTON'"
' On aurait pu faire directement
'Set tb_client = db.OpenRecordset("Select * from Clients where [Code client] = 'ANTON'")