VBA
VBA
VBA
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 "Programmation Access pour Windows 95", Edition Micro Application ISBN : 2-7429-0635-5 "Aide de Microsoft Access", F1
Plan du chapitre
Introduction Les composants Access Les mthodes d'accs aux donnes Le modle DAO Le modle ADO Quelques conseils
richard.chbeir@iut-dijon.u-bourgogne.fr
Introduction
richard.chbeir@iut-dijon.u-bourgogne.fr
Dfinition
VBA est un langage de programmation commun tous les produits Microsoft Moyen rapide de dvelopper Permet d'interagir avec l'environnement Windows
Programmation vnementielle
Souris: Dplacement, clique du bouton droit, glisser, dplacer, etc. Clavier: saisie, touche relche, etc.
richard.chbeir@iut-dijon.u-bourgogne.fr
Distinction
VBA
Compltement li un des produits Microsoft office Ne pourra en aucun cas s'excuter de manire autonome. Permet de crer des applications indpendantes
VB
Access Basic
Il existe cependant une version "Run time" d'Access, nomme "Kit Office Dveloppement Environnement (Kit ODE)", qui permet de distribuer une application dveloppe sous Access sans avoir installer Access sur les postes destins faire fonctionner cette application.
Version 1 et 2 d'Access
richard.chbeir@iut-dijon.u-bourgogne.fr
Caractristiques de VBA
Syntaxe avec le code en couleur Explorateur dobjets Aide contextuelle syntaxique depuis les lignes de code Possibilit de dfinir des segments de code se compilant conditionnellement
Espions Points darrt
richard.chbeir@iut-dijon.u-bourgogne.fr
Proprits
richard.chbeir@iut-dijon.u-bourgogne.fr
Comment tester
Excution dune procdure Fentre dexcution
Print ou ?
richard.chbeir@iut-dijon.u-bourgogne.fr
richard.chbeir@iut-dijon.u-bourgogne.fr
Composants majeurs
Access comporte deux composants :
Microsoft Jet
Contrle le stockage des donnes Dfinit les objets de la BD
Le moteur de lapplication
Contrle la programmation Contrle linterface
Comment a fonctionne ?
Quand vous ouvrez une BD, le moteur de lapplication utilise Microsoft Jet pour dterminer les noms des tables, des requtes, etc.
richard.chbeir@iut-dijon.u-bourgogne.fr
Types de donnes compatibles avec SQL Server SQL 92 Verrouillage amlior des donnes
richard.chbeir@iut-dijon.u-bourgogne.fr
richard.chbeir@iut-dijon.u-bourgogne.fr
Le langage VBA
richard.chbeir@iut-dijon.u-bourgogne.fr
Types de donnes
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 caractres
Long ou &
entier -2 147 483 648 et 2 147 483 647
richard.chbeir@iut-dijon.u-bourgogne.fr
Types de donnes
Decimal Single ou ! Double ou # Date
pour stocker les dates (1/01/100 31/12/9999) et les heures
Object
Tous types d'objets,
richard.chbeir@iut-dijon.u-bourgogne.fr
Dclarations
Des variables (DIM)
DIM entier as INTEGER DIM type as Variant DIM x(10, 25) as Single
REDIM x(10, 40) as INTEGER
richard.chbeir@iut-dijon.u-bourgogne.fr
Dclarations
Des procdures (SUB)
Sub Attribution_Note_Aleatoire() Dim Notes As Recordset . . . End Sub
richard.chbeir@iut-dijon.u-bourgogne.fr
Static
Permet de (re)dfinir des variables dont le contenu est non modifiable
richard.chbeir@iut-dijon.u-bourgogne.fr
Oprateurs
Mathmatiques
+, -, *, /, ^
De comparaison
<, <, =, <=, >=, <>
Logiques
AND, OR, NOT, EQV
richard.chbeir@iut-dijon.u-bourgogne.fr
Branchement et boucles
Instruction IF
IF (a=5) Then Else ENDIF
Instruction FORNEXT
For i=1 to 10 --Next i
Instruction While
While i<=10 --Wend
richard.chbeir@iut-dijon.u-bourgogne.fr
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]
END SELECT
Linstruction CALL
Transfre le contrle une procdure ou une Fonction (interne ou externe) Call MyProc(0)
richard.chbeir@iut-dijon.u-bourgogne.fr
NomCollection("Nom de lObjet")
Ex: Forms("Clients")
NomCollection(Numro de lObjet)
Ex: Forms(0) et Forms(Forms.Count-1)
Gestion derreurs
On error Gnration d'une constante Err Resume NEXT
Le programme continue sans abandonner
ERL
Renvoie le numro de la ligne o lerreur sest produite
Err.Number
Contient le code de lerreur
Error$(Err) ou Err.Description
Donne les dtails de ERR
On Error GoTo Err_Click . Err_Click: MsgBox Err.Number & " : " & Err.Description
richard.chbeir@iut-dijon.u-bourgogne.fr
Fonctions intgres
Sur les chanes
Left (chane, taille), Right, Replace, etc.
Arithmtiques
ABS, LOG, EXP, etc.
Commandes
CHDIR, CHDRIVE, DIR, MKDIR, RMDIR, etc.
Heure/date
Date$, Now, etc.
Affichage
MSGBOX, INPUTBOX$, etc.
richard.chbeir@iut-dijon.u-bourgogne.fr
Librairies
Les librairies proposes dans trs varies Pour les intgrer dans un module: Dans l'IDE de Visual Basic
Outils/rfrences
richard.chbeir@iut-dijon.u-bourgogne.fr
richard.chbeir@iut-dijon.u-bourgogne.fr
Le modle DAO
richard.chbeir@iut-dijon.u-bourgogne.fr
Le modle DAO
Access VBA DAO
ODBCDirect
*.mdb
*.dbf
Oracle
richard.chbeir@iut-dijon.u-bourgogne.fr
Caractristiques de DAO
Adapt la gestion des BD htrognes
Oracle, SQL server, Access, Sybase, Paradox, etc.
Conu pour des applications client/serveur Dpend d'un groupe international (et pas de Microsoft )
richard.chbeir@iut-dijon.u-bourgogne.fr
Relations
TableDefs
Indexes
richard.chbeir@iut-dijon.u-bourgogne.fr
Accs une BD
Ouverture
OpenDataBase(Name, Exclusif, ReadOnly)
Fermeture
Close
' 2- Affectation des bases Set MaBD1 = OpenDataBase("c:\temp\fichierDB1.mdb") ' base locale Set MaBD2 = OpenDataBase("\\serveur_IUT\Partage\fichierDB2.mdb", TRUE) ' base partage en mode exclusif Set MaBD3 = OpenDataBase("fichierDB3.mdb", FALSE, TRUE) ' base locale ouverte en lecture seule
. . . .
' 3- Fermer les bases MaBD1.Close MaBD2.Close MaBD3.Close End Sub richard.chbeir@iut-dijon.u-bourgogne.fr
Tables
Cration (d'une table Etudiants avec deux champs Nom et Numro)
Sub Cration_Table() '1Dim '1Dim '1Dim dclaration de la base db As database dclaration d'une variable de type Table definition_table As TableDef dclaration d'une variable de type champ 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("Numro", dbInteger) definition_table.Fields.append champ_Nom definition_table.Fields.append champ_Num . . . . '3- Sauvegarder Db.TableDefs.Append definition_table End Sub richard.chbeir@iut-dijon.u-bourgogne.fr
Tables
Suppression (de la table Etudiants)
Sub Suppresion_table() '1- dclaration de la base Dim db As database '2- Affectation Set db = currentDb() ' Suppresion de la table Db.TableDefs.Delete "Etudiants" End Sub
Requtes
Cration (d'une requte des Clients lyonnais)
Sub cration_requete() '1- dclaration 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
Requtes
Dclaration (de la requte Clients lyonnais)
Sub Attribution_requete() '1- dclaration 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- dclaration 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") Set requete = definition_requete.OpenRecordset(dbOpenDynaset) End Sub
richard.chbeir@iut-dijon.u-bourgogne.fr
RecordSet
richard.chbeir@iut-dijon.u-bourgogne.fr
RecordSet
Applicable sur les tables et les requtes Trois lments sont essentiels
La base de donnes concerne Les enregistrements dans la base Le type de RecordSet
dbOpensnapshot) DbOpentable)
RecordSet
Propose plusieurs mthodes :
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
richard.chbeir@iut-dijon.u-bourgogne.fr
RecordSet
Positionnement sur un enregistrement
Proprit Bookmark
Indique lenregistrement courant Cette proprit mise jour chaque dplacement dans le recordset
Exemple
Dim db As Database Dim tb_clients As Recordset Dim enregistrement As Variant '2- Affectation Set db = CurrentDb() Set tb_client = db.OpenRecordset("Clients", dbOpenDynaset) tb_client.FindFirst "[Code Client] = 'ANTON'" enregistrement = tb_client.Bookmark ' on se dplace dans les enregistrements donc le bookmark change ' Pour se repositionner l'enregistrement ANTON tb_client.Bookmark = enregistrement
richard.chbeir@iut-dijon.u-bourgogne.fr
RecordSet
Mthodes FindFirst | FindLast | FindNext | FindPrevious
Permet de trouver un enregistrement selon un critre donn
utilisation des oprateurs de comparaison, logique, et/ou de loprateur LIKE
Exemple
On veut savoir si on a des clients dont le code commence par A
'1- dclaration des variables Dim db As Database Dim tb_clients As Recordset '2- Affectation Set db = CurrentDb() Set tb_client = db.OpenRecordset("Clients", dbOpenDynaset) '3- Rerchercher les clients dont le code commence par A tb_client.FindFirst "[Code Client] LIKE 'A*'" '4- Affichage d'un message quand l'enregistrement est trouv If Not tb_client.NoMatch Then MsgBox "trouv" End If
richard.chbeir@iut-dijon.u-bourgogne.fr
Exemple
Dim rs As Recordset rs.Fields("nom_produit") rs ("nom_produit") rs.[nom_produit] rs![nom_produit] rs.Fields(1) rs(1) 'valeur 'valeur 'valeur 'valeur 'valeur 'valeur du du du du du du champ nom_produit champ nom_produit champ nom_produit champ nom_produit premier champ premier champ
richard.chbeir@iut-dijon.u-bourgogne.fr
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 tb_client.MoveNext Wend End Sub
richard.chbeir@iut-dijon.u-bourgogne.fr
Utiliser la mthode AddNew du Recordset pour crer un nouvel enregistrement vide et sy positionner Donner une valeur aux champs (Fields) du Recordset
On peut galement passer ces valeurs comme paramtres de la mthode AddNew
3.
Utiliser la mthode Update du Recordset pour enregistrer le nouvel enregistrement dans la base
On peut utiliser la mthode CancelUpdate pour annuler la cration
richard.chbeir@iut-dijon.u-bourgogne.fr
RecordSet
Exemple d'ajout
On veut ajouter le client IQ2 ayant le code 'IUTIQ'
Dim db As Database Dim tb_clients As Recordset Set db = CurrentDb() Set tb_client = db.OpenRecordset("Clients", dbOpenDynaset) '1- Demander la cration Tb_client.AddNew '2- Fournir les valeurs des champs Tb_client.[Code Client] = "IUTIQ" Tb_client![Nom] = "IQ2" '3- Enregistrer les donnes Tb_client.Update
richard.chbeir@iut-dijon.u-bourgogne.fr
RecordSet
Modification d enregistrements
1. 2. 3. 4.
Se positionner sur l enregistrement modifier Utiliser la mthode Edit Modifier la valeur des champs Utiliser la mthode 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 tb_client.[Nom] = "Richard CHBEIR" tb_client.Update End If richard.chbeir@iut-dijon.u-bourgogne.fr
RecordSet
Suppression d enregistrements
Se positionner sur l enregistrement supprimer 2. Utiliser la mthode delete Remarque : l enregistrement courant n est plus valide pensez donc le dplacer (avec MoveNext ou autres)
1.
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'") tb_client.delete tb_client.MoveNext
richard.chbeir@iut-dijon.u-bourgogne.fr
RecordSet
Tri de donnes
1. 2. 3.
Ouvrir la table ou la requte avec RecordSet Utiliser la mthode Sort Copier le rsultat dans une autre RecordSet
Exemple
Trier les clients par ordre dcroissant
Dim db As Database Dim enregistrement, enregistrement_trie As Recordset Set db = CurrentDb() Set enregistrement = db.OpenRecordset("select * FROM Clients") ' ou Set enregistrement = db.OpenRecordset("Clients", dbOpenDynaset) ' Attention ' Set enregistrement = db.OpenRecordset("Clients") ne marche pas enregistrement.Sort = "Nom DESC" Set enregistrement_trie = enregistrement.OpenRecordset(dbOpenDynaset)
richard.chbeir@iut-dijon.u-bourgogne.fr
Filtre de donnes
Filtre de donnes
1. 2. 3.
Ouvrir la table ou la requte avec RecordSet Utiliser la mthode Filtre Copier le rsultat dans une autre RecordSet
Exemple
Trouver les clients dont le nom est IQ2 ou le code postal commence par 21
Dim db As Database Dim enregistrement, enregistrement_filtre As Recordset Set db = CurrentDb() Set enregistrement = db.OpenRecordset("Clients") , dbOpenDynaset) enregistrement.Filter = "[Nom] = 'IQ2' Or [Code Postal] like '21*'" Set enregistrement_filtre = enregistrement.OpenRecordset(dbOpenDynaset)
richard.chbeir@iut-dijon.u-bourgogne.fr
Le modle ADO
richard.chbeir@iut-dijon.u-bourgogne.fr
Le modle ADO
co OL mm E ate DB u rs
VC++
Access
VBA/VB
ASP
Java
Co n
ADO
Fo u O rnis LE se DB urs
Jet OLE
MSIDXS
Object ADSDSO
SQLOLEDB
MSDASQL
ODBC
*.mdb
Annuaire
richard.chbeir@iut-dijon.u-bourgogne.fr
Fournisseurs OLE DB
Jet OLE DB 4.0
Pour les BD Access
OLAP Services
Pour le serveur OLAP Microsoft (Exchange Server)
Simple Provider
Pour les fichiers de texte simples
Internet Publishing
Pour l'accs aux serveurs Web
DTS packages
Pour les services de conversion de donnes SQL server
richard.chbeir@iut-dijon.u-bourgogne.fr
richard.chbeir@iut-dijon.u-bourgogne.fr
Structure simplifie
Excuter
Connection RecordSet
Source
Command
Connexion Active
Error Field
Excuter
Parameter
richard.chbeir@iut-dijon.u-bourgogne.fr
Exemple
Dim cn As New ADODB.Connection Dim cmd As New ADODB.Command Dim rst As New ADODB.Recordset
richard.chbeir@iut-dijon.u-bourgogne.fr
La classe Connection
Permet la connexion une source de donnes. Un objet de cette classe identifie une et une seule connexion une source de donnes Permet l'excution de commandes
Requte de mise jour, d'insertion, de suppression, etc.
richard.chbeir@iut-dijon.u-bourgogne.fr
Execute
Excute une requte et rcupre le rsultat dans un RecordSet
Dim rs1, rs2 As New ADODB.Recordset Set rs1 = cn.execute("select [nom Client] from Clients") cn.Execute("insert into ma_table values (5, abc, )")
Close
La classe Command
Permet d'excuter des commandes sur une source de donnes (des instructions SQL)
Souvent avec des paramtres
richard.chbeir@iut-dijon.u-bourgogne.fr
La classe Command
Proprits
.CommandText : stocke le texte de la commande
Ex : objet_cmd.CommandText
= "select * from Clients"
.ActiveConnection : permet de choisir la connexion (donc la base) sur laquelle sexcutera la commande
Ex : set objet_cmd.ActiveConnection = cn
richard.chbeir@iut-dijon.u-bourgogne.fr
La classe Command
Mthode
Execute : permet d excuter la commande
Sans paramtre (stocke dans la proprit CommandText) Ex : objet_command.Execute Avec paramtre Ex : objet_command.Execute("select
produits")
* from
richard.chbeir@iut-dijon.u-bourgogne.fr
La classe Command
Exemple
Dim cn As New ADODB.Connection cn.open "DSN=Base_Clients" ' Cela signifie qu'une source de donnes nomme Base_Client existe dj dans ODBC Dim cmd As New ADODB.Command cmd.CommandText = "select * from Clients" Set cmd.ActiveConnection = cn Dim rs As New ADODB.recordset Set rs = cmd.Execute
richard.chbeir@iut-dijon.u-bourgogne.fr
La classe Recordset
Permet de contenir l'ensemble des donnes extraites des sources
Stocke le rsultat de lexcution dune commande sous forme dun ensemble de lignes Seule la ligne courante est visible (Notion de curseur)
richard.chbeir@iut-dijon.u-bourgogne.fr
La classe Recordset
Trois possibilits d'instanciation via la mthode
Execute de Connection
Dim rs As New ADODB.recordset set rs = de cn.execute ("select [nom Client] from Clients") Execute Command
Dim cmd As New ADODB.Command cmd.CommandText = "select * from Produits" set cmd.ActiveConnection = cn Dim rs As New ADODB.recordset set = cmd.Execute Open ders Recordset
richard.chbeir@iut-dijon.u-bourgogne.fr
Conseils
Optimiser votre application
Rduire la consommation de mmoire
Utilisez le bon type de donnes Regroupez les procdures dans les modules Ne chargez pas les bibliothques inutiles
richard.chbeir@iut-dijon.u-bourgogne.fr