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 :

Fixer la propiété "édité" d'un formulaire [AC-2007]


Sujet :

IHM

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2008
    Messages : 191
    Points : 200
    Points
    200
    Par défaut Fixer la propiété "édité" d'un formulaire
    Bonjour,

    j'aimerai savoir s'il est possible de fixer l'état "édité" d'un formulaire. Par exemple, dépendemment d'une certaine condition, l'état du formulaire serait fixé à "non-édité" afin qu'aucun update ne soit fait sur les éléments de la table, et ce, même si des contrôles ont été modifiés dans le formulaire.

    Merci de m'éclairer!

  2. #2
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Le plus simple dans ce cas ne serait t'il pas plutôt d'interdire la modification ?

    Sinon, il te faut t'interesser à l'évenement Before_Update et la méthode me.Undo. Mais je pense que d'un point de vue utilisateur, un verrouillage est préférable.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2008
    Messages : 191
    Points : 200
    Points
    200
    Par défaut
    Bonjour,

    d'abord merci pour ta réponse! Le problème, c'est que dans mon formulaire, j'ai une zone de liste qui contient une liste de chemins d'accès (de pièces jointes) que j'enregistre via une requête SQL. Or, pour que tous les contrôles soient enregistrés en même temps, je dois exécuter la requête d'update seulement lorsque l'événement update du formulaire survient.

    J'ai tenté de placer la requête dans l'événement "before_update", mais cela crée un conflit lors de l'enregistrement. Je l'ai donc placé dans l'événement "after_update", mais, cette fois-ci, en utilisant un Me.Undo cet événement se produit et donc ce contrôle est enregistré malgré le fait que l'usager a voulu annuler les modifications.

    Enfin, j'ai tenté d'utiliser la propriété cancel de "before_update", mais un problème survient lorsque j'annule un événement de mise à jour tout juste avant de passer à l'enregistrement suivant.

    C'est donc pour ces raisons que je me suis tourné vers cette propriété... mais, peut-être existe-t-il un autre moyen que je ne vois pas?

    Merci d'avance

  4. #4
    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,

    Enfin, j'ai tenté d'utiliser la propriété cancel de "before_update", mais un problème survient lorsque j'annule un événement de mise à jour tout juste avant de passer à l'enregistrement suivant.
    Pourrais-tu poster ton code, stp ?

    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

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2008
    Messages : 191
    Points : 200
    Points
    200
    Par défaut
    Bonjour,

    voici mon code du bouton "enregistrement suivant" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub boutonEnregistrementSuivant_Click()
     
        If Me.CurrentRecord = DCount("numeroReference", "DESSINS_TC") Then  ' Si l'enregistrement courant est le dernier, alors...
            DoCmd.GoToRecord , , acFirst                                    ' ... atteindre le premier enregistrement.
     
        Else                                                                ' Sinon ...
            DoCmd.GoToRecord , , acNext                                     ' ... atteindre l'enregistrement suivant.
     
        End If
     
    End sub
    Et voici le code de l'événement "before_update" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Private Sub Form_BeforeUpdate(Cancel As Integer)
     
    Dim choix As Integer
     
    DoCmd.OpenForm "Formulaire fond opaque", , , , , , 70
    choix = MsgBox("Vous être sur le point d'enregistrer les modifications apportées à ce dessin. Désirez-vous enregistrer?", vbYesNo, "Enregistrement des modifications")
     
    If choix <> 6 Then
        Me.Undo
        Cancel = True
    End If
     
    DoCmd.Close acForm, "Formulaire fond opaque"
     
    End Sub
    Donc, lorsque l'usager désire changer d'enregistrement alors qu'il a apporté des modifications au formulaire, l'événement "update" du formulaire est levé. L'erreur survient à la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     DoCmd.GoToRecord , , acNext
    du code associé au bouton selon le déboggeur lorsque la propriété cancel est fixée à vrai dans "before_update". Plus particulièrement, l'erreur levée est :

    Erreur d'exécution '2105' :

    Impossible d'atteindre l'enregistrement spécifié.
    C'est pour cette raison que j'ai délaissé cette piste par la suite et que j'ai regardé plutôt du côté du Me.Undo ou autre...

    Merci beaucoup!

  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,

    A essayer (pas testé).

    Utiliser la propriété Dirty du formulaire (F1 pour plus de précision).

    Si le formulaire a subi des modifications, la propriété passe à True.

    L'idée serait donc de la repasser par code à False uniquement si la modification est validée par l'utilisateur. En cas d'annulation, la propriété vaudrait toujours True et tu pourrais faire un test :

    Private
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub boutonEnregistrementSuivant_Click()
     
        If Me.Dirty = True Then '<== Possibilité de faire un test
     
        If Me.CurrentRecord = DCount("numeroReference", "DESSINS_TC") Then  ' Si l'enregistrement courant est le dernier, alors...
            DoCmd.GoToRecord , , acFirst                                    ' ... atteindre le premier enregistrement.
     
        Else                                                                ' Sinon ...
            DoCmd.GoToRecord , , acNext                                     ' ... atteindre l'enregistrement suivant.
     
        End If
     
    End sub
    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

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2008
    Messages : 191
    Points : 200
    Points
    200
    Par défaut
    Bonjour,

    merci beaucoup pour ta réponse! Malheureusement, cela ne semble pas fonctionner. Lorsque je met la propriété à faux, before_update et after_update sont tout de même appelés et lorsque la propriété est placée à vrai, une erreur est levée... Je commence à croire que je n'aurai pas le choix de revoir ma gestion des updates pour ce formulaire en entier.

    Salutations

  8. #8
    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
    Re,

    Oups, une petite chose

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    If choix <> 6 Then
        Me.Undo
        Cancel = True
     
        Exit Sub '<== Pour sortir de la procédure
     
    End If
    lorsque la propriété est placée à vrai, une erreur est levée...
    Quelle erreur ? Et où ?

    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

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2008
    Messages : 191
    Points : 200
    Points
    200
    Par défaut
    Bonjour,

    j'ai essayé avec le "exit sub", mais sans succès. L'erreur, je l'obtiens à la ligne :

    du code du bouton (j'ai aussi essayé de déplacer cette ligne là dans l'événement "before_update", mais j'obtiens le même résultat). J'obtiens l'erreur suivante :

    Erreur d'exécution '7768' :

    Pour modifier des données dans ce formulaire, un champ dépendant modifiable doit être activé.
    Merci beaucoup,
    Salutations

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2008
    Messages : 191
    Points : 200
    Points
    200
    Par défaut
    Bonjour,

    après recherches et expérimentations, j'ai pu trouver une solution à mon problème. D'abord, j'ai contourné le problème d'enregistrement de la liste (à l'aide de la requête) grâce à un booléen global (bon, c'est pas ce qu'il y a de mieux, mais ça fonctionne bien). Le booléen est placé à vrai dans l'événement "before_update" si l'usager désire sauvegarder ses modifications ou bien passe à faux dans le cas contraire. Ma requête d'update est dans l'événement "after_update" et vérifie cette condition. Ainsi, plus de problème de chevauchement d'enregistrement.

    Ensuite, la piste donné par Domi2 était excellente (merci encore!). Car, lorsque la liste est modifiée, elle ne place pas le formulaire en mode "dirty" automatiquement (probablement parce que la liste n'est pas liée à ma table). Je dois donc faire manuellement un

    pour qu'Access demande à l'usager une confirmation d'enregistrement dans le cas de modifications. Quant à l'erreur que j'ai eu auparavant, eh bien il s'avère qu'il faut donner le focus à un contrôle lié modifiable avant d'appeler la ligne de code ci-haut sans quoi une erreur est générée. Voilà donc la stratégie que j'ai adopté.

    Encore une fin merci à vous deux pour votre aide!
    Salutations!

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

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