Docstoc

DAO_20avec_20Access_20ou_20Visual_20Basic

Document Sample
DAO_20avec_20Access_20ou_20Visual_20Basic Powered By Docstoc
					  Brevet de technicien supérieur
INFORMATIQUE DE GESTION




PROGRAMMATION DAO AVEC ACCESS
       OU VISUAL BASIC




                                   Éric Deschaintre
                                              Applications client-serveur
DAO avec Access ou Visual Basic



Accès aux données (DAO) avec Access ou Visual Basic
Ce support de cours présente de façon très résumée, les notions essentielles qui permettent de développer avec
Access ou Visual Basic une application qui accède à des données issues d’une base Jet ou ODBC (une fois
attachée via ODBC, une table distante est vue comme une table Jet).
Le support contient un rappel de syntaxe assorti d’exemples tirés de la documentation de Access 2.0. Il se
termine par trois travaux pratiques composés d’exercices de programmation corrigés.
Avertissement : ce support utilise largement les éléments de syntaxe et les exemples extraits de la documentation
officielle de Microsoft Access 2.0


Objets et collections
Le DAO (Data Access Object) est une hiérachie de classes d’objets qui encapsulent une base Jet. Utiliser le DAO
est une excellente façon de s’initier à l’utilisation des objets en programmation.

Classe
Type d’un objet. L’appartenance à une classe définit les propriétés et les méthodes applicables aux objets de ce
type.

Objet
Entité qui est entièrement définie par des propriétés et qui réagit à un certain nombre de méthodes.

Collection
Objet qui contient un tableau d’objets de même classe. Une collection possède toujours une propriété Count qui
donne le nombre d’objets présents dans la collection.
A tout objet est associé une collection Properties qui contient la liste des propriétés de l’objet. Chaque objet de la
collection Properties a deux propriétés : Name (nom d’une propriété) et Value (valeur actuelle de cette
propriété).
La collection Properties en tant qu’objet a elle même une propriété Count qui donne le nombre de propriétés
associées à cet objet.

Objets du moteur Jet
Il s’agit de tous les objets qui concernent le support des données, des utilisateurs, des groupes d’utilisateurs et des
droits d’accès aux données et aux objets dans une base de donnée Jet.

Objets et Collection spécifiques à l’environnement Access
Access est en quelque sorte l’interface utilisateur du moteur (DBEngine) Jet.
Les objets Access sont tous les éléments actuellement ouverts dans l’application : formulaires, états...

Les Objets Access
Application (application en cours), Control (désigne un contrôle dans un formulaire ou un état), Debug (désigne
la fenêtre d’exécution), Form (désigne un formulaire), Report (désigne un état), Screen (désigne le contenu actuel
de l’écran).

Les Collections
Forms (ensemble des formulaires actuellement ouverts), Reports (ensemble des états actuellement ouverts)




                                                                                                    Page 2 sur 22
                                                                          Applications client-serveur
DAO avec Access ou Visual Basic


Jet 2.0 DAO - Data Access Objects
 Dans ce schéma l’entité DBEngine est un objet, les autres entités sont des
  collections d’objets.
 Une collection est un objet qui possède une propriété Count et des objets                                DBEngine
  membres indicés de 0 à Count - 1.
 Les flèches désignent les collections par défaut.
 A chaque objet est associé une collection implicite nommée « Properties » dont                           Workspaces
  les objets membres ont les propriétés Name et Value.

                                                             Databases                                                       Users     Groups


       TableDefs                              QueryDefs                       Recordsets        Relations       Containers   Groups     Users


Fields            Indexes              Fields          Parameters               Fields            Fields       Documents


                    Fields




                                                                                                                                      Page 3 sur 22
                                                                              Applications client-serveur
DAO avec Access ou Visual Basic

Manipulation des objets et collections (syntaxe) :
Déclaration : Dim <identificateur> as {workspace | database | user | group | tabledef | querydef | recordset | relation | container | document | field | parameter | indexe }
Affectation : Set <identificateur> = <référence à un objet>
Référence à un objet : {   < référence à un objet père>.<nom d’un objet fils>           |
                           <nom d’une collection> ! <nom d’un objet membre>               |
                           <nom d’une collection>(« nom d’un objet membre »)              |
                           <nom d’une collection>(<identificateur de variable de type String contenant le nom d’un objet membre>) |
                           <nom d’une collection>(<indice de l’objet membre> | <variable contenant la valeur de l’indice> ) }
Référence à une propriété : { <référence à un objet>.<nom d’une propriété de l’objet> | <référence à un objet> .properties(<indice de la propriété>) }
Application d’une méthode : <référence à un objet>.<nom d’une méthode applicable à l’objet> [ [(] <liste d’arguments> [)] ]
Liste des objets Container : Databases, Forms, Modules, RelationShips, Reports, Scripts, Tables, SysRel
Liste des propriétés d’un document : Container, DateCreated, LastCreated, Name, Owner, Permissions, UserName
Exemple de référence complète à un objet : DBEngine.Workspaces(0).Databases(0).TableDefs!Clients
Exemple de référence qui utilise les collections par défaut : DBEngine(0)(0)!Clients




                                                                                                                                                                    Page 4 sur 22
                                             Applications client-serveur
DAO avec Access ou Visual Basic




Accès aux données

Utilisation de la base courante
   Dim MyDb As Database
   Set MyDb = DBEngine.Workspaces(0).Databases(0) ‘ ou Set MyDb = CurrentDb()


Création d’objets RecordSet
Un recordset est un jeu d’enregistrement issu d’une d’une table ou d’une requête. Un recordset est un curseur au
sens des SGBDR.

Les trois types de RecordSet
Table
Fait référence à une table locale de la base.
Convient pour trier des données ou utiliser des index.
Dynaset (feuille de réponses dynamique)
Fait référence à une table locale, attachée ou au résultat d’une requête.
Convient pour modifier les données.
Snapshot (vue instantanée)
Exactement comme un dynaset mais un snapshot ne peut être mis à jour, il s’agit d’une copie en mémoire des
données.
Convient uniquement pour lire rapidement les données.

Création d’une variable RecordSet
On applique la méthode OpenRecordSet pour créer un RecordSet. Cette méthode s’applique aux objets des
classes Database, TableDef, QueryDef mais aussi RecordSet.
Syntaxe :
Set variable = database.OpenRecordset (source [, type [, options]])
ou bien pour les autres types d’objet :
Set variable = object.OpenRecordset (type [, options])
Source : chaîne de caractères contenant le nom d’un objet TableDef ou QueryDef existant ou bien le texte d’une
requête SQL.
type : DB_OPEN_TABLE, DB_OPEN_DYNASET ou bien DB_OPEN_SNAPSHOT.
Si aucun type n’est cité, le type DB_OPEN_TABLE est utilisé quand la méthode s’applique à un objet de type
TableDef, pour les autres objets le type DB_OPEN_DYNASET est utilisé par défaut.
options : une ou plusieurs constantes prédéfinies qui spécifient l’accessibilité des données en mode multi-
utilisateurs. (Voir l’aide en ligne pour plus de détails)
Table
   Dim MyDb As Database, MyRs As Recordset

   Set MyDb = DBEngine.Workspaces(0).Databases(0)
   Set MyRs = MyDb.OpenRecordset("Customers", DB_OPEN_TABLE)

Table attachée
   Dim MyDb As Database
   Dim MyTableDef As TableDef, MyRs As Recordset




                                                                                               Page 5 sur 22
                                              Applications client-serveur
DAO avec Access ou Visual Basic

   'Get current database.
   Set MyDb = DBEngine.Workspaces(0).Databases(0)
   Set MyTableDef = MyDb.CreateTableDef("PDXAuthor")

   ' Connect to Paradox table Author in database C:\PDX\PUBLISH.
   MyTableDef.Connect = "Paradox 3.X;DATABASE=C:\PDX\PUBLISH"
   MyTableDef.SourceTableName = "Author"

   ' Attach table.
   MyDb.TableDefs.Append MyTableDef

   ' Create a dynaset-type Recordset for the table. Dynaset

   ' is the default Recordset type for attached tables.
   Set MyRs = MyTableDef.OpenRecordset()

Requête enregistrée
   Dim MyDb As Database, MySet As Recordset

   Set MyDb = DBEngine.Workspaces(0).Database(0)
   Set MySet = MyDb.OpenRecordset("Customer List")
   ou encore :
   Dim MyDb As Database, MySet As Recordset, MyQuery as QueryDef
   Set MyDb = DBEngine.Workspaces(0).Databases(0)
   Set MyQuery = MyDb.QueryDefs("Customer List")
   Set MySet = MyQuery.OpenRecordSet()

Requête SQL dans le code
   Set MyDb = DBEngine.Workspaces(0).Database(0)
   SQLquery = "SELECT * FROM Customers ORDER BY [Customer ID];"
   Set MySet = MyDb.OpenRecordset(SQLquery)

Source d’un formulaire
Il s’agit de récupérer la requête associée à un formulaire. Le type du recordSet ainsi récupéré est toujours
DynaSet.
Attention, il ne faut pas fermer (méthode Close) un RecordSet de ce type.
Syntaxe :
Set recordsetname = form.RecordsetClone
Exemple :
   Dim MyRs As Recordset
   Set MyRs = Forms![Orders].RecordsetClone


Tri d’un RecordSet

Tri avec la propriété Index d’une table
Il s’agit de trier les lignes d’un RecordSet issu d’une table en fonction de l’un ou l’autre index de cette table.

   Dim MyDb As Database, MyTable As Recordset

   Set MyDb = DBEngine.Workspaces(0).Databases(0)
   Set MyTable = MyDb.OpenRecordset("Customers", DB_OPEN_TABLE)

   MyTable.MoveFirst                          ' Move to first record.



                                                                                                    Page 6 sur 22
                                             Applications client-serveur
DAO avec Access ou Visual Basic

   MsgBox MyTable![Company Name] ' First record with no index set.
   MyTable.Index = "City"               ' Select City index.
   MyTable.MoveFirst             ' Move to first record.
   MsgBox MyTable![Company Name] ' First record with index set on "City."


Tri avec un nouveau jeu d’enregistrements
Pour modifier l’ordre des lignes dans un RecordSet de type Dynaset Ou Snapshot. Il faut créer un deuxième
Recordset trié à partir du premier.
Exemple :

   Dim MyDb As Database, MySet As Recordset, SortedSet As Recordset

   Set MyDb = DBEngine.Workspaces(0).Databases(0)
   'Create dynaset.
   Set MySet = MyDb.OpenRecordset("Orders")
   ' Set sort order.
   MySet.Sort = "[Country] DESC, [Postal Code]"

   ' Create second dynaset based on the first.
   Set SortedSet = MySet.OpenRecordset()
Remarque : on aurait pu trier le RecordSet sur lui-même.

Filtrage d’un RecordSet
Un filtre permet dynamiquement de limiter les lignes d’un RecordSet sur différents critères.

Exemple
   Dim MyDb As Database, MySet As Recordset, FilteredSet As Recordset
   Set MyDb = DBEngine.Workspaces(0).Databases(0)
   Set MySet = MyDb.OpenRecordset("Orders")          ' Create dynaset.
   MySet.Filter = "[Region] = 'WA' And [Status] = 'A'"      ' Set filter
   conditions.
   Set FilteredSet = MySet.OpenRecordset()                  ' Create filtered
   dynaset.


Création d’une requête dans une procédure
Un RecordSet peut être créé à partir d’une table ou requête enregistrée mais il peut également être crée à partir
d’une requête SQL initialisée dans le code de la procédure.
Exemple de création d’un RecordSet à partir d’une requête interne :

   Dim MyDb As Database, MyQuery As QueryDef
   Set MyDb = DBEngine.Workspaces(0).Databases(0)

   ' Create QueryDef.
   Set MyQuery = MyDb.CreateQueryDef ("All Cust")
   MyDb.QueryDefs.Append MyQuery

   ' Set SQL property.
   MyQuery.SQL = "UPDATE DISTINCTROW Products SET Products![Supplier ID] = 2
   WHERE Products![Supplier ID] = 1;"

   MyQuery.Execute                           ' Invoke query.
   MyQuery.Close                             ' Close query.



                                                                                                 Page 7 sur 22
                                              Applications client-serveur
DAO avec Access ou Visual Basic


Itération dans un RecordSet (Curseurs)

Vue d’ensemble
La procédure suivante modifie la fonction de tous les représentants de la table Employés. Ceci est un exemple, on
aurait avantageusement utilisé une requête SQL Update.

   Dim MyDb As Database, MyTable As Recordset
   Set MyDb = DBEngine.Workspaces(0).Databases(0)
   Set MyTable = MyDb.OpenRecordset("Employees", DB_OPEN_TABLE)

   MyTable.Index = "Last Name"                                          ' Set current index.

   MyTable.MoveFirst                                                    ' Locate first record.

   Do Until MyTable.EOF                                ' Begin loop.
                                                ' Check title.
        If MyTable!Title = "Sales Representative" Then
               MyTable.Edit                     ' Enable editing.
               MyTable!Title = "Account Executive"     ' Change title.

              MyTable.Update                                            ' Save changes.
       End If
       MyTable.MoveNext                                        ' Locate next record.
   Loop                                                               ' End of loop.

   MyTable.Close                                                        ' Close table.


Les méthodes Move applicables à un RecordSet
MoveFirst, MoveLast, MoveNext, MovePrevious, Move <signet> (voir les signets plus loin)

Détection des limites : propriétés BOF et EOF d’un RecordSet
Propriété BOF vraie avant le premier tuple.
Propriété EOF vraie après le dernier tuple.
Exemple :
   Dim MyDb As Database, MyTable As Recordset
   Set MyDb = DBEngine.Workspaces(0).Databases(0)

                                        ' Open Recordset from TableDef.
   Set MyTable = MyDb.OpenRecordset("Orders", DB_OPEN_TABLE)

   Do Until MyTable.EOF                                        ' Until end of table.
       ...
       MyTable.MoveNext                                ' Move to next record.
   Loop
                                                       ' MoveLast since now past the last record.
   MyTable.MoveLast                                    ' Move to last record.

   Do Until MyTable.BOF                                        ' Until beginning of file.
       ...
       MyTable.MovePrevious                                    ' Move to previous record.

   Loop



                                                                                               Page 8 sur 22
                                           Applications client-serveur
DAO avec Access ou Visual Basic



   MyTable.Close                                            ' Close Recordset.


Comptage du nombre de lignes
La propriété RecordCount compte le nombre de lignes lues dans un RecordSet. Pour compter toutes les lignes, on
utilise au préalable une méthode MoveLast.
Exemple
   Dim MyDb As Database, MyRecords As Recordset, Total As Long

   Set MyDb = DBEngine.Workspaces(0).Database(0)
   Set MyRecords = MyDb.OpenRecordset("Employees")

   MyRecords.MoveLast
   Total = MyRecords.RecordCount
   If Total = -1 Then
       Debug.Print "Count not available."
   End If


Méthode Find
Elle permet d’atteindre, dans un RecordSet Dynaset ou Snapshot, un enregistrement correspondant à certains
critères. Elle se décline en quatre versions : FindFirst, FindLast, FindNext et FindPrevious.
La propriété NoMatch est vraie quand aucun enregistrement ne correspond aux critères de recherche.
Exemple
   Dim Criterion As String, MyDb As Database, MySet As Recordset

   ' Define search criterion.
   Criterion = "Title = 'Sales Representative'"

   Set MyDb = DBEngine.Workspaces(0).Databases(0)

   ' Create dynaset.
   Set MySet = MyDb.OpenRecordset("Employees")

   ' Locate first occurrence.
   MySet.FindFirst Criterion

   ' Loop until no matching records.
   Do Until MySet.NoMatch
       MySet.Edit                       ' Enable editing.
       MySet!Title = "Account Executive"       ' Change title.
       MySet.Update                     ' Save changes.
       MySet.FindNext Criterion         ' Locate next record.
   Loop                                        ' End of loop.


Méthode Seek
La méthode Seek sert à localiser un enregistrement dans un RecordSet de type Table. La méthode Seek utilise le
ou les index définis sur la table.
Syntaxe : table.seek comparaison, clé1, clé2 ...
Comparaion prend l’une des valeurs suivantes : =, >=, >, <=, <
Exemple
   Dim MyDb As Database, MyTable As Recordset



                                                                                             Page 9 sur 22
                                           Applications client-serveur
DAO avec Access ou Visual Basic

   Set MyDb = DBEngine.Workspaces(0).Databases(0)
   ' Open Table.
   Set MyTable = MyDb.OpenRecordset("Products", DB_OPEN_TABLE)

   MyTable.Index = "Supplier ID"                    ' Define current index.
   MyTable.Seek "=", 1                              ' Seek record.

   Do Until MyTable.NoMatch              ' Until no record is found.
       MyTable.Edit               ' Enable editing.
       MyTable("Supplier ID") = 2 ' Change Supplier ID.
       MyTable.Update                    ' Save changes.
       MyTable.Seek "=", 1        ' Seek next record.
   Loop                                  ' End of loop.
   MyTable.Close                         ' Close Table.


Utilisation des signets (bookmark)
La propriété BookMark d’un RecordSet permet d’identifier une ligne dans le RecordSet.
Exemple 1
   Dim MyDb As Database, MyTable As Recordset, MyBookmark As String

   Set MyDb = DBEngine.Workspaces(0).Databases(0)
   Set MyTable = MyDb.OpenRecordset("Customers", DB_OPEN_TABLE)

   MyTable.Index = "Company Name"
   ...
   MyBookmark = MyTable.Bookmark
   MyTable.Seek ">=", "Z"

   If MyTable.NoMatch Then
       MsgBox "Can't find a company name starting with 'Z'."
       MyTable.Bookmark = MyBookmark
   End If

   MyTable.Close
   MyDb.Close

Exemple 2
Cette procédure permet d’afficher l’enregistrement du chef d’un employé puis de revenir à l’enregistrement de
l’employé.
   Function ShowSupervisor() As Integer
       Dim MyForm As Form, MySet As Recordset, MyBookmark As String

        Set MyForm = Screen.ActiveForm
        Set MySet = MyForm.RecordSetClone
        MyBookmark = MyForm.Bookmark

        MySet.FindFirst "[Employee ID] = " & MySet![Supervisor]
        If MySet.NoMatch Then
               MsgBox "Couldn't find employee's supervisor."
               MyForm.Bookmark = MyBookmark
        Else
               MyForm.Bookmark = MySet.Bookmark
        End If
        MySet.Close



                                                                                             Page 10 sur 22
                                            Applications client-serveur
DAO avec Access ou Visual Basic

       MyDb.Close
   End Function


Modification des lignes
Rappel : les modifications concernent uniquement les RecordSet de type Table ou DynaSet à l’exclusion du type
SnapShot qui ne peut être modifié.

Modification de nombreuses lignes
Très souvent on utilisera avantageusement une requête de mise à jour (Update ou Delete).
Exemple
   Dim MyDb As Database, MyQuery As QueryDef

   Set MyDb = DBEngine.Workspaces(0).Databases(0)
   Set MyQuery = MyDb.CreateQueryDef()
   MyQuery.Name = "Change Job Titles"   ' Create query.
   MyQuery.SQL = "UPDATE DISTINCTROW Employees SET Employees!Title = 'Account
   Executive' WHERE Employees!Title = 'Sales Representative';"
   MyDb.QueryDefs.Append MyQuery

   MyQuery.Execute        ' Invoke query.
   MyQuery.Close                 ' Close query.

   MyDb.QueryDefs.Delete MyQuery                     ' Delete query.


Modification d’une ligne
Voir le document annexe intitulé « Mise à jour des tables source », ce document énumère tous les cas de mise à
jour des tables à partir d’une requête. Il indique également quels champs ne peuvent être mis à jour et pourquoi.
Pour modifier un enregistrement, il y a quatre étapes :
1. Atteindre l’enregistrement à modifier
2. Appliquer la méthode Edit
3. Modifier les champs
4. Appliquer la méthode Update
En cas d’oubli d’application de la méthode Update, les modifications sont perdues.
Exemple
   Set MyDb = DBEngine.Workspaces(0).Databases(0)
   Set MySet = MyDb.OpenRecordset("Employees")
   MySet.MoveFirst
   Do Until MySet.EOF
       If MySet![Title] = "Sales Representative" Then
              MySet.Edit
              MySet![Title] = "Account Executive"
              MySet.Update
       End If
       MySet.MoveNext
   Loop
   MySet.Close
   MyDb.Close




                                                                                               Page 11 sur 22
                                            Applications client-serveur
DAO avec Access ou Visual Basic


Suppression d’une ligne
Exemple
   Dim MyDb As Database, MySet As Recordset

   Set MyDb = DBEngine.Workspaces(0).Databases(0)
   Set MySet = MyDb.OpenRecordset("Employees")

   MySet.MoveFirst
   Do Until MySet.EOF
       If MySet![Title] = "Trainee" Then
              MySet.Delete
       End If
       MySet.MoveNext
   Loop

   MySet.Close
   MyDb.Close
Après la suppression d’un enregistrement, il faut appliquer la méthode MoveNext pour passer au suivant.

Ajout d’une ligne
Pour ajouter un enregistrement à un objet RecordSet, il y a trois étapes :
1. Appliquer la méthode AddNew pour prépare un nouvel enregistrement vierge.
2. Donner des valeurs aux champs
3. Appliquer la méthode Update
En cas d’oubli d’application de la méthode Update, les modifications sont perdues.
Dans un RecordSet de type Table, la nouvelle ligne est placée dans l’ordre de l’index en cours.
Dans un RecordSet de type DynaSet, la nouvelle ligne est placée à la fin du jeu d’enregistrements.
Exemple
   Dim MyDb As Database, MySet As Recordset

   Set MyDb = DBEngine.Workspaces(0).Databases(0)
   Set MySet = MyDb.OpenRecordset("Shippers")

   MySet.AddNew
   MySet![Company Name] = "Global Parcel Service"
   ... ' Set remaining fields.
   MySet.Update

   MySet.Close
   MyDb.Close


Transactions
Une transaction est un espace de temps pendant lequel des opérations indivisibles ont lieu. Toutes les opérations
d’une transaction doivent être validées dans la base en même temps ou pas du tout (exemple classique
débit/crédit).
Dans Access les transactions peuvent être imbriquées.
Le fait de placer des opérations d’accès et de modification des données dans des transactions améliore les
performances du système.




                                                                                              Page 12 sur 22
                                             Applications client-serveur
DAO avec Access ou Visual Basic


Fonctionnement
La gestion des transactions est prise en charge par un objet Workspace avec les méthodes BeginTrans (début de
la transaction), CommitTrans (fin et validation de la transaction) et RollBack (fin et annulation de la transaction).

Exemple
   Function ChangeTitle
       Const MB_ICONQUESTION = 32
       Const YES = 6
       Const YES_NO = 4

         Dim CRLF As String, EmployeeName As String
         Dim Message As String, Prompt As String
         Dim MyDb As Database, MyWorkSpace as Workspace, MyTable As Recordset

         CRLF = Chr$(13) & Chr$(10)
         Prompt = "Change title to Account Executive?" ' Get current database.
         Set MyWorkspace = DBEngine.Workspaces(0)
         Set MyDb = MyWorkspace.Databases(0 ‘ ' Open table.
         Set MyTable = MyDb.OpenRecordset("Employees", DB_OPEN_TABLE)

         MyWorkspace.BeginTrans              ' Start of transaction scope.

         Do Until MyTable.EOF

                  If MyTable![Title] = "Sales Representative" Then
                         EmployeeName = MyTable![Last Name] & ", " & MyTable![First
                         Name]
                         Message = "Employee: " & EmployeeName & CRLF & CRLF
                         If MsgBox(Message & Prompt, MB_ICONQUESTION & YES_NO,
                  "Change Job Title") = YES Then

                                    MyTable.Edit ' Enable editing.
                                    MyTable![Title] = "Account Executive" ' Change title.
                                    MyTable.Update            ' Save changes.
                           End If
                  End If

              MyTable.MoveNext    ' Move to next record.
       Loop
       If MsgBox("Save all changes?", MB_ICONQUESTION + YES_NO, "Save                               Changes")
   = YES Then
              MyWorkspace.CommitTrans    ' Commit changes.
       Else
              MyWorkspace.Rollback              ' Undo changes.
       End If
       MyTable.Close ' Close table.
   End Function




                                                                                                 Page 13 sur 22
                                          Applications client-serveur
DAO avec Access ou Visual Basic



TP 1 : Programmation Access Basic élémentaire
Les TP suivants utilisent la base de données "COMPTOIR.MDB" livrée en exemple avec Access. Ecrire les
programmes Access Basic suivants sous forme de procédures ou de fonctions dans un module global intitulé TP1
:

1. Ecrire une fonction Affiche qui affiche son argument dans la fenêtre d’exécution.
        Function exo1 (mon_arg As Variant)
            ' Affiche son argument
            Debug.Print (mon_arg)
        End Function


2. Ecrire une fonction qui retourne l’opposé d’un nombre

        Function exo2 (n As Variant)
             'Opposé
             exo2 = -n
        End Function


3. Ecrire une fonction qui donne votre nombre de jours de vie (on saisit la date de naissance)

        Function exo3 ()
            'Jours de vie
            exo3 = Date - CVDate(InputBox("Votre date de naissance SVP"))
        End Function


4. Affichage d’une table de multiplication (la table est un paramètre à saisir)

        Sub exo4 ()
            'Table de multiplication
            t = Val(InputBox("Quelle table ?"))
            For i = 1 To 10
                 Debug.Print i; "*"; t; "="; i * t
            Next
        End Sub


5. Ecrire une fonction qui retourne la date du premier lundi qui suit une date donnée.

        Function exo5 (d As Variant)
            'Date du prochain lundi
            d = CVDate(d)
            exo5 = d + (8 - DatePart("w", d, 2))
        End Function


6. Ecrire une procédure qui permet de jouer au jeu du nombre mystérieux sur des entiers de 0 à 100.




                                                                                          Page 14 sur 22
                                         Applications client-serveur
DAO avec Access ou Visual Basic


        Sub exo6 ()
            'Nombre mystérieux
            Randomize
            n = Int(Rnd * 100 + 1)
            trouvé = 0
            Do
               essai = Val(InputBox(" Votre essai ?"))
               If essai = n Then
                    MsgBox ("Bravo !")
                    Exit Sub
               Else
                    If essai < n Then
                         MsgBox ("Trop petit")
                    Else
                         MsgBox ("Trop grand")
                    End If
               End If
            Loop
        End Sub


7. Ecrire une procédure qui supprime tous les espaces excédentaires dans une phrase saisie par
   l’utilisateur. La phrase résultante est affichée.
        Function exo7 (c As String)
           c = Trim(c)
           p = InStr(c, " ")
           Do While p <> 0
                c = Left(c, p - 1) + Right(c, Len(c) - p)
                p = InStr(c, " ")
           Loop
           exo7 = c
        End Function


8. Ecrire une procédure qui retourne la liste des noms des fichiers contenus dans le répertoire courant.
        Sub exo8 ()
            Correspondance = Dir("*.*")
            If Len(Correspondance) > 0 Then ' Si un nom est trouvé.
                 Do
                     Debug.Print (Correspondance)
                     Correspondance = Dir
                 Loop Until Len(Correspondance) = 0
            Else
                 Msg = "Il n'y a pas de fichier dans le répertoire"
            End If
        End Sub


9. Ecrire une procédure qui affiche le numéro de version de Access et répond si oui ou non, l’application
   fonctionne avec un RunTime. (fonction SysCmd)
        Sub exo9 ()
            Debug.Print "Numéro de version : "; SysCmd(SYSCMD_ACCESSVER)
            If SysCmd(SYSCMD_RUNTIME) Then
                Debug.Print "Actuellement sous RunTime"
            End If

        End Sub


10. Ecrire une procédure qui retourne la valeur actuelle de la chaîne d’environnement prompt (fonction
    Environ).

        Sub exo10 ()
            Debug.Print Environ("prompt")
        End Sub




                                                                                         Page 15 sur 22
                                         Applications client-serveur
DAO avec Access ou Visual Basic



TP2 : Objets et collections

Lecture du dictionnaire

1. Ecrire les procédures Access Basic qui donnent les informations suivantes : Actuellement, les info-
   bulles sont-elles affichées ? (Méthode GetOption sur objet Application)

        Function exo71 ()
            ' Info bulles
            If application.GetOption("info-bulles") Then
                 rep = "oui"
            Else
                 rep = "non"
            End If
            Debug.Print rep

        End Function


2. Quel est le nom de la base actuellement ouverte ?
        Sub exo72 ()
            'Nom de la base en cours
            Dim d As Database
            Set d = dbengine(0)(0)
            Debug.Print d.name
        End Sub


3. Nom des formulaires et des macros avec leur nom de propriétaire pour la base de données en cours.

        Sub exo73 ()
            Dim d As Database
            Dim c As Container
            Dim doc As Document

             Set d = dbengine(0)(0)
             Debug.Print
             Debug.Print "Liste des formulaires :"
             Set c = d.containers!forms
             For i = 0 To c.documents.count - 1
                  Set doc = c.documents(i)
                  Debug.Print doc.name, doc.owner
             Next
             Debug.Print
             Debug.Print "Liste des macros :"
             Set c = d.containers!scripts
             For i = 0 To c.documents.count - 1
                  Set doc = c.documents(i)
                  Debug.Print doc.name, doc.owner
             Next

        End Sub


4. Noms des propriétés d’un formulaire




                                                                                         Page 16 sur 22
                                          Applications client-serveur
DAO avec Access ou Visual Basic


        Sub exo74 ()
            ' Propriétés d'un formulaire
            Dim f As Form
            If forms.count = 0 Then
                 DoCmd OpenForm "Clients"
            End If
            Set f = forms(0)
            For i = 0 To f.properties.count - 1
                 Debug.Print f.properties(i).name
            Next

        End Sub


5. Nombre et noms des formulaires actuellement ouverts

        Sub exo75 ()
            'Nombre et noms des formulaires actuellement ouverts

            Debug.Print "Nb de formulaires ouverts : "; forms.count
            For i = 0 To forms.count - 1
                 Debug.Print forms(i).name
            Next
        End Sub


6. Nombre, noms et code SQL de toutes les requêtes connues de la base
        Sub exo76 ()
            'Nom et code SQL des requetes
            Dim db As Database, r As QueryDef
            Set db = dbengine(0)(0)
            n = db.querydefs.count
            Debug.Print "Nombre : ", n
            Debug.Print "Nom ", "Code SQL"
            For i = 0 To n - 1
                 Set r = db.querydefs(i)
                 Debug.Print r.name
                 Debug.Print r.SQL
            Next
        End Sub


7. Liste des groupes d’utilisateurs avec nom du groupe et noms des utilisateurs du groupe

        Sub exo77 ()
            Dim wp As WorkSpace, u As User, g As Group
            Set wp = dbengine(0)
            n = wp.groups.count
            For i = 0 To n - 1
                 Set g = wp.groups(i)
                 Debug.Print "Groupe ", g.name
                 For j = 0 To g.users.count - 1
                     Set u = g.users(j)
                     Debug.Print u.name
                 Next
            Next
        End Sub


8. Liste des relations de type « un à un » avec noms des tables reliées.




                                                                                       Page 17 sur 22
                                            Applications client-serveur
DAO avec Access ou Visual Basic


         Sub exo78 ()
             ' relations un à un avec tables liées
             Dim d As Database, r As Relation
             Set d = dbengine(0)(0)
             For i = 0 To d.relations.count - 1
                 Set r = d.relations(i)
                 If (r.attributes And DB_RELATIONUNIQUE) Then
                     Debug.Print r.table; " - "; r.foreigntable

                    End If
             Next
         End Sub


9. Ecrire une procédure « Desc » qui associée à un nom de table retourne la liste des noms et types des
   colonnes de la table.

         Sub exo79 (nomtable As String)
             'Description d'une table
             Dim d As Database, t As TableDef
             Set d = dbengine(0)(0)
             Set t = d.tabledefs(nomtable)
             For i = 0 To t.fields.count - 1
                  Debug.Print t.fields(i).name; " ",
                  Select Case t.fields(i).type
                      Case DB_TEXT: Debug.Print "Text(";
                      Case DB_DATE: Debug.Print "Date/Heure(";
                      Case DB_TEXT: Debug.Print "Texte(";
                      Case DB_MEMO: Debug.Print "Mémo(";
                      Case DB_BOOLEAN: Debug.Print "Oui/Non(";
                      Case DB_INTEGER: Debug.Print "Integer(";
                      Case DB_LONG: Debug.Print "Long(";
                      Case DB_CURRENCY: Debug.Print "Currency(";
                      Case DB_SINGLE: Debug.Print "Single(";
                      Case DB_DOUBLE: Debug.Print "Double(";
                      Case Else: Debug.Print t.fields(i).type; "(";
                  End Select
                  Debug.Print t.fields(i).size; ")"
             Next
         End Sub


10. Liste des noms et types de tous les objets dont un utilisateur donné est propriétaire.
         Sub exo710 (u As String)
             ' Liste des objets d'un propriétaire
             Dim db As Database, r As QueryDef
             Set db = dbengine(0)(0)
             Dim c As Container, d As Document

             For i = 0 To db.containers.count - 1
              Set c = db.containers(i)
                  For j = 0 To c.documents.count - 1
                      Set d = c.documents(j)
                      If d.owner = u Then
                          Debug.Print d.name, d.container
                      End If
                  Next
             Next
         End Sub


Créations et Modifications
Ecrire les procédure Access Basic qui réalisent les actions suivantes

1. Colorier en rouge le fond de tous les contrôles de type Champ texte d’un formulaire dont le nom est
   donné en argument.




                                                                                             Page 18 sur 22
                                         Applications client-serveur
DAO avec Access ou Visual Basic


        Sub exo711 ()
            'Colorie en rouge
            Dim f As Form, c As Control
            DoCmd OpenForm "Clients"
            Set f = forms("clients")
            For i = 0 To f.count - 1
                 Set c = f(i)
                 If TypeOf c Is textbox Then
                     c.backcolor = 255
                 End If
            Next
        End Sub


2. Créer une nouvelle table ‘Amis’ qui contient les colonnes nom (char(20)) et date de naissance. Créer un
   index unique sur le nom dans la table ‘Amis’

        Sub exo712 ()
            ' Création d'une table Amis
            Dim db As Database, t As TableDef, f As Field, id As Index
            Set db = dbengine(0)(0)
            Set t = db.CreateTableDef("Amis")
            Set f = t.CreateField("nom", DB_TEXT, 20)
            t.fields.Append f
            Set f = t.CreateField("naissance", DB_DATE)
            t.fields.Append f
            Set id = t.CreateIndex("inom")
            id.unique = True
            Set f = id.CreateField("nom")
            id.fields.Append f
            t.indexes.Append id
            db.tabledefs.Append t
        End Sub


3. Créer un formulaire qui permet de saisir des lignes dans la nouvelle table ‘Amis’.
        Sub exo713 ()
            'Formulaire sur table Amis
            Dim nom As String, f As Form, c As Control
            Set f = CreateForm()
            f.recordsource = "Amis"
            f.caption = "Saisie des amis"
            nom = f.name
            Set c = CreateControl(nom, 109, 0, "", "Nom")
            c.controlsource = "nom"
            Set c = CreateControl(nom, 109, 0, "", "date de naissance", 0, 500)
            c.controlsource = "naissance"
            DoCmd Restore

        End Sub




                                                                                        Page 19 sur 22
                                            Applications client-serveur
DAO avec Access ou Visual Basic



TP3 : Accès aux données
En utilisant la base « Les comptoirs » livrée avec Access, écrire les procédures ou fonction Access basic qui
réalisent les traitements suivants :

1. Afficher le nombre d’employés français
        'Afficher le nombre d'employés français
            Dim db As Database, r As Recordset
            Dim sql As String

              Set db = dbengine(0)(0)
              sql = "select nom from employés where pays='France'"
              Set r = db.OpenRecordset(sql)
              r.MoveLast
              Debug.Print "Il y a "; r.recordcount; " employés français."

        End Sub


2. Dans la fenêtre d’exécution, afficher la liste des clients français

        Sub exo92 ()
            'Liste des clients français
            Dim db As Database, r As Recordset
            Dim sql As String

            Set db = dbengine(0)(0)
            sql = "select nom, prénom from employés where pays='France'"
            Set r = db.OpenRecordset(sql)
            Do Until r.EOF
                 Debug.Print r!nom; " "; r!prénom
                 r.MoveNext
            Loop
        End Sub


3. Ajouter un champ Salaire à la table Employés. Un programme affecte au hasard un salaire compris
   entre 10000 et 100000 à chaque employé.

        Sub Exo93 ()
            Dim db As Database, t As TableDef, f As Field, r As Recordset
            Set db = dbengine(0)(0)
            Set t = db.tabledefs!Employés
            Set f = t.CreateField("salaire", DB_CURRENCY)
            t.fields.Append f

            Dim sql As String
            Randomize
            sql = "select nom,salaire from employés"
            Set r = db.OpenRecordset(sql)
            Do Until r.EOF
                 r.Edit
                 r!salaire = Rnd * 90000 + 10000
                 r.Update
                 Debug.Print r!nom; " : "; r!salaire; " F"
                 r.MoveNext
            Loop
        End Sub


4. Saisir une prime de fin d’année pour les employés d’un service. La procédure demande le nom du chef
   de service puis, pour chaque employé du service de ce chef, affiche son nom et demande le montant de
   la prime. Ce montant est cumulé dans le champ salaire. Pour saisir les données on utilisera la fonction
   InputBox.




                                                                                               Page 20 sur 22
                                        Applications client-serveur
DAO avec Access ou Visual Basic


        Sub exo94 ()
            ' Saisie d'une prime
            Dim session As WorkSpace, db As Database, r As Recordset
            Set session = dbengine.workspaces(0)
            Set db = dbengine(0)(0)
            Const ICONQUESTION = 32
            Const OUI = 6
            Const OUINON = 4

             Dim sql, chef As String
             Dim prime As Variant

             chef = InputBox("Nom du chef de service ?")
             If chef = "" Then
                 Exit Sub
             End If

            sql = "select * from employés where nom='" & chef & "'"
            Set r = db.OpenRecordset(sql)
            If r.recordcount = 0 Then
                MsgBox ("Cet employé n'existe pas !")
                Exit Sub
            End If
            sql = "select nom,salaire from employés where [rend compte à]=" &
        Str(r![N° employé])
            Set r = db.OpenRecordset(sql)

            session.BeginTrans
            Do Until r.EOF
                 Do
                     prime = InputBox("Quelle prime pour " & r!nom & " ?")
                 Loop Until IsNumeric(prime) Or prime = ""
                 If prime = "" Then
                     session.Rollback
                     Exit Sub
                 End If
                 Debug.Print r!nom; " avant : "; r!salaire; " F"
                 r.Edit
                 r!salaire = r!salaire + prime
                 r.Update
                 Debug.Print r!nom; " après : "; r!salaire; " F"
                 r.MoveNext
            Loop
            If MsgBox("D'accord pour valider l'attribution des primes ?", OUINON
        + ICONQUESTION, "validation") = OUI Then
                 session.CommitTrans
            Else
                 session.Rollback
            End If
            r.Close
        End Sub


5. Ajouter un bouton ‘CHEF’ au formulaire employé. Ce bouton permet de visualiser l’enregistrement du
   chef de l’employé en cours. Si l’employé n’a pas de chef, un message averti l’utilisateur. Un bouton
   ‘RETOUR’ permet de revenir à l’employé.




                                                                                     Page 21 sur 22
                                   Applications client-serveur
DAO avec Access ou Visual Basic


        'Atteindre l'enregistrement du chef
            Dim f As Form, r As Recordset, chef As Variant
            Dim critère As String

            Set f = screen.activeform
            Set r = f.recordsetclone
            chef = f![Rend compte à]
            If Not IsNull(chef) Then
                 niveau = niveau + 1
                 repère1(niveau) = f.bookmark
                 critère = "[N° employé] = " & Str(chef)
                 r.FindFirst critère
                 If r.nomatch Then
                     MsgBox ("Chef introuvable !")
                     f.bookmark = repère1(niveau)
                  Else
                     f.bookmark = r.bookmark
                  End If
            Else
                 MsgBox ("Cet employé n'a pas de chef !")
            End If
            r.Close
        End Sub


        Sub Bouton183_Click ()
            'Retour à l'enregistrement de l'employé
            Dim f As Form

             Set f = screen.activeform
             If niveau > 0 Then
                 f.bookmark = repère1(niveau)
                 niveau = niveau - 1
             End If

        End Sub




                                                                 Page 22 sur 22

				
DOCUMENT INFO
Shared By:
Categories:
Tags:
Stats:
views:14
posted:10/12/2010
language:French
pages:22