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 02/05/2011, 21h19   #1
Futur Membre du Club
 
Inscription : juillet 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 57
Points : 19
Points : 19
Par défaut Comment revenir à l'enregistrement courant après annulation de la création d'un autre enregistrement

Bonjour,

Le contexte :

1 - Je visualise dans un formulaire "détail" un enregistrement quelconque.

2 - Dans ce formulaire, j'ai un bouton 'Ajout' qui me permet de créer un nouvel enregistrement et un bouton 'Annuler'.

3 - Je lance la création d'un nouvel enregistrement en cliquant sur le bouton 'Ajout' (au passage j'ai mémorisé l'Id de l'enregistrement courant dans une variable 'pl_EnregCourant').

4 - Je commence ma saisie d'informations et finalement je l'interrompt (pour X raisons).
A ce stade, je souhaite revenir à l'enregistrement de départ càd celui que je visualisais avant de cliquer sur le bouton 'Ajout'
J'ai donc le code suivant dans mon bouton 'Annuler' -->

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
...
Forms(psFormCourant).Undo
Forms(psFormCourant).Requery
' Retour à l'enregistrement précédent
Set oRS = Forms(psFormCourant).RecordsetClone
vsCritere = "EAL_NUM =" & Str(pl_EnregCourant)
oRS.FindFirst vsCritere
If Not oRS.NoMatch Then Forms(psFormCourant).Bookmark = oRS.Bookmark
oRS.Close
Set oRS = Nothing
...
Mon problème :

Au final, je ne reviens pas sur l'enregistrement escompté mais toujours sur le premier du reccordset.

Pouvez-vous SVP m'aider car je tourne en rond ?
Que faut-il modifier pour que mon code fonctionne ?

Merci d'avance
Cordialement
oracle7556
oracle7556 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 05h36   #2
Membre habitué
 
Homme
Conseil - Consultant en systèmes d'information
Inscription : octobre 2008
Messages : 212
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : octobre 2008
Messages : 212
Points : 126
Points : 126
Bonsoir,

2 constats (questions ...) :
Tu écris :
Code :
vsCritere = "EAL_NUM =" & Str(pl_EnregCourant)
EAL_NUM c'est du "numérique" (ce que je pense par rapport au nom que tu lui donne) ou du "string" ? Si c'est du numérique ton critère ne marchera pas car tu transformes Pl_EnregCourant en string.
De plus, si le FindFirst ne trouve aucun enregistrement il passe directement à la ligne 10. où tu fermes l'objet OrS. La dernière instruction exécutée est alors la ligne 4 avec le Requery qui te positionnes sur le 1° enregistrement ...
Tu dois pouvoir supprimer le test de la ligne 9 (le N° d'enregistrement de l'enregistrement précédent existe forcément !) et avoir dans la ligne 9 uniquement :
Code :
Forms(psFormCourant).Bookmark = oRS.Bookmark
@+
Triton972 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2011, 18h28   #3
Futur Membre du Club
 
Inscription : juillet 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 57
Points : 19
Points : 19
Bonsoir Triton972

Merci de ta réponse.

1 - Désolé mais la méthode 'Recordset.Findfirst' attend comme paramètre une chaîne pour le critère de recherche (voir l'aide en ligne). C'est donc pourquoi je convertis la référence numérique de mon champ 'EAL_NUM' en chaine. Au final le critère de recherche vient par exemple la chaine : "EAL_NUM = 123".

2 - J'ai bien supprimé le test de la ligne 9 comme tu le proposes mais cela ne change rien. Je reviens toujours sur le premier enregistrement du recordset et non sur l'enregistrement désigné.

3 - J'ai vérifié avec des debug.print, la méthode 'Recordset.Findfirst' trouve bien mon enregistrement. debug.print oRS!EAL_NUM --> donne bien 123 après le findfirst (pl_EnregCourant = 123 pour mémoire).

4- Une précision, en fait mon code (décrit dans mon premier post) se trouve dans une Sub 'AnnulerEnreg' appelée par l'évènement SurClic du bouton 'Annuler'. Le fait d'extérioriser le traitement en dehors du formulaire, n'a-t-il pas une influence sur la recherche de l'enregistrement ? Question idiote O/N ?

Je continue à chercher ...
Cordialement
oracle7556
oracle7556 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 01h32   #4
Membre habitué
 
Homme
Conseil - Consultant en systèmes d'information
Inscription : octobre 2008
Messages : 212
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : octobre 2008
Messages : 212
Points : 126
Points : 126
Bonsoir,

Je pensais plutôt à :
Code :
1
2
 
vsCritere = "EAL_NUM =" & pl_EnregCourant
Mais bon ..., essaie plutôt :

Dans le code du bouton "ajout" :
Code :
1
2
3
4
5
 
...
pl_EnregCourant = Forms(psFormCourant).Recordset.Bookmark
DoCmd.GoToRecord , , acNewRec
...
Dans le code du bouton "Annuler" :
Code :
1
2
3
4
5
 
...
Forms(psFormCourant).Undo
Forms(psFormCourant).Recordset.Bookmark = pl_EnregCourant
...
Le .Requery est inutile.

@+
Triton972 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 08h06   #5
Futur Membre du Club
 
Inscription : juillet 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 57
Points : 19
Points : 19
Bonjour Triton972

Désolé mes tes propositions ne fonctionnement pas. Je m'explique :
1 -
Citation:
Je pensais plutôt à :
vsCritere = "EAL_NUM =" & pl_EnregCourant
La variable pl_EnregCourant est de type 'Entier Long' et on ne peut constituer une chaine en associant (concaténer avec l'opérateur '&') du texte 'EAL_NUM =" avec un entier long 'pl_EnregCourant'.

2 -
Citation:
pl_EnregCourant = Forms(psFormCourant).Recordset.Bookmark
DoCmd.GoToRecord , , acNewRec
...
Pour ton information, un bookmark (ou signet) est de type 'byte' et on ne peut affecter un type 'byte' à une variable de type 'Long' et inversement. Tes deux syntaxes proposées pour le code des boutons 'Ajout' et 'Annuler' gérèrent des erreurs d'exécution.

3 - Après le 'Undo' il n'y a plus d'enregistrement dit actif dans le recordset d'ou l'obligation de faire un 'Requery' pour le réactiver mais ce dernier active toujours le premier enregistrement du recordset. il faut donc se déplacer et sélectionner l'enregistrement que l'on veut rendre actif.

Au final, il y a à mon sens autre chose qui se passe et que je ne vois pas.

Merci quand même de ton aide.
Cordialement
oracle7556
oracle7556 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 08h40   #6
Rédacteur/Modérateur
 
Avatar de Domi2
 
Homme
Inscription : juin 2006
Messages : 6 218
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 52
Localisation : Suisse

Informations professionnelles :
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juin 2006
Messages : 6 218
Points : 9 910
Points : 9 910
Envoyer un message via Skype™ à Domi2
Bonjour,

En remplaçant "EnregistrementId" par le nom du champ qui contient tes Id.

Code :
1
2
3
4
5
6
7
With Me.RecordsetClone
 
    .FindFirst "EnregistrementId=" & str(Nz(pl_EnregCourant, 0))
 
    If .NoMatch = False Then Me.Bookmark = .Bookmark
 
End With
Domi2
__________________
Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

Ici, on ne perd pas de temps ! On en passe...


Access : créer des codes-barres 128 en VBA
Access : les commandes intégrées des menus

Ce message (ou un autre) vous a aidé ? Votez pour lui avec
Domi2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 13h31   #7
Membre habitué
 
Homme
Conseil - Consultant en systèmes d'information
Inscription : octobre 2008
Messages : 212
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : octobre 2008
Messages : 212
Points : 126
Points : 126
bonjour Oracle7556,

Désolé mais tout ce que je t'ai écrit a été testé et fonctionne ! mais...
Pour pl_enregsuivant : redéfini une nouvelle variable avec le bon type mais je pensais que tu avais compris la transcription ...

Pour ton info : l'opérateur concaténer & accepte, sans problème, la plupart des types de données sans nécessité de conversion. C'est un de ses principales atouts. Donc : & var_string & var_long & var_string & var_date & var_boolean est parfaitement légitime et le résultat est une variable string ! Fais un test dans ta fenêtre Exécution (CTRL G) de ta section Visual Basic pour en être convaincu ( avec un petit
Code :
? vartype ("xyz " & 12 & now & " abvc " & true)
qui t'affichera 8= string).CQFD

Bon courage à toi
Triton972 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 21h26   #8
Futur Membre du Club
 
Inscription : juillet 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 57
Points : 19
Points : 19
Bonsoir à tous

Ne cherchez plus, j'ai trouvé l'origine de mon problème.

Le code décrit dans mon premier post marche en fait nickel.

Le patacaisse (erreurs aléatoires mais souvent la même : n°2046) venait du fait que j'avais un 'me.undo' dans le 'Form_BeforeUpdate' de mon formulaire de détail ce qui faisait échoué le 'FindFirst'. Je l'ai supprimé suite à un message d'erreur bizarre à propos du 'undo'. J'ai donc recherché partout où j'utilisais 'undo' et je suis tombé dessus.

Voilà, dans tous les cas Merci à Triton972 et Domi2 pour leur aide sympathique.

Je considère donc le post comme résolu.
Cordialement
oracle7556
oracle7556 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 07h27.


 
 
 
 
Partenaires

Hébergement Web