IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IHM Discussion :

Comment revenir à l'enregistrement courant après annulation de la création d'un autre enregistrement [AC-2007]


Sujet :

IHM

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 66
    Points : 52
    Points
    52
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Points : 207
    Points
    207
    Par défaut
    Bonsoir,

    2 constats (questions ...) :
    Tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    Forms(psFormCourant).Bookmark = oRS.Bookmark
    @+

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 66
    Points : 52
    Points
    52
    Par défaut
    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

  4. #4
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Points : 207
    Points
    207
    Par défaut
    Bonsoir,

    Je pensais plutôt à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vsCritere = "EAL_NUM =" & pl_EnregCourant
    Mais bon ..., essaie plutôt :

    Dans le code du bouton "ajout" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    pl_EnregCourant = Forms(psFormCourant).Recordset.Bookmark
    DoCmd.GoToRecord , , acNewRec
    ...
    Dans le code du bouton "Annuler" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    Forms(psFormCourant).Undo
    Forms(psFormCourant).Recordset.Bookmark = pl_EnregCourant
    ...
    Le .Requery est inutile.

    @+

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 66
    Points : 52
    Points
    52
    Par défaut
    Bonjour Triton972

    Désolé mes tes propositions ne fonctionnement pas. Je m'explique :
    1 -
    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 -
    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

  6. #6
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 044
    Points
    16 044
    Par défaut
    Bonjour,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  7. #7
    Membre actif
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Octobre 2008
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 330
    Points : 207
    Points
    207
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    ? vartype ("xyz " & 12 & now & " abvc " & true)
    qui t'affichera 8= string).CQFD

    Bon courage à toi

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 66
    Points : 52
    Points
    52
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. zend_cache : comment enregistrer d'aprés une table
    Par ghamrired dans le forum Autres composants
    Réponses: 4
    Dernier message: 17/04/2009, 11h33
  2. Réponses: 2
    Dernier message: 05/03/2009, 10h57
  3. Réponses: 2
    Dernier message: 02/12/2006, 15h07
  4. Enregistrement courant après refresh [cas particulier]
    Par say dans le forum Bases de données
    Réponses: 8
    Dernier message: 02/08/2005, 15h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo