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 30/01/2012, 14h12   #1
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
Par défaut Docmd.gotorecord sur évènement AfterInsert

Bonjour,

Je m'en remet à vous car je ne comprend pas pourquoi mon code ne fonctionne pas.

J'ai un formulaire basé sur requête contenant 2 tables jointes (jointure externe FROM T_employes LEFT JOIN T_capacitesDefaut ). Lorsque je rajoute un nouvel enregistrement sur ce formulaire (cela insère un nouvel employé), j'exécute le code suivant :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub Form_AfterInsert()
 
    With Me.Parent
        CurrentDb.Execute "INSERT INTO T_capacitesDefaut ( def_employe, def_mois, def_annee, def_nbreJours)" & _
                          "SELECT " & Me.IDemploye & ", " & _
                                  .md_periodeMois & " AS Expr1, " & _
                                  .md_periodeAnnee & " AS Expr2, " & _
                                  nbreJoursOuvresMois(.md_periodeMois, .md_periodeAnnee) & " AS Expr3 " & _
                          "FROM T_employes;"
    End With
 
    Me.Requery
    DoCmd.GoToRecord , , acFirst
 
End Sub
Et la ligne DoCmd.GoToRecord , , acFirst ne fonctionne pas. Le formulaire reste sur le dernier enregistrement....Le Me.Requery me permet d'afficher les valeurs insérées dans les textBox car sinon elles ne s'affichent pas....Sauf que ce requery me place le formulaire sur le dernier enregistrement et je voudrais que mon formulaire reste sur le nouvel enregistrement afin que l'utilisateur remplisse les champs d'un sous-formulaire...

Si quelqu'un sait d'où vient cette bizarrerie, je lui en serais reconnaissant.

Cordialement.
__________________
L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 14h38   #2
Membre éclairé
 
Homme Michel
Développeur informatique
Inscription : février 2008
Messages : 263
Détails du profil
Informations personnelles :
Nom : Homme Michel
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : février 2008
Messages : 263
Points : 309
Points : 309
J'avoue ne pas pouvoir répondre directement à ta question "quelqu'un sait-il d'où vient cette birarrerie ?" mais ...

J'ai eu un problème à peu près identique à celui que tu rencontres (après un ajout d'enregistrement). J'ai moi aussi quelque peu galéré avant de trouver une procédure de contournement. Celle-ci est très loin d'être parfaite, et je suis conscient qu'il y a sans doute beaucoup plus simple, mais elle a eu l'avantage de me sortir d'affaire.

Voici ce que j'ai fait :

1/ J'ai créé une variable publique à mon formulaire qui enregistre le n° d'enregistrement affiché (avant insertion) par un Me.CurrentRecord (xNumEnr = Me.CurrentRecord)
2/ Je fais ensuite mon insert et après ce dernier je me positionne sur le dernier enregistrement connu (Me.SelTop = xNumenr)
3/ Je passe ensuite la commande "DoCmd.GoToRecord , , acFirst"

Je ne sais pas si c'est applicable à ton problème mais pour le mien, ça a marché... une piste peut-être
Michel
Orion34080 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 14h49   #3
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
Merci pour ta réponse Orion mais ce n'est pas applicable dans mon cas. La requête sur laquelle se base mon formulaire (qui est en fait un sous-formulaire pour ceux qui n'auraient pas remarqué le Me.Parent ^^) est triée par ordre alphabétique. Donc quand j'ajoute un nouvel enregistrement, Me.CurrentRecord me renverrait 344 par exemple. Puis si je fais Me.requery, mon nouvel enregistrement ne serait plus 344 mais 143 par exemple...J'ai essayé tout un tas de solutions comme ci-dessous mais le formulaire reste toujours sur le dernier enregistrement

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Private Sub Form_AfterInsert()
 
    Dim employee As Long
    Dim test As Variant
 
    With Me.Parent
        CurrentDb.Execute "INSERT INTO T_capacitesDefaut ( def_employe, def_mois, def_annee, def_nbreJours)" & _
                          "SELECT " & Me.IDemploye & ", " & _
                                  .md_periodeMois & " AS Expr1, " & _
                                  .md_periodeAnnee & " AS Expr2, " & _
                                  nbreJoursOuvresMois(.md_periodeMois, .md_periodeAnnee) & " AS Expr3 " & _
                          "FROM T_employes;"
    End With
 
    employee = Me.IDemploye
    Me.Requery
 
    Me.RecordsetClone.MoveFirst
    While Not Me.RecordsetClone.EOF
        If Me.RecordsetClone("IDemploye") = employee Then test = Me.RecordsetClone.Bookmark
        Me.RecordsetClone.MoveNext
    Wend
    Me.Bookmark = test
 
End Sub
__________________
L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 14h53   #4
Membre éclairé
 
Homme Michel
Développeur informatique
Inscription : février 2008
Messages : 263
Détails du profil
Informations personnelles :
Nom : Homme Michel
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : février 2008
Messages : 263
Points : 309
Points : 309
Dans ce cas peut-être peux-tu simplement refaire ton "RecordSource" initial à la place de ton "DoCmd.GoToRecord , , acFirst"
Orion34080 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 15h03   #5
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
Grrrr Même si, Après ma requête d'insertion, je fais :
Code :
1
2
3
    Me.RecordSource = ""
    Me.Requery
    DoCmd.GoToRecord , , acFirst
Le formulaire reste sur la position 344 (bien que les champs aient tous une erreur) !
__________________
L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 15h08   #6
Membre éclairé
 
Homme Michel
Développeur informatique
Inscription : février 2008
Messages : 263
Détails du profil
Informations personnelles :
Nom : Homme Michel
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : février 2008
Messages : 263
Points : 309
Points : 309
Faut pas vider le Recordsource (d'où les erreurs). Ce que je voulais dire c'était :

Me.recordsource = "Select....." (ton select initial utilisé quand tu rentres sur ton formulaire pour le charger) et ce, à la place de ton docmd.gotoRecord... suivi éventuellement d'un Me.requery.

Ce qui provoquerait me semble-t-il un réaffichage complet dans ton formulaire, prenant en compte ton "ORDER BY"

Michel
Orion34080 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 16h46   #7
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
J'ai bien compris ce que tu voulais dire Mon test ci-dessus, c'était pour montrer que même si le formulaire n'était plus lié à aucune source de données, il restait qd même sur l'enregistrement n°344 (qui était celui du nouvel enregistrement)....

Pour être sûr malgré tout, j'ai qd même essayé ce que tu disais mais bien évidemment, ça fait la même chose...
__________________
L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!
paidge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 17h38   #8
Membre éclairé
 
Homme Pierre-Jean
Développeur informatique
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : Homme Pierre-Jean
Âge : 31
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : février 2010
Messages : 306
Points : 330
Points : 330
Envoyer un message via MSN à paidge
J'ai trouvé une solution !!! Après 4h de combat acharné avec VBE, Google, la FAQ, le forum, etc.

J'ai placé cette procédure sur l'évènement afterUpdate des champs txt_nom et txt_prenom :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Sub saveEmploye()
 
    Dim employee As Long
 
    If Len(Me.txt_nom) > 0 And Len(Me.txt_prenom) > 0 Then
        employee = Me.IDemploye
        DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
        Me.Requery
        Me.RecordsetClone.FindFirst "IDemploye=" & employee
        Me.Bookmark = Me.RecordsetClone.Bookmark
    End If
 
End Sub
Y'a des jours comme ça où développer ça énerve ! lol Mais on est tellement content d'avoir trouvé

Que de temps perdu pour ce genre de

Merci quand même
__________________
L'informatique fait gagner beaucoup de temps. A condition d'en avoir beaucoup devant soi !!!
paidge 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 14h11.


 
 
 
 
Partenaires

Hébergement Web