Cours : Visual-Basic

Bases de données : 

TD : DAO et Contrôles listes

Claude Gruchet
Initiation TD4-P1

Dans ce TD, nous allons utiliser les objets de la bibliothèque DAO pour remplir une liste (contrôle ListBox) :

Supposons une base Ms Access nommée Cli8.mdb contenant une table « Clients » dont la structure est la suivante :

Nom du champ Type
CodCli  NuméroAuto
Nom  Texte
Adresse  Texte
CP  Texte
Ville  Texte
Tel  Texte

 

Nous allons remplir un contrôle ListBox avec le nom des clients en mémorisant, en parallèle le code unique de la fiche afin de pouvoir y accéder sans risque de confusion en cas d’homonymie.

Commencez par créer un projet "Exe Standard", nous l'appellerons "PGesCli" et le placerons dans le répertoire "C:\Mes Documents\PGesCli"

Téléchargez la base cli8.mdb qui nous servira pour l'exemple. Utilisez le fichier au format MsAccess 97 ou le fichier au format MsAccess 2000 en fonction de votre plate forme logicielle. Décompactez le fichier zip dans le répertoire du projet.
Si vous avez chargé la version MsAccess 2000, renommez le fichier Cli8_2K.mdb en Cli8.mdb.

Ajoutez un module au projet et nommez le "UtiGen". Nous allons y placer la procédure de démarrage "Sub Main".

Tapez le code suivant dans la fenêtre du module UtiGen :

 

Option Explicit
Option Compare Text

'=====================================================================
' ATTENTION : Cette constante est à modifier en fonction du répertoire
' dans lequel vous avez installé l'exemple !!!
'=====================================================================

Public Const gstrBaseName = "C:\Mes Documents\PGesCli\cli8.mdb"

' Base Access, variable globale
Public gdb As Database

'------------------------
Public Sub main()
'------------------------
   On Error Resume Next

   Screen.MousePointer = vbHourglass
   Set gdb = OpenDatabase(gstrBaseName)
   If Err.Number <> 0 Then
      MsgBox Err.Description, vbCritical, "Ouverture " & gstrBaseName
      Err.Clear
      End
   End If
   Screen.MousePointer = vbDefault
   frmLstCli.Show vbModal

End Sub

 

Nous utilisons un objet global « Database » (Public gdb as Database) que nous initialisons dans la « Sub Main » grâce à l’instruction « OpenDatabase ». Nous procédons ainsi pour pouvoir profiter du pointeur sur la DataBase dans l'ensemble des modules du logiciel. En déclarant le pointeur comme variable globale, nous pourrons l'utiliser partout sans avoir besoin de nous reconnecter à la base dans chaque nouveau module. La connexion à la base étant une opération coûteuse en temps de traitement, cela permet d'optimiser notre logiciel.

Il faut, maintenant, dire au programme de démarrer par ce code. Appelez le dialogue "Propriétés du projet" (menu Projet/propriétés) et dans la liste "Objet de démarrage", choisissez "Sub Main" puis validez le dialogue par OK.

 

Ajoutez, ensuite, une feuille que vous nommerez "frmCliLst" (propriété Name). 

Ajoutez y une zone de liste que vous nommerez "lstCli" et un bouton de commande "cmdClose" dont le code fermera le formulaire (grâce à l'instruction Unload Me).

 

 

Pour taper le code source réalisant le traitement de l'évenement "Click" du bouton "cmdClose", double cliquez sur le bouton, cela va ouvrir le module de code du formulaire et vous placer dans la procédure "cmdClose_Click()".

Entrez y le code source suivant :

 

Private Sub cmdClose_Click()
   Unload Me
End Sub

 

Nous allons créer une procédure Sub RefreshListe() dont le travail sera d’initialiser un objet Recordset grâce à une phrase SQL que nous aurons définie auparavant. Il suffira ensuite de balayer le RecordSet pour remplir la ListBox.

Toujours dans le module du formulaire "frmCliLst", tapez le code suivant :

'------------------------
Private Sub RefreshListCli()
'------------------------
Dim LstrSql As String
Dim lrst As Recordset

   On Error GoTo err_Refresh
   lstCli.Clear
' Préparation de la phrase SQL :
   LstrSql = "SELECT CodCli, Nom FROM Clients ORDER BY Nom;"
' Ouverture du Recordset
   Set lrst = gdb.OpenRecordset(LstrSql, dbOpenForwardOnly)

' Boucle de balayage du Recordset

   While Not lrst.EOF
      lstCli.AddItem lrst.Fields("Nom")
      lstCli.ItemData(lstCli.NewIndex) = lrst.Fields("CodCli")
      lrst.MoveNext
   Wend

   Exit Sub

err_Refresh:
   MsgBox Err.Description, vbCritical, "RefreshListeCli"
   Err.Clear
End Sub


Voici quelques explications sur le code de cette procédure (Sub RefreshListe) :

 

Préparation de la phrase SQL :

    LstrSql = « SELECT CodCli, Nom FROM Clients ORDER BY Nom ; »


Ouverture du Recordset (DAO) :

    Set lrst = gdb.OpenRecordset( lstrSql, dbOpenForwardOnly )

on ouvre un snapshot à défilement vers l'avant car c'est le type de recordset le plus rapide. Toutefois, le seul mouvement autorisé est "MoveNext".


Boucle de balayage du Recordset (DAO)

    While not lrst.Eof
       LstCli.AddItem lrst.Fields(« Nom »)
       LstCli.ItemData(LstCli.NewIndex ) = lrst.Fields(« CodCli »)
       Lrst.MoveNext
    Wend

AddItem ajoute l'élément visible dans la liste, ici c'est le champ "Nom".

L'ajout au tableau ItemData sert à stocker, parrallèlement au nom, le code unique de la fiche client. Cette donnée sera utilisée pour afficher le détail de l'enregistrement Client, sans risque de confuqsion du à une éventuelle homonymie.

Fermeture du RecordSet :

    lrst.Close

 


Pour vous aider à comprendre ce genre de technique vous pouvez
Télécharger le projet exemple : PGesCli.zip (43 Ko)