Vous êtes sur la page 1sur 8

TP3:objectif:prsentationdeADO,utilisationavecleVBA

1. Conceptd'objet
tables,tats,formulaires,requtessontdesobjetsdel'objetapplicationduprojet courant(dansunehirarchieplusimportante): 1.1. objetADO(activeXDataobject): Ilpermetlaconnexionlabasededonnes Sianefonctionnepas:dansOutils/Rfrence: Rajouterl'objet(fichierDLL):MicrosoftOffice12,0ObjectLibrary 1.2. objetVBA ObjetvbadebaseMsgBox.
Subessai1()'moduleVBA MsgBox"hello!" EndSub

1.3. objetACCESS Cesontprincipalementtouslesobjetsgraphiquesd'unformulaireoud'untat. VBAauneinteractionlimiteavecACCESS,onutilisedoncl'objetADOpouraccder auxdonnes.

2. ADO
ADO(ActiveXDataObject)estuncomposantActiveXpermettantd'accderauxbases dedonnesdefaonbeaucoupplusfacilesanssesoucierdetoutcequiestallocation desenvironnementsdetravail(cf.programmationaveclacouchebassed'ODBC). ADOfournitdesobjetsquipermettentdeseconnecter unebaseetderaliserdes requtesSQLsurcettebase. PourpouvoirutiliserADOdansunprojetVisualBasicvousavezdeuxsolutionspoury parvenir: LapremireestdecrerunProjetdedonnes. LasecondeestderajouterdanslemenuProjetsRfrences,MicrosoftAtiveX DataObjects2.xLibrary. ADOproposelesobjetssuivants: Connection:connexionunesourcededonnes(aussibienunfichier texte,qu'unfichierExcel,ouunebasededonnes) Recordset:jeud'enregistrementsretournslorsdel'excutiond'un SELECToud'unecommandeSQL:structuredquerylanguage(appel curseur),ilexistediffrentscurseursetdiffrentstypedeverrouillage, leurqualitdeserviceetdescuritestinversementproportionnelle leurtempsd'excution.(pourplusd'informations)
Error:ensembledeserreursretournesparleSGBD Parameter:permetdedfinirunparamtred'unerequte Command:permetd'excuterdesrequtes

2.1. laconnexion ADOfournitlesoutilspourseconnecterunemultitudedebasededonnes(oracle, mysql,access.)

VBA_ACCESS_TP3_01_12.odt

05/02/12

Sansrentrerdanslesdtails,voiciunefaonsimpledeseconnecterunebasede donnes. Pourplusd'informations: http://drq.developpez.com/vb/tutoriels/ADO/Chapitre2/


SubMaPremiereConnexion() Dimconnex1AsADODB.Connection'connexionunebaseADO(ActiveXdataobject) DimrecSet1AsADODB.Recordset Setconnex1=CurrentProject.Connection SetrecSet1=NewADODB.Recordset

DanslasuitedecodeondfinitunobjetdetypeRecordset. L'objetRecordset,permetd'excuterunecommandeetdercuprerunensemble d'enregistrements.(VouspouvezutilisercetobjetpourfairedesUPDATE,DROP, ALTER,...)


Ilexisteaussil'objetCommandmaisnousnel'aborderonspas.

2.2. larequte
'pourunetablerecSet1.Open"tblClient",connex1

DimstrSQL1AsString strSQL1="select*FROMEtudiantORDERBYETU_Nom" recSet1.OpenstrSQL1,connex1

crirelarequtequevousvoulezeffectueretl'excuterl'aidedel'objetdetype Recordset. 2.3. Rcuprationdesenregistrementspouruneslectiondansunebasede donnes


DoUntilrecSet1.EOF Debug.PrintrecSet1.Fields("ETU_Nom"),recSet1.Fields("ETU_Ville") recSet1.MoveNext Loop recSet1.Close'fermelaconnexion connex1.Close Setconnex1=Nothing'supprimelesobjetsdelammoire
SetrecSet1=Nothing

Mthodespermettantdenaviguerdansl'ensembledesenregistrements: MoveFirst:slectionnelepremierenregistrement* MoveLast:slectionneledernierenregistrement* MoveNext:slectionnel'enregistrementsuivant MovePrevious:slectionnel'enregistrementprcdent* Propritsdel'objetRecordset: BOF(BeginOfFile):estvraisil'objetRecordsetpointesurledbut d'enregistrement EOF(EndOfFile):estvraisil'objetRecorsetpointesurlafinde l'enregistrement (*attention:seulscertainstypesderecordSetautorisentl'utilisationdeces mthodes!)

VBA_ACCESS_TP3_01_12.odt

05/02/12

Remarque:aveclesdriversPHP(PDOetmysqli)onnepeutpasfairederetouren arrireenlisantdesenregistrements. L'ASP(langagedemicrosoftconcurentdePHP)possdelammesyntaxequeleVBA: http://www.w3schools.com/asp/default.asp OnpeututiliserADOpouraccderunebasededonnessurunsitewebenASPde lammefaonquesurACCESS http://www.w3schools.com/ado/

3. exercices
Cesexercicesn'utilisentpasd'interfacegraphique 3.1. Exercice 1 : Modifiervotrecodepourafficheruneentte(module2)
* NOM * BAILLIT BERNARD BOISSENIN BONVALOT BOULANGER ............ * VILLE * Montbeliard Belfort Belfort Belfort Belfort

solution

3.2. Exercice2(module3) crireunerequtepourmodifierlenomdevilleparBelfortlorsquelenom del'tudiantestcommeRIOT. Raliserunprocdure(fonction)pour: Saisirlenomd'untudiant,saisirlenomd'unevilledansdesfentres InputBox. Modifierlacassedelachanedecaractresquiestsaisie(utiliserVBA.UCase ou Lcase) : Mettreenmajusculelenomdel'tudiant, Mettrelapremirelettreenmajusculepuisleresteenminuculedunomde laville:VBA.UCase(VBA.mid(nom_ville,1,1) & VBA.Lcase(VBA.mid(nom_ville,2))pourlenomdelaville. Modifierlechampvilledetouslestudiantsquipossdentcenom.
http://fr.wikipedia.org/wiki/Casse_%28typographie%29 http://fr.wikipedia.org/wiki/Capitale_et_majuscule solution

3.3. Exercice3(module 4) crireunerequtepoursupprimerlestudiantsdontlenomestcomme Toto. Raliserunprocdure(fonction)poursaisirunnomd'tudiant(fentre inputBox)etsupprimertouslestudiantsquipossdentcenom(Mettrele nomenmajusculeavantd'excuterlarequte). Pourfairevosessais,rajouterdestudiantsdanslatableETUDIANT.


solution

VBA_ACCESS_TP3_01_12.odt

05/02/12

3.4. Exercice4(module 5) crireunerequte pour insrer un tudiant de nom BERNARD et de ville Belfort . Raliserunprocdure(fonction)pourlirelenomd'untudiant.Insrercet tudiantdanslatabletudiant.
Solution

4. Typederecordset(pourlesplusrapides):
Type de curseur : (contrle la manire dont on navigue dans le recordset ) : cette liste classe les curseurs par ordre de performance, plus vous pouvez agir sur le recordset plus il est lent.
Dynamique(adOpenDynamic):Position>Oui;Dfilement>Bidirectionnel;Sensibilit>Refltetoutesles modificationsdedonnesainsiquelesenregistrementsajoutsousupprimspard'autresutilisateurs.Cescurseurs, uniquementserveur,n'estpassupportpartouslesfournisseurs. Jeudecl(adOpenKeyset):Position>Oui;Dfilement>Bidirectionnel;Sensibilit>Reflteles modificationsdedonnesmaisnepermetpasdevoirlesenregistrementsajoutspard'autresutilisateurs.Demande d'treutilisavecdestablesindexes.Trsrapidecarilnechargepaslesdonnesmaisjustelescls. Statique(adOpenStatic):Position>Oui;Dfilement>Bidirectionnel;Sensibilit>Pasdemisejourdes donnesmodifies;Copiededonnes.Lescurseursctclientsonttoujoursstatiques. Dedfilementavantseulement(adOpenForwardOnly);apeuttrelavaleur pardfaut ; Position>Non ; Dfilement>Enavant ;Sensibilit>Pasdemisejourdesdonnesmodifies;Cetypedecurseurestleplus rapide.Idalpourlalecturededonnesenunseulpassage.

Typedeverrouillage(utilepourrsoudredesconflitsdemodification d'enregistrementsdansunenvironnementmultiutilisateur)
adLockReadOnly:L'ensembledurecordSetestverrouilllorsd'unemodification. adLockPessimistic:unseulenregistrementestverrouilllorsd'unemodification.Cemodedeverrouillageprendeffet aumomentdel'ditiondel'enregistrement.Lefournisseurposeunverrousurl'enregistrementsd squel'utilisateur tented'enmodifierunevaleur(onditl'dition).Leverroudurejusqu'lavalidationdesmodifications.Uneerreur rcuprableseproduitlorsqu'unutilisateurtentedemodifierunenregistrementverrouill . AdLockOptimistic:empchelesconflitsenneverrouillantl'enregistrementqu'aumomentdesasauvegarde.Cela empchedeuxutilisateursdesauvegarderaummemomentunenregistrementmodifi. AdLockBatchOptimistic : Les enregistrements sont verrouills quand ils sont mis jour par lot .

4.1. Exercice 5 : (module 6) Modifier votre code pour afficher les 5 avant derniers tudiants par ordre dcroissant (module 6) Solution1:utiliserdansvotrerequtelesmotsclefsDESCetd'autresmotsclefset n'afficherquedu1au6enregistrements,puissedplacerd'unseulenregistrement. Puismettreencommentairelarequte. remarque:
//mysql selectcolfromtbllimit20; //Oracle selectcolfromtblwhererownum<=20; //MicrosoftSQL(topoufirst) selecttop20colfromtbl;

VBA_ACCESS_TP3_01_12.odt

05/02/12

rsultat:
ZILLIOX VERNET VALZER VALOT RIOT Bavilliers Bavilliers Valdoie Belfort Montbeliard

solutionpossible

4.2. Exercice 6 : (module 7) Modifier votre code pour afficher les 5 avant derniers tudiants par ordre dcroissant Solution2:mettreuncompteuretafficherdu2au6dansl'ordredescendant 4.3. Exercice 7 : (module 8) Modifier votre code pour afficher les 5 avant derniers tudiants par ordre croissant (module 3) Solution3:dplacerlecurseuraudernierenregistrement,dplacerlecurseur l'enregistrementprcdentetlireles5prcdentsavecuneboucle.
############## solution 3 ########### RIGOULOT Valdoie RIOT Montbeliard VALOT Belfort VALZER Valdoie VERNET Bavilliers

attention,siMovePreviousetMoveLastnesontpasfonctionnels,rajouterles options:adOpenDynamic,adLockOptimistic(parexemple)lorsdel'ouverturedela connexion:


recSet1.OpenstrSQL1,connex1,adOpenDynamic,adLockOptimistic

ou
recSet1.CusorType=adOpenDynamic recSet1.LockType=adLockOptimistic

VBA_ACCESS_TP3_01_12.odt

05/02/12

Module1
OptionCompareDatabase SubMaPremiereConnexion() Dimconnex1AsADODB.Connection'connexionunebaseADO(ActiveXdataobject) DimrecSet1AsADODB.Recordset Setconnex1=CurrentProject.Connection SetrecSet1=NewADODB.Recordset 'pourunetablerecSet1.Open"tblClient",connex1 DimstrSQL1AsString strSQL1="SELECT*FROMEtudiantORDERBYETU_nom" recSet1.OpenstrSQL1,connex1 DoUntilrecSet1.EOF Debug.PrintrecSet1.Fields("ETU_Nom"),recSet1.Fields("ETU_Ville") recSet1.MoveNext Loop recSet1.Close'fermelaconnexion connex1.Close Setconnex1=Nothing'supprimelesobjetsdelammoire SetrecSet1=Nothing EndSub

Module2
SubExercice2() Dimconnex1AsADODB.Connection'connexionunebaseADO(ActiveXdataobject) DimrecSet1AsADODB.Recordset Setconnex1=CurrentProject.Connection SetrecSet1=NewADODB.Recordset 'pourunetablerecSet1.Open"tblClient",connex1 DimstrSQL1AsString strSQL1="SELECT*FROMEtudiantORDERBYETU_nom" recSet1.OpenstrSQL1,connex1 Debug.Print"","" Debug.Print"*NOM*","*VILLE*" Debug.Print"","" DoUntilrecSet1.EOF Debug.PrintrecSet1.Fields("ETU_Nom"),recSet1.Fields("ETU_Ville") recSet1.MoveNext Loop recSet1.Close'fermelaconnexion connex1.Close Setconnex1=Nothing'supprimelesobjetsdelammoire SetrecSet1=Nothing EndSub

Module3
UPDATEETUDIANTSETETUDIANT.ETU_ville='Belfort' WHEREETUDIANT.ETU_nomlike'RIOT';
SubExercice6() Dimconnex1AsADODB.Connection'connexionunebaseADO(ActiveXdataobject) DimrecSet1AsADODB.Recordset Setconnex1=CurrentProject.Connection SetrecSet1=NewADODB.Recordset DimstrSQL1AsString Dimnom_etudiant,nom_villeAsString Debug.Print"##############exercice:saisiedunometdelaville###########" nom_etudiant=InputBox("saisissezlenomdel'tudiant") nom_etudiant=VBA.UCase(nom_etudiant) nom_ville=InputBox("saisissezlenomdelaville") nom_ville=VBA.UCase(VBA.Mid(nom_ville,1,1))&VBA.LCase(VBA.Mid(nom_ville,2)) strSQL1="UPDATEETUDIANTSETETUDIANT.ETU_ville='"&nom_ville&"'where ETUDIANT.ETU_nomlike'"&nom_etudiant&"'" Debug.Print"##############exercice:requete###########" Debug.PrintstrSQL1 recSet1.OpenstrSQL1,connex1

VBA_ACCESS_TP3_01_12.odt

05/02/12

connex1.Close Setconnex1=Nothing'supprimelesobjetsdelammoire SetrecSet1=Nothing EndSub

Module4

DELETEFROMETUDIANTWHEREETUDIANT.ETU_nomlike"toto";
SubExercice7() Dimconnex1AsADODB.Connection'connexionunebaseADO(ActiveXdataobject) DimrecSet1AsADODB.Recordset Setconnex1=CurrentProject.Connection SetrecSet1=NewADODB.Recordset DimstrSQL1AsString Dimnom_etudiant,nom_villeAsString Debug.Print"##############exercice:saisiedunometdelaville###########" nom_etudiant=InputBox("saisissezlenomdel'tudiant") nom_etudiant=VBA.UCase(nom_etudiant) strSQL1="DELETEFROMETUDIANTWHEREETUDIANT.ETU_nomlike'"&nom_etudiant&"'" Debug.Print"##############exercice:requete###########" Debug.PrintstrSQL1 recSet1.OpenstrSQL1,connex1 connex1.Close Setconnex1=Nothing'supprimelesobjetsdelammoire SetrecSet1=Nothing EndSub

Module5
INSERTintoETUDIANT(ETU_nom,ETU_ville)VALUES('BERNARD','Belfort');
SubExercice8() Dimconnex1AsADODB.Connection'connexionunebaseADO(ActiveXdataobject) DimrecSet1AsADODB.Recordset Setconnex1=CurrentProject.Connection SetrecSet1=NewADODB.Recordset DimstrSQL1AsString Dimnom_etudiant,nom_villeAsString Debug.Print"##############exercice:saisiedunometdelaville###########" nom_etudiant=InputBox("saisissezlenomdel'tudiant") nom_etudiant=VBA.UCase(nom_etudiant) strSQL1="INSERTintoETUDIANT(ETU_nom)VALUES('"&nom_etudiant&"')" RemINSERTintoETUDIANT(NULL,'TYTY',NULL,NULL,NULL,NULL,NULL,NULL,NULL)nefonctionnepas Debug.Print"##############exercice:requte###########" Debug.PrintstrSQL1 recSet1.OpenstrSQL1,connex1 connex1.Close Setconnex1=Nothing'supprimelesobjetsdelammoire SetrecSet1=Nothing EndSub

VBA_ACCESS_TP3_01_12.odt

05/02/12

Module6
DimstrSQL1AsString Debug.Print"##############solution1###########" strSQL1="SELECTtop6*FROMEtudiantORDERBYETU_nomDESC" recSet1.OpenstrSQL1,connex1 recSet1.MoveNext DoUntilrecSet1.EOF Debug.PrintrecSet1.Fields("ETU_Nom"),recSet1.Fields("ETU_Ville") recSet1.MoveNext Loop

Module7
Debug.Print"##############solution2###########" strSQL1="SELECT*FROMEtudiantORDERBYETU_nomDESC" recSet1.OpenstrSQL1,connex1 DimcompteurAsInteger compteur=0 DoWhileNotrecSet1.EOFAndcompteur<6'DoUntilrecSet1.EOFOrcompteur>5 compteur=compteur+1 Ifcompteur>1Then Debug.PrintrecSet1.Fields("ETU_Nom"),recSet1.Fields("ETU_Ville"),compteur EndIf recSet1.MoveNext Loop

Module8
'complter Debug.Print"##############solution3###########" strSQL1="SELECT*FROMEtudiantORDERBYETU_nom" recSet1.OpenstrSQL1,connex1,adOpenDynamic,adLockOptimistic recSet1.MoveLast recSet1.MovePrevious DimcompteurAsInteger compteur=0 DoUntilrecSet1.BOFOrcompteur>4 compteur=compteur+1 recSet1.MovePrevious Loop recSet1.MoveNext compteur=0 DoUntilrecSet1.EOFOrcompteur>4 compteur=compteur+1 Debug.PrintrecSet1.Fields("ETU_Nom"),recSet1.Fields("ETU_Ville") recSet1.MoveNext Loop

VBA_ACCESS_TP3_01_12.odt

05/02/12