Afficher dans un contrôle d'un formulaire une valeur selon un critère
Résolu
BoJav
Messages postés
49
Date d'inscription
Statut
Membre
Dernière intervention
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je cherche à ajouter dynamiquement un valeur dans un contrôle d'un formulaire en fonction de du choix dans une liste déroulante d'un autre contrôle du même formulaire.
J'ai essayer avec Dlookup mais je n'y arrive pas.
Contexte:
Dans un formulaire basé sur une requête ajout d'une BDD pour la gestion des frais de scolarité d'une école, j'ai des contrôles indépendants qui viennent remplir la Table Elève.
J'ai uns table externe (non liée à la Tbl_Eleve) où j'ai un champs Classe_Id (clé primaire numéro automatique), un champs Classe et un champ Frais_Scolarite.
Dans le formulaire d'ajout, où j'ai le contrôle nommé FraisScol, je voudrais qu'en fonction du choix fait dans le liste déroulante (basée sur le champs Classe de la tbl_Classe) du contrôle nommée ClasseEleve, Access affiche la valeur contenue dans le champs Frais_Scolarite de la tbl_Classe dans le contrôle FraisScol du formulaire d'ajout.
J'ai essayé notamment dans les propriétés du contrôle ClasseEleve, après Maj d'entrer le code VBA
Me.FraisScol = DLookup("[Frais_Scolarite]", "tbl_Classe", "[Classe_Eleve]=ClasseEleve")
Mais le contrôle FraisScol reste désespérément vide.
D'avance merci pour votre aide.
BoJAv
Je cherche à ajouter dynamiquement un valeur dans un contrôle d'un formulaire en fonction de du choix dans une liste déroulante d'un autre contrôle du même formulaire.
J'ai essayer avec Dlookup mais je n'y arrive pas.
Contexte:
Dans un formulaire basé sur une requête ajout d'une BDD pour la gestion des frais de scolarité d'une école, j'ai des contrôles indépendants qui viennent remplir la Table Elève.
J'ai uns table externe (non liée à la Tbl_Eleve) où j'ai un champs Classe_Id (clé primaire numéro automatique), un champs Classe et un champ Frais_Scolarite.
Dans le formulaire d'ajout, où j'ai le contrôle nommé FraisScol, je voudrais qu'en fonction du choix fait dans le liste déroulante (basée sur le champs Classe de la tbl_Classe) du contrôle nommée ClasseEleve, Access affiche la valeur contenue dans le champs Frais_Scolarite de la tbl_Classe dans le contrôle FraisScol du formulaire d'ajout.
J'ai essayé notamment dans les propriétés du contrôle ClasseEleve, après Maj d'entrer le code VBA
Me.FraisScol = DLookup("[Frais_Scolarite]", "tbl_Classe", "[Classe_Eleve]=ClasseEleve")
Mais le contrôle FraisScol reste désespérément vide.
D'avance merci pour votre aide.
BoJAv
A voir également:
- Afficher dans un contrôle d'un formulaire une valeur selon un critère
- Whatsapp formulaire opposition - Guide
- Formulaire de réclamation facebook - Guide
- Afficher le 0 devant un nombre dans excel - Guide
- Afficher appdata - Guide
- Formulaire de reclamation instagram - Guide
14 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonjour,
tu écris:
c'est quoi
ne devrais-tu pas plutôt utiliser Classe de la tbl_Classe? quel est le type de ce champ?
si il est numérique, peut-être:
tu écris:
Me.FraisScol = DLookup("[Frais_Scolarite]", "tbl_Classe", "[Classe_Eleve]=ClasseEleve")
c'est quoi
Classe_Eleve?
ne devrais-tu pas plutôt utiliser Classe de la tbl_Classe? quel est le type de ce champ?
si il est numérique, peut-être:
Me.FraisScol = _ DLookup("[Frais_Scolarite]", "tbl_Classe", "Classe=" + cstr(me.ClasseEleve))
Bonjour,
Merci pour la réponse mais cela ne marche pas.
Dans tbl_Classe:
Frais_scolarite : entier long format standard décimale 0
Classe_Eleve : texte court, 40
Dans tbl_Eleve:
Frais_scolarite : entier long format standard décimale 0
Classe_Eleve : texte court, 40
Dans le formulaire (formalaire d'ajout basé sur une requête d'ajout dans la tbl_Eleve)
FraisScol (format standart, décimale 0)
ClasseEleve (format non spécifié), Propriété - Données - Contenu (tbl_Classe), source contrôle vide.
La tbl_Classe et tbl_Eleve ne sont pas liées
Où dois-je mettre le code Dlookup? Après MAJ dans les propriétés du contrôle Classe? ou dans les propriétés du contrôle FraisScol? Si sur FraisScol Où?
D'avance merci.
Merci pour la réponse mais cela ne marche pas.
Dans tbl_Classe:
Frais_scolarite : entier long format standard décimale 0
Classe_Eleve : texte court, 40
Dans tbl_Eleve:
Frais_scolarite : entier long format standard décimale 0
Classe_Eleve : texte court, 40
Dans le formulaire (formalaire d'ajout basé sur une requête d'ajout dans la tbl_Eleve)
FraisScol (format standart, décimale 0)
ClasseEleve (format non spécifié), Propriété - Données - Contenu (tbl_Classe), source contrôle vide.
La tbl_Classe et tbl_Eleve ne sont pas liées
Où dois-je mettre le code Dlookup? Après MAJ dans les propriétés du contrôle Classe? ou dans les propriétés du contrôle FraisScol? Si sur FraisScol Où?
D'avance merci.
Il n'y a pas de contrôle Classe, mais ClasseEleve
Le champs dans le table Classe est Classe_Eleve
J'ai mis DLookup dans AprèsMaj du contrôle ClasseEleve
Le champs dans le table Classe est Classe_Eleve
J'ai mis DLookup dans AprèsMaj du contrôle ClasseEleve
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Désolé, je débute sur les forums et j'essaie d'être au plus clair.
J'ai donc fait
Private Sub ClasseEleve_AfterUpdate()
Me.FraisScol = DLookup("[Frais_Scolarite]", "tbl_Classe", " Classe_Eleve = '" + CStr(Me.ClasseEleve) + "' ")
End Sub
Et cela ne donne rien, le contrôle FraisScol reste désespérément vide (et aucun bug n'est signalé).
Est-ce que cela aurait avoir avec le champs de la clé primaire de la Tbl_Classe sur lequel la liste déroulante du contrôle ClasseEleve est basée? La clé primaire est un champ numeroAuto.
NB. En essayant avec la fct RechDom dans la sourcecontrôle de FraisScol, cela signale #erreur
PS. Merci pour vos réponses.
J'ai donc fait
Private Sub ClasseEleve_AfterUpdate()
Me.FraisScol = DLookup("[Frais_Scolarite]", "tbl_Classe", " Classe_Eleve = '" + CStr(Me.ClasseEleve) + "' ")
End Sub
Et cela ne donne rien, le contrôle FraisScol reste désespérément vide (et aucun bug n'est signalé).
Est-ce que cela aurait avoir avec le champs de la clé primaire de la Tbl_Classe sur lequel la liste déroulante du contrôle ClasseEleve est basée? La clé primaire est un champ numeroAuto.
NB. En essayant avec la fct RechDom dans la sourcecontrôle de FraisScol, cela signale #erreur
PS. Merci pour vos réponses.
Private Sub ClasseEleve_AfterUpdate()
Me.FraisScol = DLookup("[Frais_Scolarite]", "tbl_Classe", " Classe_Eleve = '" + CStr(Me.ClasseEleve) + "' ")
MsgBox "afterupdate: " + Me.ClasseEleve
End Sub
la msgBox affiche le numéro d'enregistrement de la clé primaire (si je choisis la 3ème classe de la liste déroulante, il affiche dans la msgbox : afterupdate : 3
Me.FraisScol = DLookup("[Frais_Scolarite]", "tbl_Classe", " Classe_Eleve = '" + CStr(Me.ClasseEleve) + "' ")
MsgBox "afterupdate: " + Me.ClasseEleve
End Sub
la msgBox affiche le numéro d'enregistrement de la clé primaire (si je choisis la 3ème classe de la liste déroulante, il affiche dans la msgbox : afterupdate : 3
La liste du contrôle ClasseEleve du formulaire étant basé sur la tbl_classe, c'est la clé primaire de cette table.
Bien compris ta remarque sur le choix des nom, dans les tables (classe et eleve) le champs se nomme Classe_Eleve et dans le frm il est nommé ClasseEleve. Quand il s'agit de contrôle de frm je ne mets jamais de _ comme cela je pensais m'y retrouver.
Quant à Me.ClasseEleve vu qu'on parle de ClasseEleve, c'est forcément du controle du frm qu'on parle, ce qui me parait de prime abord logique vu que le critère pour renvoyer une valeur dans le contrôle FraisScol est basé sur la valeur contenue après choix dans le contrôle ClasseEleve du même frm.
Comment adapter la Dlookup, je vois pas. Préciser dans quelle table le Classe_Eleve se situe?
Stp explique-moi que je progresse.
D'avance merci.
Bien compris ta remarque sur le choix des nom, dans les tables (classe et eleve) le champs se nomme Classe_Eleve et dans le frm il est nommé ClasseEleve. Quand il s'agit de contrôle de frm je ne mets jamais de _ comme cela je pensais m'y retrouver.
Quant à Me.ClasseEleve vu qu'on parle de ClasseEleve, c'est forcément du controle du frm qu'on parle, ce qui me parait de prime abord logique vu que le critère pour renvoyer une valeur dans le contrôle FraisScol est basé sur la valeur contenue après choix dans le contrôle ClasseEleve du même frm.
Comment adapter la Dlookup, je vois pas. Préciser dans quelle table le Classe_Eleve se situe?
Stp explique-moi que je progresse.
D'avance merci.
tu as écrit "la msgBox affiche le numéro d'enregistrement de la clé primaire", et je te demande "clé primaire de quelle table"?
il sera utile, quand tu as le temps, de décrire la structure de tes tables.
avoir deux champs de même nom dans deux tables est aussi une source de confusion.
pas très logique, me semble-t-il, dans la table tbl_Classe, d'utiliser le nom Classe_Eleve.
il sera utile, quand tu as le temps, de décrire la structure de tes tables.
avoir deux champs de même nom dans deux tables est aussi une source de confusion.
pas très logique, me semble-t-il, dans la table tbl_Classe, d'utiliser le nom Classe_Eleve.
La msgBox affiche le numéro de l'enregistrement de la table Classe [tbl_Classe]
Cette table Classe à 3 champs :
Id_Classe (numéroAuto) il y a 27 enregistrements dans cette table. Exemple l'enregistrement n°3 soit 3 dans Id_Classe est maternelle 3 dans le chmaps Classe_Eleve (texte court limité à 40) avec un Frais_Scolarite (Numérique - entier long format standard, 0 décimale avec valeur par défaut 0) de 3.000. Donc si je choisi dans la liste déroulante du Frm, Maternelle 3, la msgbox me renvoie la valeur 3.
J'ai 4 tables:
tbl_Parent et tbl_Eleve qui sont lié de 1 à plusieurs partant de la tbl_Parent vers la tbl_eleve.
La clé primaire de tbl_Parent est Id_Parent (numéroauto). J'aurais préféré que la clé primaire soient basée sur un champs Parent_Matricule qui est unique mais j'ai préféré jouer la sécurité à ce stade de mes compétences.
Dans la tbl_Eleve, la clé externe qui relie à la clé primaire de tbl_Parent est un champ nommé ID2_Parent. La tbl_Eleve a une clé primaire ID_Eleve (numéroauto).
Les 2 autres tables sont
tbl_Classe (clé primaire Id_Classe - numéroauto)
tbl_SecteurMLN (clé primaire Id_Secteur - numéroauto)
Elles sont indépendantes (aucune liaison avec aucune autre table).
Idéalement j'aurais voulu construire un formulaire d'ajout avec un sous formulaire d'ajout qui permet d'enregistrer des nouveau Parents (qui doivent être filtrable par des secteurs qui sont dans la tbl_Secteur) et de nouveau élèves qui doivent être filtrable par des classes contenu dans la tbl_Classe.
J'ai donc fait 2 requêtes d'ajout (une pour les élèves et une pour les parents) et construit 2 formulaires (1 pour les élève et 1 pour les parents) basés sur ces requêtes d'ajout.
L'idée finale est de pouvoir rapporter à la comptabilité de l'entreprise MLN tel parent appartenant à tel secteur doit payer xxxx pour les frais de scolarité de ses enfants élèves inscrits à l'école.
Je suis prêt à t'envoyer la BDD par mail si tu veux.
Cette table Classe à 3 champs :
Id_Classe (numéroAuto) il y a 27 enregistrements dans cette table. Exemple l'enregistrement n°3 soit 3 dans Id_Classe est maternelle 3 dans le chmaps Classe_Eleve (texte court limité à 40) avec un Frais_Scolarite (Numérique - entier long format standard, 0 décimale avec valeur par défaut 0) de 3.000. Donc si je choisi dans la liste déroulante du Frm, Maternelle 3, la msgbox me renvoie la valeur 3.
J'ai 4 tables:
tbl_Parent et tbl_Eleve qui sont lié de 1 à plusieurs partant de la tbl_Parent vers la tbl_eleve.
La clé primaire de tbl_Parent est Id_Parent (numéroauto). J'aurais préféré que la clé primaire soient basée sur un champs Parent_Matricule qui est unique mais j'ai préféré jouer la sécurité à ce stade de mes compétences.
Dans la tbl_Eleve, la clé externe qui relie à la clé primaire de tbl_Parent est un champ nommé ID2_Parent. La tbl_Eleve a une clé primaire ID_Eleve (numéroauto).
Les 2 autres tables sont
tbl_Classe (clé primaire Id_Classe - numéroauto)
tbl_SecteurMLN (clé primaire Id_Secteur - numéroauto)
Elles sont indépendantes (aucune liaison avec aucune autre table).
Idéalement j'aurais voulu construire un formulaire d'ajout avec un sous formulaire d'ajout qui permet d'enregistrer des nouveau Parents (qui doivent être filtrable par des secteurs qui sont dans la tbl_Secteur) et de nouveau élèves qui doivent être filtrable par des classes contenu dans la tbl_Classe.
J'ai donc fait 2 requêtes d'ajout (une pour les élèves et une pour les parents) et construit 2 formulaires (1 pour les élève et 1 pour les parents) basés sur ces requêtes d'ajout.
L'idée finale est de pouvoir rapporter à la comptabilité de l'entreprise MLN tel parent appartenant à tel secteur doit payer xxxx pour les frais de scolarité de ses enfants élèves inscrits à l'école.
Je suis prêt à t'envoyer la BDD par mail si tu veux.
Yesss, ça marche!
Merci beaucoup!
J'avais essayé mais j'avais laissé les [ ] de Id_Classe et la fin + '"
Sans abuser, tu pourrais m'expliquer ce que je devrais faire pour remplacer la clé primaire (Id_Parent) de la table Parent qui est un numéro auto par la champs Matricule_Parent qui se générerait automatiquement dans un format de 4 chiffres?
Donc quand je crée un nouveau parent, automatiquement, il génére un matricule à 4 chiffres et ce champs serait la clé primaire de la table.
Je voudrais faire idem pour la tbl_eleve.
D'avance merci.
Merci beaucoup!
J'avais essayé mais j'avais laissé les [ ] de Id_Classe et la fin + '"
Sans abuser, tu pourrais m'expliquer ce que je devrais faire pour remplacer la clé primaire (Id_Parent) de la table Parent qui est un numéro auto par la champs Matricule_Parent qui se générerait automatiquement dans un format de 4 chiffres?
Donc quand je crée un nouveau parent, automatiquement, il génére un matricule à 4 chiffres et ce champs serait la clé primaire de la table.
Je voudrais faire idem pour la tbl_eleve.
D'avance merci.
Ok, et concrètement?
Le champs matricule existe déjà dans la tbl_Parent. il est au format texte court
Il est indexé sans doublons
Quelle serait la fct VBA d'assignation de la valeur? Et je devrai la mettre où?
Le champs matricule existe déjà dans la tbl_Parent. il est au format texte court
Il est indexé sans doublons
Quelle serait la fct VBA d'assignation de la valeur? Et je devrai la mettre où?
la fonction VBA fournira le matricule du nouveau parent. elle calculera ce matricule en examinant les matricules existants.
tu avais écrit "J'ai donc fait 2 requêtes d'ajout (une pour les élèves et une pour les parents) et construit 2 formulaires (1 pour les élève et 1 pour les parents) basés sur ces requêtes d'ajout."
peux-tu partager la source SQL de la requête d'ajout de parent?
tu avais écrit "J'ai donc fait 2 requêtes d'ajout (une pour les élèves et une pour les parents) et construit 2 formulaires (1 pour les élève et 1 pour les parents) basés sur ces requêtes d'ajout."
peux-tu partager la source SQL de la requête d'ajout de parent?
Le voici
INSERT INTO tbl_Parent ( Matr_MLN_Parent, Nom_Parent, Prenom_Parent, Categ_Parent, Secteur_MLN )
SELECT [Formulaires]![F_Ajout_Parent]![MatrParent] AS Expr1, [Formulaires]![F_Ajout_Parent]![NomParent] AS Expr2, [Formulaires]![F_Ajout_Parent]![PrenomParent] AS Expr3, [Formulaires]![F_Ajout_Parent]![CategParent] AS Expr4, [Formulaires]![F_Ajout_Parent]![SecteurMLN] AS Expr5;
INSERT INTO tbl_Parent ( Matr_MLN_Parent, Nom_Parent, Prenom_Parent, Categ_Parent, Secteur_MLN )
SELECT [Formulaires]![F_Ajout_Parent]![MatrParent] AS Expr1, [Formulaires]![F_Ajout_Parent]![NomParent] AS Expr2, [Formulaires]![F_Ajout_Parent]![PrenomParent] AS Expr3, [Formulaires]![F_Ajout_Parent]![CategParent] AS Expr4, [Formulaires]![F_Ajout_Parent]![SecteurMLN] AS Expr5;
J'ai demandé si tu pouvais m'aider pour remplacer la clé primaire (Id_Parent) de la table Parent qui est un numéro auto par la champs Matricule_Parent qui se générerait automatiquement dans un format de 4 chiffres.
Tu m'as répondu:
- Le mieux, alors, est d'ajouter un champ matricule (avec une clé unique), et d'utiliser une fonction VBA pour assigner la valeur de ce champ, puis
-la fonction VBA fournira le matricule du nouveau parent. elle calculera ce matricule en examinant les matricules existants, ensuite
- Veux-tu que le matricule apparaisse dans le formulaire avant la création de l'enregistrement? Enfin,
- Alors c'est dans le contrôle du formulaire qu'il faut utiliser la formule.
Et la tu me demandes ce que devrait faire cette fonction :)
Donc en résumé, comment affecter la clé primaire à un autre champs que celui d'un numéroAutomatique qui se générerait seul à partir de d'un formulaire basé sur une requête d'ajout. Ce champs qui serait la clé primaire serait un nombre de 4 chiffres et servirait de Matricule.
D'avance merci
Tu m'as répondu:
- Le mieux, alors, est d'ajouter un champ matricule (avec une clé unique), et d'utiliser une fonction VBA pour assigner la valeur de ce champ, puis
-la fonction VBA fournira le matricule du nouveau parent. elle calculera ce matricule en examinant les matricules existants, ensuite
- Veux-tu que le matricule apparaisse dans le formulaire avant la création de l'enregistrement? Enfin,
- Alors c'est dans le contrôle du formulaire qu'il faut utiliser la formule.
Et la tu me demandes ce que devrait faire cette fonction :)
Donc en résumé, comment affecter la clé primaire à un autre champs que celui d'un numéroAutomatique qui se générerait seul à partir de d'un formulaire basé sur une requête d'ajout. Ce champs qui serait la clé primaire serait un nombre de 4 chiffres et servirait de Matricule.
D'avance merci
un exemple:
Function newmatricule(table As String, champ As String, longueur As Integer) As String Dim rstab As DAO.Recordset, maxmat As Long, candidatemat As Long, hasardmat As Long, smat As String, i As Integer Set rstab = CurrentDb.OpenRecordset(table, dbOpenDynaset) maxmat = 10 ^ longueur - 1 smat = "" For i = 1 To longueur smat = smat + "0" Next i Call Randomize hasardmat = CLng(Rnd() * maxmat) candidatemat = hasardmat Do newmatricule = Format(candidatemat, smat) rstab.FindFirst ("matricule='" + newmatricule + "'") If rstab.NoMatch Then Exit Function End If ' Debug.Print "non", newmatricule candidatemat = candidatemat + 1 If candidatemat > maxmat Then candidatemat = 0 End If Loop Until candidatemat = hasardmat newmatricule = "" End Function
newmatricule("Parent", "Matricule_Parent", 4)
Merci, je vais tester cela et te reviens.
Je mets où la dernier ligne de ton message newmatricule("Parent", "Matricule_Parent", 4)?
Je mets où la dernier ligne de ton message newmatricule("Parent", "Matricule_Parent", 4)?
soit comme valeur par défaut de [MatrParent] dans le formulaire [F_Ajout_Parent]
soit directement dans la requête de création d'un enregistrement:
soit directement dans la requête de création d'un enregistrement:
INSERT INTO tbl_Parent ( Matr_MLN_Parent, Nom_Parent, Prenom_Parent, Categ_Parent, Secteur_MLN ) SELECT newmatricule("tbl_Parent", "Matr_MLN_Parent", 4), [Formulaires]![F_Ajout_Parent]![NomParent] AS Expr2, [Formulaires]![F_Ajout_Parent]![PrenomParent] AS Expr3, [Formulaires]![F_Ajout_Parent]![CategParent] AS Expr4, [Formulaires]![F_Ajout_Parent]![SecteurMLN] AS Expr5;