Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
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 24/11/2010, 18h34   #1
Membre régulier
 
Guillaume
Inscription : décembre 2007
Messages : 161
Détails du profil
Informations personnelles :
Nom : Guillaume
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : décembre 2007
Messages : 161
Points : 91
Points : 91
Par défaut Erreur 2427 - attendre l'actualisation d'un sous-formulaire père/fils pour y récupérer une valeur

Bonjour !

Voici un contexte simplifié qui décrit mon problème :
- Formulaire principal : 1 champ "Article"
- Sous-formulaire : 1 champ "Total"
=> Fonctionnement : lorsque je saisis une valeur dans le champ "Article", le sous-formulaire apparaît avec le champ "Total" à jour grâce à la relation père/fils.


Mon problème : Je souhaite maintenant insérer dans la procédure After_Update du champ "Article" le code suivant :
Code :
1
2
3
Public Sub Article_AfterUpdate()
    MsgBox Nz(Me.Ss_Form.Form.Total.Value, 0)
End Sub
J'obtiens l'erreur '2427' : 'Expression sans paramètre' car le contrôle n'a pas eu le temps de se mettre à jour.
Pour y remédier, à l'heure actuelle, j'ai placé un timer d'une 1/2 seconde qui laisse le temps au sous-formulaire de s'actualiser pour être sûr d'obtenir une valeur.

Auriez-vous une idée pour résoudre ce problème plus "proprement" (en captant le moment où le sous-formulaire est prêt) ?
dut-dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 18h50   #2
Rédacteur/Modérateur
 
Avatar de Philippe JOCHMANS
 
Homme Philippe JOCHMANS
Développeur informatique
Inscription : mai 2005
Messages : 17 603
Détails du profil
Informations personnelles :
Nom : Homme Philippe JOCHMANS
Âge : 44
Localisation : France, Loir et Cher (Centre)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Communication - Médias

Informations forums :
Inscription : mai 2005
Messages : 17 603
Points : 30 939
Points : 30 939
Envoyer un message via MSN à Philippe JOCHMANS Envoyer un message via Skype™ à Philippe JOCHMANS
Bonjour

Regardes du coté de l'instruction DoEvents, cela résout pas mal de conflits de cet ordre.

Le forum est plein de solutions avec cette instruction.

Philippe
__________________
Détaillez vos questions, sinon vous aurez des réponses erronées et vous irez tout droit dans le et lisez les règles sinon
Si vous pensez commencer sans un livre, oublier : livres pour débuter
Vous pouvez consulter mes articles sur Access et PowerPoint
Le blog Office.

Inutile de m'envoyer un MP pour des questions techniques ou de me relancer , je n'y répondrais pas.
Philippe JOCHMANS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 12h04   #3
Membre régulier
 
Guillaume
Inscription : décembre 2007
Messages : 161
Détails du profil
Informations personnelles :
Nom : Guillaume
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : décembre 2007
Messages : 161
Points : 91
Points : 91
Citation:
Envoyé par Philippe JOCHMANS Voir le message
Regardes du coté de l'instruction DoEvents...
Bonjour,
justement la seule solution que j'ai trouvée c'est de poser un Timer avec DoEvents :
Code :
1
2
3
4
5
        Dim t1 As Long          'je colle une tempo d'1/2 sec
        t1 = Timer              'pour être sûr de récupérer une valeur
        While Timer - t1 < 0.5  'dans le champ "Total"
            DoEvents            'c'est moche mais je n'ai pas 
        Wend                    'trouvé de parade pour le moment
Mais ce n'est franchement pas l'idéal... j'aimerais capter l'événement d'actualisation du champ "Total" pour sortirde la boucle d'attente au plus tôt...
dut-dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 13h26   #4
Membre Expert
 
Homme Michel
Ingénieur développement logiciels
Inscription : mai 2005
Messages : 1 583
Détails du profil
Informations personnelles :
Nom : Homme Michel
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2005
Messages : 1 583
Points : 2 141
Points : 2 141
Bonjour,
pour ne pas avoir ce probleme de synchro, je te conseille de faire, dans Article_AfterUpdate , la somme via une requete, via une fonction de domaine par exemple DSum(...)
__________________
"tout le monde veut sauver la planète, mais personne ne veut descendre les poubelles." J Yanne
micniv est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 17h06   #5
Membre régulier
 
Guillaume
Inscription : décembre 2007
Messages : 161
Détails du profil
Informations personnelles :
Nom : Guillaume
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : décembre 2007
Messages : 161
Points : 91
Points : 91
Citation:
Envoyé par micniv Voir le message
Bonjour,
pour ne pas avoir ce probleme de synchro, je te conseille de faire, dans Article_AfterUpdate , la somme via une requete, via une fonction de domaine par exemple DSum(...)
Bonjour, dans mon cas réel, je peux effectivement ouvrir un Recordset pour lancer une requête et récupérer la valeur, mais je préfèrerais éviter de le faire alors que ma donnée va apparaître dans le champ "Total".

D'ailleurs, si on se place dans le cas d'un champ indépendant contenant une valeur volatile ça ne fonctionne pas...
dut-dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 17h37   #6
Membre Expert
 
Homme Michel
Ingénieur développement logiciels
Inscription : mai 2005
Messages : 1 583
Détails du profil
Informations personnelles :
Nom : Homme Michel
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2005
Messages : 1 583
Points : 2 141
Points : 2 141
Oui, tu peux actualiser le champ indépendant Total1
Dans le module du formulaire, tu fais une procédure :
Code :
1
2
3
4
5
6
7
8
 
Private sub CalculeTotalLignes()
if me.form.recordsetclone.recordcount > 0 then
Me.Total1= dsum("MontantLigne","table_des_lignes", " filtrage adequat")
else
Me.Total1= 0
end if
End sub
et tu appelles ce sub dans l'actualisation du formulaire :
Code :
1
2
3
4
5
6
 
Private Sub form_current()
 
    call CalculeTotalLignes
 
end sub
Ainsi, chaque fois que tu ouvriras le formulaire ou l'actualiseras (Me.refresh)
le montant se mettra à jour
__________________
"tout le monde veut sauver la planète, mais personne ne veut descendre les poubelles." J Yanne
micniv est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 25/11/2010, 18h00   #7
Membre régulier
 
Guillaume
Inscription : décembre 2007
Messages : 161
Détails du profil
Informations personnelles :
Nom : Guillaume
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : décembre 2007
Messages : 161
Points : 91
Points : 91
@ micniv : Merci pour ta réponse mais je précise bien dans le 1er post que je présente un cas simplifié pour que ma demande soit plus facilement compréhensible par les membres du forum.

En réalité :
- je consulte les valeurs de plusieurs champs se trouvant dans différents sous-formulaires (d'où le fait que je n'aie pas envie d'ouvrir un recordset pour chaque valeur à récupérer)
- les valeurs me servent de paramètres pour lancer une fonction publique contenue dans l'un des modules de l'application


Donc en ce qui concerne les sommes de lignes, merci de ton aide mais ce n'est pas le sujet...
dut-dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 18h33   #8
Membre régulier
 
Guillaume
Inscription : décembre 2007
Messages : 161
Détails du profil
Informations personnelles :
Nom : Guillaume
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : décembre 2007
Messages : 161
Points : 91
Points : 91
Ne trouvant pas de solution sur le forum, je me suis dit que je pouvais gérer l'erreur 2427 via le code suivant :
Code :
1
2
3
4
    If Err.Number = 2427 Then
        DoEvents
        Resume
    End If
On laisse ainsi l'erreur tourner jusqu'à ce que le sous-formulaire soit actualisé avec une valeur dans le champ "Total".

Mais dans le cas où il n'y a pas de valeur correspondant à l'article (champ père) dans la source de données du sous-formulaire, alors on se retrouve dans une boucle infinie...
dut-dut est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h04.


 
 
 
 
Partenaires

Hébergement Web