La puissance des bases de données est un atout pour vos programmes, que ce soit de la gestion de fiches simple ou des enregistrements avec des calculs, de la finance ou autre. La méthode que je vous décrirai ici est celle utilisée dans DataPro. Elle est assez simple mais il faut suivre...
Préparation du projet de base de donnée :
L'application que nous allons créer sera monodocument. La feuille sera constituée de :
contrôle Data "Data1"
grille de donnée "DBGrid" (ocx Microsoft DataBound Grid Control)
Liste simple "lstRecordsets"Propriétés à régler pour Data1 :
Connect = "Access"
DatabaseName = "C:\Program Files\Microsoft Visual Studio\VB98\Biblio.mdb"
DefaultType = UseJet
Exclusive = False
ReadOnly = False
RecordsetType = Dynaset
RecordSource = ""
Contrôle Propriété Valeur Data1 Connect "Access" Data1 DatabaseName "C:\Program Files\Microsoft Visual Studio\VB98\Biblio.mdb" Data1 DefaultType UseJet Data1 Exclusive False Data1 ReadOnly False Data1 RecordsetType Dynaset Data1 RecordSource "" La liste simple listera toutes les tables contenues dans la base de donnée. voici la structure d'une base de données.
La base de donnée regroupe les Collections Recordsets et TableDefs.
La collection TableDefs permet d'établir la liste des Tables contenues dans la base de données, quelquesoit le filtre (tri, recherche) appliquée à la base de données. Une table (TableDef) est une grille constituée de Champs (Fields) et de fiches (Rows) qui forment une grille de données (comme dans Works). L'ensemble constitue une collection de Tables (TableDefs).
La collection Recordsets permet d'accéder aussi aux objets Recordset de la base de données. Un objet Recordset représente les enregistrements résultant de l'exécution d'une requête (Recherche, Tri...). Les objets Recordset servent à manipuler des données dans une base de données au niveau de l'enregistrement.
La collection Fields :
Dans le cas d'un objet TableDef, elle représente l'ensemble de tous les champs d'une table déterminée
Dans le cas d'un objet Recordset, elle représente l'ensemble des champs sélectionnés par une requête dans une table
déterminée.Accès aux Tables de la base de données :
Vous avez compris l'organigramme ? Si oui, voici un exercice :
Niveau : 3 Exercice : la liste simple référençant tous les noms des TableDefs de la base de donnée, programmez un code qui permette au chargement de la feuille de remplir cette liste :
Indice 1 : le nom d'une table d'une base de données est enregistré dans sa propriété TableDef.Name.
Indice 2 : stockée dans une collection Tabledefs, une table est accessible par : TableDefs(1) par exemple.
Indice 3 : On utilise une boucle For. La collection TableDefs nous donne les bornes de la boucle grâce à la propriété Count ôtée de 1.Réponse : Voilà la procédure à mettre dans Load :
Private Sub Form_Load()
Data1.Refresh
For i = 0 To Data1.Database.TableDefs.Count - 1
lstRecordsets.AddItem Data1.Database.TableDefs(i).Name, lstRecordsets.ListCount
Next i
DBGrid1.ReBind
End SubMaintenant, il va s'agir d'afficher dans la grille de donnée, la table sur laquelle on cliquera dans la liste de gauche. Remarquez que les tables commençant par MSys sont protégées et servent à la base de donnée. Voici comment faire pour cela :
Private Sub lstRecordsets_Click()
On Error Resume Next 'A Cause des Tables MSys !!!
Data1.RecordSource = lstRecordsets.List(lstRecordsets.ListIndex) 'Sélectionne la table
Data1.Refresh 'Rafraîchit la base de donnée
DBGrid1.ReBind 'Remet à jour le contenu de la grille en fonction de Data1
End SubOn pourra effectuer un tri des tables dans le code de Form_Load puis enlever la gestion d'erreur pour ne plus avoir dans la liste des tables les tables "MSys..." grâce à la fonction Left$()
Tri des champs dans une table déterminée :
Ajoutez à la feuille une autre liste simple "lstFields" :
Contrôle Propriété Valeur lstFields Style CheckBox lstFields MultiSelect None On cochera sur cette liste les champs que l'on veut et l'on mettra a jour en cliquant sur un bouton "Command2". Il faut donc s'occuper du listage des champs de la table sélectionnée avec l'autre liste lstRecordsets. Voici donc le nouveau code de lstRecordsets_Click() :
Private Sub lstRecordsets_Click()
On Error Resume Next 'A Cause des Tables MSys !!!
Data1.RecordSource = lstRecordsets.List(lstRecordsets.ListIndex) 'Sélectionne la table
Data1.Refresh 'Rafraîchit la base de donnée
DBGrid1.ReBind 'Remet à jour le contenu de la grille en fonction de Data1
lstFields.Clear 'Ne pas oublier d'effacer avant tout !
For i = 0 To Data1.Recordset.Fields.Count - 1 'boucle comme pour les tables
lstFields.AddItem Data1.Recordset.Fields(i).Name 'idem avec name
Next i
End SubVoici alors le résultat en exécution : Remarquez le bouton "Sélectionner" qui est le Command2 qui servira à appliquer la sélection des champs à afficher dans la grille de donnée.
Niveau 4 : Exercice : Programmez le code de Command2 qui affiche les champs sélectionnés : pour cela, on utilise la propriété RecordSource. Exemple qui sélectionne 3 champs dans la table Titles :
Select [Title],[ISBN],[Notes] From [Titles]
Indice 1: Testez les valeurs de la liste des champs
Indice 2: Faites une boucle !
Indice 3: cmd$ = cmd$ & "[" & lstfields.list(i) & "],"
Indice 4: attention à la virgule finale (ôter avec Left$)
Indice 5: Terminer par " FROM TableName"Pas facile... Voici la réponse :
Private Sub Command2_Click()
cmd$ = "Select " 'Début de commande
For i = 0 To lstFields.ListCount - 1 'Boucle
If lstFields.Selected(i) = True Then
cmd$ = cmd$ & "[" & lstFields.List(i) & "]," 'Ajout du champ sélectionné
End If
Next i
If cmd$ = "Select " Then Exit Sub 'Si rien sélectionné, quitter la procédure
cmd$ = Left$(cmd$, Len(cmd$) - 1) 'Enlève la virgule finale
cmd$ = cmd$ & " From [" & lstRecordsets.List(lstRecordsets.ListIndex) & "] "
MsgBox cmd$ 'pour infos (facultatif)
Data1.RecordSource = cmd$ 'Requête d'affichage appliquée
Data1.Refresh 'Mise à jour de la base
DBGrid1.ReBind 'Actualisation de la grille
End Sub