Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/06/2011, 18h36   #1
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 11
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2011
Messages : 11
Points : 2
Points : 2
Par défaut Concevoir une liste qui en alimente une autre (d'un formulaire vers un sous formulaire)

Bonjour
Dans le but de faire évoluer une base de donnée (de type gestion de collections ...... Initialement mono- collection que je désire faire évolué en multi-collection) et après un certain nombre de recherches je suis tombé sur un excelent Tuto "Concevoir une liste qui en alimente une autre" (http://argyronet.developpez.com/offi...ectitemlistAB/) qui décrit et correspond exactement à mes besoins.
J'ai réalisé le Pas à Pas pour bien la comprendre avant d'implanter cette méthode dans ma propre base.
Toutefois si la méthode est opérationnelle sur un formulaire unique, mon besoin est que "cmbCatégorie" mette à jour "cmbMetiers" qui ce trouve sur un sous-formulaire (appelé "SFMetier", le formulaire accueillant "cmbCatégorie" s'appelle quand à lui "FCatégorie")

D'approche autodidacte je possède des manques dans mon approche et progresse de manière irrégulière en fonction des besoins de l'évolution des bases que je réalise. J'ai bien conscience, après un certain temps de recherche que la solution ce trouve à partir de la ligne : ...cmbMetier3.RowSource = SQL en y insérant "Forms!" .... Mais je ne suis pas arrivé à l'implanter dans cet exemple. Pourriez vous m'aider SVP.
Je vous remercie d'avance de l’intérêt que vous pourrez porter à mon problème

Cordialement

Descriptif des éléments :
Les tables : TBLCategorie (Clé primaire IDCategorie) et TBLMetier (Clé primaire IDMetier)
Les listes de choix : cmbCategorie3 et cmbMetier3
Les formulaires : FCategorie et SFMetier

Voici le code :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub cmbCategorie3_AfterUpdate()
''SELECT TBLCategorie.IDCategorie, TBLCategorie.Categorie FROM TBLCategorie ORDER BY TBLCategorie.Categorie;
''SELECT TBLMetier.IDMetier, TBLMetier.Metier FROM TBLMetier ORDER BY TBLMetier.Metier;
Dim lngIDCat   As Long
Dim SQL        As String
  '' Vérifie que l'on a cliqué sur une catégorie pour éviter le NULL
  If Not IsNumeric(Me!cmbCategorie3) Then Exit Sub
  '' Affecte la valeur de IDCategorie à la variable lngIDCat
  lngIDCat = Me!cmbCategorie3
  '' Construit la chaîne SQL avec la catégorie concernée
  SQL = "SELECT IDMetier, Metier, IDCategorie FROM TBLMetier WHERE IDCategorie =" & lngIDCat & " ORDER BY Metier"
   MsgBox "Vous venez de changer de collection"
  '' Affecte la chaîne SQL à la liste des métiers
cmbMetier3.RowSource = SQL
  '' Déverrouille la liste des métiers
cmbMetier3.Enabled = True
  '' Donne le focus la liste des métiers
cmbMetier3.SetFocus
  '' Déroule la liste des métiers
  Me!cmbMetier3.Dropdown
End Sub
BRETON29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/06/2011, 21h12   #2
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 242
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 242
Points : 11 040
Points : 11 040
Bonsoir,

Si tu peux poster un zip de ta BDD dans une version compatible avec Access2000, je veux bien t'accompagner dans ta progression.

PS : Vois cette documentation

Les syntaxes d'appel : Interaction des formulaires et états. (loufab)
ClaudeLELOUP est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/06/2011, 22h07   #3
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 11
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2011
Messages : 11
Points : 2
Points : 2
Bonsoir,
avant tout merci de votre réponse .... cela fait 2 jours que je dépouille les forums (dont le lien que vous m'avez donné en PJ) et fais moultes essais totalement stériles.
Je joint le fichier d'essais converti en Access2000 ...... Malheureusement ayant travaillé sur Access2007 la conversion semble ne plus rendre compatible le code.
Toutefois voici le descriptif des éléments.
Le formulaire "00_pas a pas" est le formulaire d'essais (et fonctionnel ... en 2007 du moins)
Le formulaire "FCategorie" est le formulaire de base qui supportera le sous formulaire
Le formulaire "SFMetier" est le sous-formulaire.
Le code est implanté sur le menu déroulant "catégorie" du formulaire "FCategorie" / Evenement "Après MAJ"

Cordialement
BRETON29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 08h27   #4
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 242
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 242
Points : 11 040
Points : 11 040
Bonjour,

C'était bien un problème de référencement.

Voici la syntaxe de l'évènement "Àprès Mise à Jour" de cmbCategorie3 (formulaire principal)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub cmbCategorie3_AfterUpdate()
Dim lngIDCat   As Long
Dim SQL        As String
 
  '' Vérifie que l'on a cliqué sur une catégorie pour éviter le NULL
  If Not IsNumeric(Me!cmbCategorie3) Then Exit Sub
  '' Affecte la valeur de IDCategorie à la variable lngIDCat
  lngIDCat = Me!cmbCategorie3
  '' Construit la chaîne SQL avec la catégorie concernée
 
  SQL = "SELECT IDMetier, Metier, IDCategorie FROM TBLMetier WHERE IDCategorie =" & lngIDCat & " ORDER BY Metier"
   MsgBox "Vous venez de changer de collection"
  '' Affecte la chaîne SQL à la liste des métiers
Me.[SF pour Formulaire3].Form.Modifiable3.RowSource = SQL
  '' Déverrouille la liste des métiers
Me.[SF pour Formulaire3].Form.Modifiable3.Enabled = True
  '' Donne le focus la liste des métiers
Me.[SF pour Formulaire3].Form.Modifiable3.SetFocus
  '' Déroule la liste des métiers
Me.[SF pour Formulaire3].Form.Modifiable3.Dropdown
End Sub
Autres points :

- évite les caractères spéciaux dans le nom des contrôles. À ce sujet : conventions typographiques ;
- demande le compactage systématique de tes BDD lors de la fermeture
Outils/Options/onglet Général : cocher la case Compacter lors de la fermeture.

À la prochaine.
ClaudeLELOUP est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 22h53   #5
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 11
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2011
Messages : 11
Points : 2
Points : 2
Bonsoir
Un grand merci pour les modifications apportées au code de base ……… Il est parfaitement fonctionnel et il ne me reste plus qu’a bien le comprendre pour l’implanter correctement dans ma base.

Quelques petits constats malgré tout :

Lors du premier essai, le couple formulaire/sous-formulaire fonctionnait correctement. Toutefois après fermeture et ouverture (compactage réalisé) le formulaire ce bloque avec le message ci-dessous en guise d’explication.

Pour contourner le problème j’ai placé une MsgBox sur l’événement « Sur chargement » du formulaire principal ce qui semble « Dégripper » le formulaire qui ne pose plus dès lors de difficulté à l’ouverture (effectivement, c'est une solution un peut biscornue). Il est a noter que ce phénomène était déjà présent sur mon « pas à pas » issue du tuto (d’où la MsgBox qui s’ouvre à chaque changement de liste Catégorie) ……… Bon, je pense que le problème doit venir de mon environnement.

Un autre point qui tiens plus de l’affinage pour rendre le couple formulaire/sous-formulaire plus efficace serait de ne pas dérouler la seconde liste automatiquement mais d’appeler directement le 1er enregistrement proposé. En effet, lorsque l’on sélectionne une catégorie, la liste Métier propose des choix (c’est sa fonction après tout) ….. que l’on valide. Mais à ce moment-là les données de la table attachées au sous-formulaire ne sont pas encore chargées (on le remarque bien en surveillant le compteur d’enregistrement) et donc les données résultantes du choix sont fausses … il faut re-sélectionner une seconde fois pour enfin avoir les données adéquates. Pareillement si l’on referme la liste métier sans faire de choix et que l’on désire par la suite y faire une sélection … les données dans le menu reste visibles mais ne permettent plus de mettre à jour le sous formulaire (il faut resélectionner la catégorie pour pouvoir rendre de nouveau la liste métier opérationnelle) …… D’où mon impression qu’il serait mieux de « forcer » l’affichage du premier enregistrement que proposera la liste métier ……… A ce niveau je vais dans un premier temps essayer de trouver la solution (après tout … le plaisir du résultat se trouve en partie dans l’effort pour y parvenir.)

Enfin, et cela reste à confirmer, j’ai l’impression que plus le nombre de métiers est grand dans une catégorie donnée, plus le chargement des données est long …… si cela s’avère exact ce système sera-t-il compatible avec ma base qui comprend plusieurs milliers de fiches.

Voilà pour ce bilan de fin de post. Je laisse en PJ une version fonctionnelle (convertie en Access2003) de cette base d’essais pour qui voudrez s’en inspirer.

Encore une fois je vous remercie pour votre aide.

Cordialement.
Fichiers attachés
Type de fichier : rar Modéle de listes déroulantes synchronisés Access2000-02-03.rar (52,1 Ko, 5 affichages)
BRETON29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 08h08   #6
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 242
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 242
Points : 11 040
Points : 11 040
Bonjour,

Cette fois, je ne peux plus lire ta BDD jointe avec ma version Access2000.
Peux-tu y remédier ?
ClaudeLELOUP est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 18h06   #7
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 11
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2011
Messages : 11
Points : 2
Points : 2
Bonjour
Voila qui est fait .... j'ai remplacer l'archive dans le post ci-dessus, en y ajoutant la version 2000 ... Toutefois le constat de la première fois reste le même la conversion ne fonctionne pas avec access 2000 (du moins chez moi) mais en ouvrant sur le formulaire principal avec le Runtime 2007 le code reprend du service.
BRETON29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 22h28   #8
Rédacteur

 
Avatar de ClaudeLELOUP
 
Homme Claude LELOUP
Chercheur de loisirs (ayant trouvé !)
Inscription : novembre 2006
Messages : 5 242
Détails du profil
Informations personnelles :
Nom : Homme Claude LELOUP
Âge : 66
Localisation : Belgique

Informations professionnelles :
Activité : Chercheur de loisirs (ayant trouvé !)
Secteur : Finance

Informations forums :
Inscription : novembre 2006
Messages : 5 242
Points : 11 040
Points : 11 040
Bonsoir Breton29,

Voici un exemple avec tes données.
Bien que ce n’était pas ici nécessaire, j’ai conservé la structure formulaire/sous-formulaire : occasion de te montrer la syntaxe.

J’ai structuré tes données, pour éviter les redondances


Ensuite, je te propose de travailler avec des requêtes enregistrées, plutôt que de les construire à la volée.
Cela te permet de te faire aider par l’assistant.

Les voici :


Et avec cela, un minimum de code* :

Dans le formulaire

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Sub cmbCategorie_AfterUpdate()
'On actualise le contenu de la source de cmbMetier
Me.SFormulaire.Form!cmbMetier.Requery
'on vérifie si la liste des métiers contient plusieurs items
'astuce : s'il n'y a pas de deuxième, c'est qu'il n'y en a qu'un !
'on teste donc si le deuxième est Null
If IsNull(Me.SFormulaire.Form!cmbMetier.ItemData(1)) Then
   'on aménage le premier (seul) de la liste
   Me.SFormulaire.Form!cmbMetier = Me.SFormulaire.Form!cmbMetier.ItemData(0)
   ' on actualise la source du sous-formulaire
   Me.SFormulaire.Requery
Else 's'il y en a plusieurs,
   'on déroule la liste
   Me.SFormulaire.Form!cmbMetier.SetFocus
   Me.SFormulaire.Form!cmbMetier.Dropdown
End If
End Sub


et dans le sous-formulaire.


Code :
1
2
3
4
Private Sub cmbMetier_AfterUpdate()
'Réactualiser
Me.Requery
End Sub
* Les commentaires devraient te permettre de comprendre ce qu’on y fait.
Pour te documenter davantage, place le curseur de souris sur un mot-clé et l’aide Access s’ouvrira à la bonne page.

Reviens si problème.
Images attachées
Type de fichier : jpg Breton29_01.jpg (210,1 Ko, 34 affichages)
Type de fichier : jpg Breton29_02.jpg (205,3 Ko, 33 affichages)
Fichiers attachés
Type de fichier : zip 20110621BRETON29.zip (30,9 Ko, 13 affichages)
ClaudeLELOUP est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 23/06/2011, 17h58   #9
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 11
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2011
Messages : 11
Points : 2
Points : 2
Bonjour,
Je viens de tester le code en l'adaptant à une partie de ma base et il fonctionne à merveille. .... Il répond complétement à ce que je désirai obtenir, même si je ne l'ai pas encore testé sur l'ensemble des fiches et un formulaire ne comprenant encore tout ses éléments, l’accès aux données semble resté fluide.
Voilà ... il ne me reste plus qu'a reconstruire ma base pour mettre à profit vos conseils et solutions.
Merci.
BRETON29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h30.


 
 
 
 
Partenaires

Hébergement Web