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
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
VBA_ACCESS_TP3_01_12.odt
05/02/12
2.2. larequte
'pourunetablerecSet1.Open"tblClient",connex1
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
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
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
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
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