Afficher dans un contrôle d'un formulaire une valeur selon un critère

Résolu/Fermé
BoJav Messages postés 49 Date d'inscription mardi 23 février 2021 Statut Membre Dernière intervention 17 février 2022 - 23 févr. 2021 à 18:25
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 - 4 mars 2021 à 10:44
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
A voir également:

14 réponses

f894009 Messages postés 17185 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 15 avril 2024 1 701
24 févr. 2021 à 07:13
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
24 févr. 2021 à 14:21
bonjour,
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))
0
BoJav Messages postés 49 Date d'inscription mardi 23 février 2021 Statut Membre Dernière intervention 17 février 2022
26 févr. 2021 à 09:44
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.
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
26 févr. 2021 à 09:48
c'est quoi le contrôle Classe?
tu avais mentionne le champs Classe de la tbl_Classe: il n'existe plus?
montre-nous où tu as mis le dlookup.
0
BoJav Messages postés 49 Date d'inscription mardi 23 février 2021 Statut Membre Dernière intervention 17 février 2022
26 févr. 2021 à 15:02
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
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
26 févr. 2021 à 17:23
essaie de partager des infos correctes.

peut-être:
Me.FraisScol = _
    DLookup("[Frais_Scolarite]", "tbl_Classe", " Classe_Eleve = '" + cstr(me.ClasseEleve) +"' " )


partage tout ton code, pas uniquement une ligne.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BoJav Messages postés 49 Date d'inscription mardi 23 février 2021 Statut Membre Dernière intervention 17 février 2022
26 févr. 2021 à 18:31
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.
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
26 févr. 2021 à 18:40
et si tu ajoutes
msgbox "afterupdate: " + Me.ClasseEleve
?
0
BoJav Messages postés 49 Date d'inscription mardi 23 février 2021 Statut Membre Dernière intervention 17 février 2022
26 févr. 2021 à 18:58
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
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
26 févr. 2021 à 20:51
tu négliges d'écrire le plus important: clé primaire de quelle table?
qu'est donc
Me.ClasseEleve
, d'après toi? comment, alors, adapter le dlookup?
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471 > yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024
26 févr. 2021 à 20:53
comprends-tu qu'en choisissant le même nom pour différents éléments, tu te compliques la vie?
évite de nommer plusieurs éléments ClasseEleve, utilises des noms différents, cela t'aidera à comprendre ce que tu fais.
0
BoJav Messages postés 49 Date d'inscription mardi 23 février 2021 Statut Membre Dernière intervention 17 février 2022 > yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024
27 févr. 2021 à 11:22
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.
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471 > BoJav Messages postés 49 Date d'inscription mardi 23 février 2021 Statut Membre Dernière intervention 17 février 2022
27 févr. 2021 à 11:49
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.
0
BoJav Messages postés 49 Date d'inscription mardi 23 février 2021 Statut Membre Dernière intervention 17 février 2022
27 févr. 2021 à 12:56
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.
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
27 févr. 2021 à 13:08
as-tu créé une clé unique sur le champs Parent_Matricule?

puisque, comme tu le vois, Me.ClasseEleve correspond au champ Id_Classe de la table tbl_Classe,
je suggère ceci pour le lookup:
Me.FraisScol = _
      DLookup("[Frais_Scolarite]", "tbl_Classe", " Id_Classe = " + CStr(Me.ClasseEleve) )
0
BoJav Messages postés 49 Date d'inscription mardi 23 février 2021 Statut Membre Dernière intervention 17 février 2022
1 mars 2021 à 09:43
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.
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
1 mars 2021 à 10:54
le plus simple n'est-il pas d'utiliser Id_Parent comme matricule?
0
BoJav Messages postés 49 Date d'inscription mardi 23 février 2021 Statut Membre Dernière intervention 17 février 2022 > yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024
1 mars 2021 à 11:24
Le problème est qu'une partie des matricule existe déjà avant la création de cette base de données Access.
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471 > BoJav Messages postés 49 Date d'inscription mardi 23 février 2021 Statut Membre Dernière intervention 17 février 2022
1 mars 2021 à 11:33
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.
0
BoJav Messages postés 49 Date d'inscription mardi 23 février 2021 Statut Membre Dernière intervention 17 février 2022
1 mars 2021 à 11:39
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ù?
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
1 mars 2021 à 12:02
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?
0
BoJav Messages postés 49 Date d'inscription mardi 23 février 2021 Statut Membre Dernière intervention 17 février 2022
1 mars 2021 à 15:35
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;
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
1 mars 2021 à 15:38
veux-tu que le matricule apparaisse dans le formulaire avant la création de l'enregistrement?
0
BoJav Messages postés 49 Date d'inscription mardi 23 février 2021 Statut Membre Dernière intervention 17 février 2022
1 mars 2021 à 16:38
Oui stp
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
1 mars 2021 à 16:56
alors c'est dans le contrôle du formulaire qu'il faut utiliser la formule.
0
BoJav Messages postés 49 Date d'inscription mardi 23 février 2021 Statut Membre Dernière intervention 17 février 2022 > yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024
1 mars 2021 à 18:26
Ok et je rentre quel code VBA et sur quel événement?
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471 > BoJav Messages postés 49 Date d'inscription mardi 23 février 2021 Statut Membre Dernière intervention 17 février 2022
1 mars 2021 à 21:40
il faut d'abord écrire la fonction, et ensuite l'utiliser comme valeur par défaut pour le contrôle matricule.
0
BoJav Messages postés 49 Date d'inscription mardi 23 février 2021 Statut Membre Dernière intervention 17 février 2022
2 mars 2021 à 11:18
Ok, je suis incapable d'écrire cette fonction, tu peux m'aider?
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
2 mars 2021 à 12:28
que devrait faire cette fonction?
0
BoJav Messages postés 49 Date d'inscription mardi 23 février 2021 Statut Membre Dernière intervention 17 février 2022
3 mars 2021 à 09:32
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
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
3 mars 2021 à 09:44
comment la fonction doit-elle calculer le nouveau matricule en tenant compte des matricules existants?
elle peut choisir n'importe quel matricule non utilisé?
0
BoJav Messages postés 49 Date d'inscription mardi 23 février 2021 Statut Membre Dernière intervention 17 février 2022 > yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024
3 mars 2021 à 10:14
Oui, le matricule doit se composé de 4 chiffres ex: 1252
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471 > BoJav Messages postés 49 Date d'inscription mardi 23 février 2021 Statut Membre Dernière intervention 17 février 2022
3 mars 2021 à 11:07
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)
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471 > yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024
4 mars 2021 à 10:44
la ligne 14 devrait être:
rstab.FindFirst (champ + " = '" + newmatricule + "' ")  
0
BoJav Messages postés 49 Date d'inscription mardi 23 février 2021 Statut Membre Dernière intervention 17 février 2022
4 mars 2021 à 10:15
Merci, je vais tester cela et te reviens.

Je mets où la dernier ligne de ton message newmatricule("Parent", "Matricule_Parent", 4)?
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
4 mars 2021 à 10:43
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:
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;
0