Access:Formulaire de consultation des données
Résolu
Melycea
-
Melycea -
Melycea -
Bonjour à toutes et à tous,
Je suis en train de créer une base de données sous Access 97.
Maintenant que j'ai bien organisé toutes mes données je voudrai créer un formulaire pour y avoir accès.
Comme c'est la première fois que j'utilise access, je ne sais pas si c'est la meilleure solution.
En fait, je voudrai que quand l'utilisateur saisi une référence, après il y aurait différents champs qui se remplirait avec des données de plusieurs tables, voire, des données calculées, pour donner une sorte de fiche technique de l'objet correspondant à la référence.
J'ai commencé une ébauche mais je ne sais pas du tout comment faire les liens...
Via un bouton avec macro? procédure vba? ou autre chose?
Merci beaucoup pour toute aide.
Je suis en train de créer une base de données sous Access 97.
Maintenant que j'ai bien organisé toutes mes données je voudrai créer un formulaire pour y avoir accès.
Comme c'est la première fois que j'utilise access, je ne sais pas si c'est la meilleure solution.
En fait, je voudrai que quand l'utilisateur saisi une référence, après il y aurait différents champs qui se remplirait avec des données de plusieurs tables, voire, des données calculées, pour donner une sorte de fiche technique de l'objet correspondant à la référence.
J'ai commencé une ébauche mais je ne sais pas du tout comment faire les liens...
Via un bouton avec macro? procédure vba? ou autre chose?
Merci beaucoup pour toute aide.
A voir également:
- Access:Formulaire de consultation des données
- Acer quick access - Forum Logiciels
- Access appdata - Guide
- Exemple base de données access à télécharger gratuit - Forum Access
- Exemple base de données Access de gestion ✓ - Forum Logiciels
- Quick acces ✓ - Forum Windows
5 réponses
Bonjour,
Suggestion :
Table -> Requete -> Formulaire
Créer une requête qui rassemble vos données
Créer un formulaire qui affiche toutes vos données
Créer une requête spécifique avec une référence donnée.
Au moment de la création de cette requête, passer en mode
SQL, et capturé le chaine SQL.
Dim ChaineSQL As String
ChaineSQL = "SELECT "
ChaineSQL = ChaineSQL & "T1.Champs1, "
ChaineSQL = ChaineSQL & "T2.Champs1 "
ChaineSQL = ChaineSQL & "FROM "
ChaineSQL = ChaineSQL & "Table1 T1, Table2 T2 "
ChaineSQL = ChaineSQL & "WHERE "
ChaineSQL = ChaineSQL & "T1.Champs1 = "
ChaineSQL = ChaineSQL & """"" & lbx_reference.text & """"
ChaineSQL = ChaineSQL & ";"
À partir d'une liste déroulante qui pointe sur les références,
tu pourras au changement de cette liste, modifier par
programmation la requête capturé et réexécuter cette requête
qui afficheras les nouvelles données.
Ça semble complexe, mais c'est relativement simple,
j'ai trouvé cette méthode dans mon bouquin de VBA Access 97.
Je te fournirai dans un message ultérieur le code pour modifier
la requête.
Bien entendu, si cette suggestion t'intéresse ?
Cdt
Lupin
Suggestion :
Table -> Requete -> Formulaire
Créer une requête qui rassemble vos données
Créer un formulaire qui affiche toutes vos données
Créer une requête spécifique avec une référence donnée.
Au moment de la création de cette requête, passer en mode
SQL, et capturé le chaine SQL.
Dim ChaineSQL As String
ChaineSQL = "SELECT "
ChaineSQL = ChaineSQL & "T1.Champs1, "
ChaineSQL = ChaineSQL & "T2.Champs1 "
ChaineSQL = ChaineSQL & "FROM "
ChaineSQL = ChaineSQL & "Table1 T1, Table2 T2 "
ChaineSQL = ChaineSQL & "WHERE "
ChaineSQL = ChaineSQL & "T1.Champs1 = "
ChaineSQL = ChaineSQL & """"" & lbx_reference.text & """"
ChaineSQL = ChaineSQL & ";"
À partir d'une liste déroulante qui pointe sur les références,
tu pourras au changement de cette liste, modifier par
programmation la requête capturé et réexécuter cette requête
qui afficheras les nouvelles données.
Ça semble complexe, mais c'est relativement simple,
j'ai trouvé cette méthode dans mon bouquin de VBA Access 97.
Je te fournirai dans un message ultérieur le code pour modifier
la requête.
Bien entendu, si cette suggestion t'intéresse ?
Cdt
Lupin
re:
Voici l'exemple :
L'évènement après mise à jour de la liste déroulante
Il est toujours souhaitable, de ne jamais adresser
la table directement, donc un état ou un formulaire
seront toujours accroché à une requête et cette
requête interroge la table. De cette façon le formulaire
souhaité, peux toujours pointé le client (l'affaire, buisness...)
Si ton formulaire pointe directement sur la BD, ce sera
plus difficile de la "dynamiser", le rendre convivial
pour l'utilisateur ...
avec ces 2 petites routines, tu peux ouvrir n'importe quel
Formulaires ou État dans l'état que tu le souhaite :-)
et la fonction de mise à jour d'une requête par VBA :
Cdt
Lupin
Voici l'exemple :
L'évènement après mise à jour de la liste déroulante
Il est toujours souhaitable, de ne jamais adresser
la table directement, donc un état ou un formulaire
seront toujours accroché à une requête et cette
requête interroge la table. De cette façon le formulaire
souhaité, peux toujours pointé le client (l'affaire, buisness...)
Si ton formulaire pointe directement sur la BD, ce sera
plus difficile de la "dynamiser", le rendre convivial
pour l'utilisateur ...
avec ces 2 petites routines, tu peux ouvrir n'importe quel
Formulaires ou État dans l'état que tu le souhaite :-)
Private Sub Liste_References_AfterUpdate() Dim Chaine As String Dim ChaineSQL As String Dim CassetteVideo As String On Error GoTo Liste_Cassette_Err ' Charger variables CassetteVideo = Forms![Formulaire Édition Liste Vidéo].[Liste Cassette].Value ' Créer requête SQL Chaine = "SELECT " Chaine = Chaine & "T1.Mode, " Chaine = Chaine & "T1.Numéro, " Chaine = Chaine & "T1.Cassette" Chaine = Chaine & "T1.Année " Chaine = "FROM [Table Vidéo] T1 WHERE T1.Cassette = " ChaineSQL = Chaine & """" & CassetteVideo & """" ' Appel de fonction avec paramétres ( le nom de la requête, la requête ) If (ChangeRequeteDef("Requête Liste Spécifique Cassette", ChaineSQL)) Then DoCmd.OpenForm "Formulaire Liste Spécifique Édition Cassette", acNormal, "", "[Cassette]", , acNormal End If Liste_Cassette_Exit: Exit Sub Liste_Cassette_Err: MsgBox Error$ Resume Liste_Cassette_Exit End Sub '
et la fonction de mise à jour d'une requête par VBA :
Option Compare Database Option Explicit Public Function ChangeRequeteDef(NomRequete As String, ChaineSQL As String) As Boolean Dim Definition As QueryDef If ((NomRequete = "") Or (ChaineSQL = "")) Then ChangeRequeteDef = False Else Set Definition = CurrentDb.QueryDefs(NomRequete) Definition.SQL = ChaineSQL Definition.Close RefreshDatabaseWindow ChangeRequeteDef = True End If End Function '
Cdt
Lupin
Tout d'abord, merci beaucoup pour ta réponse assez rapide!
Je pense que ta solution correspond bien à ce que je voulais pour commencer.
Je commence juste à essayer d'intégrer tout ça dans ma base de données et j'ai un petite question : dans la "requête spécifique" à quoi correspond Ibx_reference.txt ? (est-ce que c'est le champ de la liste déroulante?)
Et je comprend pas trop pourquoi on utilise deux tables dans la requête SQL?
C'est une auto-jointure ou c'est par rapport au fait que j'ai des données provenant de plusieurs tables?
Ensuite, dans les deux routines, c'est juste pour être sûre d'avoir bien compris : la procédure se déclenche après modification dans le formulaire et met à jour les données en modifiant la requête SQL qui les "fournit"... c'est bien ça?!
Puis, juste par curiosité, pourquoi c'est mieux de pointer vers une requête que vers une table?
Je pense que ta solution correspond bien à ce que je voulais pour commencer.
Je commence juste à essayer d'intégrer tout ça dans ma base de données et j'ai un petite question : dans la "requête spécifique" à quoi correspond Ibx_reference.txt ? (est-ce que c'est le champ de la liste déroulante?)
Et je comprend pas trop pourquoi on utilise deux tables dans la requête SQL?
C'est une auto-jointure ou c'est par rapport au fait que j'ai des données provenant de plusieurs tables?
Ensuite, dans les deux routines, c'est juste pour être sûre d'avoir bien compris : la procédure se déclenche après modification dans le formulaire et met à jour les données en modifiant la requête SQL qui les "fournit"... c'est bien ça?!
Puis, juste par curiosité, pourquoi c'est mieux de pointer vers une requête que vers une table?
re:
1.)
en effet lbx_reference correspond à une liste déroulante, dans mon code à moi,
l'instruction suivante capture la valeur de la listebox :
CassetteVideo = Forms![Formulaire Édition Liste Vidéo].[Liste Cassette].Value
2.)
je t'ai fournit un exemple avec 2 tables effectivement car tu as écrit que tu avais
2 tables, et non ce n'est pas une auto-jointure mais plutôt le fait que tu ais 2 tables.
Une jointure serait plutôt du style :
3.)
En effet la procédure se déclenche sur l'évènement AfterUpdate de la
liste déroulante :
Private Sub Liste_References_AfterUpdate()
Dans mon code, le nom de la procédure est :
Private Sub Liste_Cassette_AfterUpdate()
-> la même qu'au point 1 de ce message.
4.)
Justement à cause de ce que tu souhaite réalisé. Si ton formulaire
pointe directement sur un table, tu auras toujours tous les enregistrements
dans ton formulaire, alors que si celui-ci pointent sur une requête
c'est la requête qui défini les enregistrements a afficher.
Dans ma BD de Vidéothèque, j'ai plusieurs liste déroulante qui me
donne la possibilité de choisir les enregistrements par style ( drame, comédie,
etc ...), par catégorie ( policier, science-fiction, fantastique, etc... ), par
acteurs, par série, par titre, par réalisateur, etc ...
Si mon formulaire était accroché sur une table, une fois les champs
a afficher choisi, je ne pourrais plus les modifier, alors qu'avec une requête
je peux les modifier à volonté puisque la requête est modifiable par
programmation.
Je ne pourrais te traduire mot à mot le texte de mon bouquin (VBA Access 97),
mais il est clair que c'est la meilleur façon de faire, depuis plus de 10 ans que je code sous Access, je eu le loisirs de vérifier et de valider cette façon de faire.
Cdt
Lupin
1.)
en effet lbx_reference correspond à une liste déroulante, dans mon code à moi,
l'instruction suivante capture la valeur de la listebox :
CassetteVideo = Forms![Formulaire Édition Liste Vidéo].[Liste Cassette].Value
2.)
je t'ai fournit un exemple avec 2 tables effectivement car tu as écrit que tu avais
2 tables, et non ce n'est pas une auto-jointure mais plutôt le fait que tu ais 2 tables.
Une jointure serait plutôt du style :
SELECT T1.Champ1, T1.Champ2, T2.Champ2 FROM Table1 T1 INNER JOIN Table2 T2 ON T1.Champ1 = T2.Champ1 WHERE T1.Champ1 = lbx_Reference.Value
3.)
En effet la procédure se déclenche sur l'évènement AfterUpdate de la
liste déroulante :
Private Sub Liste_References_AfterUpdate()
Dans mon code, le nom de la procédure est :
Private Sub Liste_Cassette_AfterUpdate()
-> la même qu'au point 1 de ce message.
4.)
Justement à cause de ce que tu souhaite réalisé. Si ton formulaire
pointe directement sur un table, tu auras toujours tous les enregistrements
dans ton formulaire, alors que si celui-ci pointent sur une requête
c'est la requête qui défini les enregistrements a afficher.
Dans ma BD de Vidéothèque, j'ai plusieurs liste déroulante qui me
donne la possibilité de choisir les enregistrements par style ( drame, comédie,
etc ...), par catégorie ( policier, science-fiction, fantastique, etc... ), par
acteurs, par série, par titre, par réalisateur, etc ...
Si mon formulaire était accroché sur une table, une fois les champs
a afficher choisi, je ne pourrais plus les modifier, alors qu'avec une requête
je peux les modifier à volonté puisque la requête est modifiable par
programmation.
Je ne pourrais te traduire mot à mot le texte de mon bouquin (VBA Access 97),
mais il est clair que c'est la meilleur façon de faire, depuis plus de 10 ans que je code sous Access, je eu le loisirs de vérifier et de valider cette façon de faire.
Cdt
Lupin
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question