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 :

Ne pouvoir créer qu'un seul enregistrement à la date du jour [AC-2003]


Sujet :

IHM

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 482
    Points : 142
    Points
    142
    Par défaut Ne pouvoir créer qu'un seul enregistrement à la date du jour
    Bonjour,

    J'ai un formulaire avec les champs suivants :
    - Date / valeur : =Date()
    - User / valeur : = Environ("UserName")
    - Commentaire

    J'aimerais que l'utilisateur en question ne puisse créer qu'un seul enregistrement à la date du jour.

    J'ai beau cherché, je ne sais pas comment m'y prendre.

    Merci d'avance,

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 370
    Points : 23 844
    Points
    23 844
    Par défaut
    Mets un index unique sur l'association DateDuJour et UserName() dans ta table qui conserve tes informations. Access n'autorisera qu'au maximum un seul energistrement pour cette combinaison.

    Dans ta table en mode design, tu cliques sur l'îcone avec l'éclair.

    Tu donnes un nom à ton index (ex : UniciteJourUser) puis tu choisis les champs qui vont composer ton index (ici DateDuJour et UserName. En dessous tu choisi le type d'index 'unique'.

    Attention si un des deux éléments est null alors tu peux avoir plusieurs enregistrement avec les mêmes valeurs dans tes champs. Dans ce cas l'unicité est perdue.

    Autre solution tu définis ta combinaison de champs comme étant la clef primaire de ta table. Pour une clef primaire aucun des deux champs ne doit être à null.

    Avec ces solutions, si tu essayes de créer un autre enregistrement avec les même information, cela génère une erreur que tu peux gérer par code.

    A+

  3. #3
    Débutant
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 482
    Points : 142
    Points
    142
    Par défaut
    J'ai déjà une clé primaire sur mon numauto ; dois-je la supprimer ?

    Dois-je procéder comme suit :

    Index Name ---> UniciteJourDatetoday > unique : Yes
    Field name ---> Datetoday
    User

    Si je procède comme tel, j'ai un message d'erreur lorsque je veux sauver la table :

    "The changes you requested to the table were not successful because they would create duplicate values in the index, primary key, or relationship. Change the data in the field or fields that contain duplicate date, remove the index, or redefine the index to permit duplicate entries and try again."

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 370
    Points : 23 844
    Points
    23 844
    Par défaut
    Tu peux garder ta clef primaire NumAuto, elle ne dérange pas.

    Je ne comprends pas ta seconde question.

    L'écran des indexs doit ressembler à quelque chose comme cela

    Nom______________ Champ
    UniciteDateUtilisateur DateDuJour
    __________________ Utilisateur

    Type d'index : Unique.

    Pour le nom tu peux mettre ce que tu veux, l'important ce sont les champs.

    A+

  5. #5
    Débutant
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 482
    Points : 142
    Points
    142
    Par défaut
    je fais ce que tu dis ; j'ai mis les print screens de ce que j'ai fait en annexe, si tu sais jeter un coup d'oeil stp
    Images attachées Images attachées   

  6. #6
    Débutant
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 482
    Points : 142
    Points
    142
    Par défaut
    Ca y est enfin ca marche, j'aimerais savoir comment générer l'erreur d'acces par le code

    J'ai trouvé merci pour toi aide

  7. #7
    Débutant
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 482
    Points : 142
    Points
    142
    Par défaut
    En ce qui concerne l'erreur, je l'ai générée par le code suivant :

    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_Error(DataErr As Integer, Response As Integer)
     
    Const ERR_DOUBLON = 3022
     
    Select Case DataErr
       Case ERR_DOUBLON
     
            MsgBox "A record already exists today ! Please use the existing record." & vbCrLf & vbCrLf & "This window will be closed !", vbExclamation, "CTX"
     
           DoCmd.CLOSE acForm, "frm_phonecalls"
     
           Response = acDataErrContinue
       End Select
     
    End Sub
    Par contre, lorsque je quitte le formulaire par un bouton de commande il m'efface bien l'enregistrement mais j'aimerais qu'il me mettre aussi un msgBox pour prévenir l'utilisateur que l'enregistrement qui fait doublon va être supprimé.

    Merci de m'aider svp

  8. #8
    Débutant
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 482
    Points : 142
    Points
    142
    Par défaut
    Bonjour,

    Pourrait-on m'aider sur le point suivant svp :

    Lorsque je quitte le formulaire par un bouton de commande il m'efface bien l'enregistrement mais j'aimerais qu'il me mettre aussi un msgBox pour prévenir l'utilisateur que l'enregistrement qui fait doublon va être supprimé.

    Merci

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 370
    Points : 23 844
    Points
    23 844
    Par défaut
    À vrai dire il n'efface pas l'enregistrement, il ne le crée pas du tout donc si tu détecte une erreur de doublon, informe immédiatement ton utilisateur qu'il ne sera pas enregistré.

    A+

  10. #10
    Débutant
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 482
    Points : 142
    Points
    142
    Par défaut
    Oui je te le concède.
    Mais comment lors de la fermutre émettre un message d'erreur comme celui du form_error afin que l'utilisateur sache que l'enregistrement qu'il a mis n'a pas été sauvé ?

  11. #11
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 370
    Points : 23 844
    Points
    23 844
    Par défaut
    Le plsu simple est de le faire sur le OnError. Un truc du genre 'Attention doublon ! Ne sera pas conservé'.

    Sinon, si tu travail un seul enr à la fois, tu peux noter dans une variable que tu as eu une erreur de doublon et sur l'événement OnClose réagir à cela. Quelque chose comme :

    Au niveau du formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim m_AErreurDoublon as boolean
    dans l'événement OnError :
    dans l'évenment OnClose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if m_AErreurDoublon then
       msgbox "Pas sauvegardé"
    end if
    Attention il faut aussi penser à gérer m_AErreurDoublon dans le cas où l'enregistrement est modifié et enregistré.

    A+

  12. #12
    Débutant
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 482
    Points : 142
    Points
    142
    Par défaut
    Bonjour marot_r

    Ou dois-je placer m_AErreurDoublon=true dans mon code déjà existant :

    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_Error(DataErr As Integer, Response As Integer)
     
    Const ERR_DOUBLON = 3022
     
    Select Case DataErr
       Case ERR_DOUBLON
     
            MsgBox "A record already exists today ! Please use the existing record." & vbCrLf & vbCrLf & "This window will be closed !", vbExclamation, "CTX"
     
           DoCmd.CLOSE acForm, "frm_phonecalls"
     
           Response = acDataErrContinue
       End Select
     
    End Sub

  13. #13
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 370
    Points : 23 844
    Points
    23 844
    Par défaut
    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
    16
    17
    18
    19
    Private Sub Form_Error(DataErr As Integer, Response As Integer)
     
    Const ERR_DOUBLON = 3022
     
    Select Case DataErr
       Case ERR_DOUBLON
        
            MsgBox "A record already exists today ! Please use the existing record." & vbCrLf & vbCrLf & "This window will be closed !", vbExclamation, "CTX"
            
           DoCmd.CLOSE acForm, "frm_phonecalls"
     
           Response = acDataErrContinue
           m_AErreurDoublon=true
    
       case else
           Response = acDataErrDisplay
    End Select
     
    end Sub
    Dans les gestion d'erreur je conseille toujours un cas 'générique' pour gérer les erreurs que tu n'as pas prévu de gérer explicitement car avec ton code précédent, il se pourrait bien que toute erreur non gérée soit simplement 'glisser sous le tapis' et tu ne saches jamais qu'elle a eu lieu.

  14. #14
    Débutant
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 482
    Points : 142
    Points
    142
    Par défaut
    Je n'ai pas la msgbox malgré le code que tu as proposé :

    Dans le formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim m_AErreurDoublon As Boolean
    Dans le On_Error :

    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
    16
    17
    18
    19
    Private Sub Form_Error(DataErr As Integer, Response As Integer)
     
    Const ERR_DOUBLON = 3022
     
    Select Case DataErr
       Case ERR_DOUBLON
     
            MsgBox "A record already exists today ! Please use the existing record." & vbCrLf & vbCrLf & "This window will be closed !", vbExclamation, "CTX"
     
           DoCmd.CLOSE acForm, "frm_phonecalls"
     
           Response = acDataErrContinue
           m_AErreurDoublon = True
     
       Case Else
           Response = acDataErrDisplay
    End Select
     
    End Sub
    Dans le close :

    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
    16
    17
    Private Sub Command57_Click()
    On Error GoTo Err_Command57_Click
     
    If m_AErreurDoublon Then
       MsgBox "Pas sauvegardé"
    End If
     
        DoCmd.CLOSE
     
    Exit_Command57_Click:
        Exit Sub
     
    Err_Command57_Click:
        MsgBox Err.Description
        Resume Exit_Command57_Click
     
    End Sub

  15. #15
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 370
    Points : 23 844
    Points
    23 844
    Par défaut
    Normalement cela devrait marcher.

    C'est quoi "frm_phonecalls", le formulaire qui génére l'erreur ?

    Sinon met un point d'arret sur la ligne m_AErreurDoublon = True pour t'assurer qu'elle est bien exécuté.

    Et aussi un sur Private Sub Command57_Click() pour faire afficher la valeur de m_AErreurDoublon à ce moment après une erreur.

    A+

  16. #16
    Débutant
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 482
    Points : 142
    Points
    142
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Normalement cela devrait marcher.

    C'est quoi "frm_phonecalls", le formulaire qui génére l'erreur ?

    Sinon met un point d'arret sur la ligne m_AErreurDoublon = True pour t'assurer qu'elle est bien exécuté.

    Et aussi un sur Private Sub Command57_Click() pour faire afficher la valeur de m_AErreurDoublon à ce moment après une erreur.

    A+
    En fait je remarque que ca marche mais le problème est que si je quitte mon champ en allant directement clicker sur mon bouton close, il me ferme le forumaire sans msgbox.
    Il faut que je me mette sur un autre enregistrement pour avoir la msgbox que j'ai déjà par ailleurs avec Form_Error
    Avant que je click sur mon bouton close, il faudrait enregister le nouveau record mais je n'y arrive pas.
    J'ai essayé de placer le code suivant sur quasi tous les évènements mais rien à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If NewRecord And Not Dirty Then
        Recordset.AddNew
        Recordset.Update
    End If

  17. #17
    Débutant
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    482
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2004
    Messages : 482
    Points : 142
    Points
    142
    Par défaut
    Avez-vous une idée pour mon problème svp ?

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

Discussions similaires

  1. Créer un fichier d'enregistrements
    Par Oregor dans le forum Langage
    Réponses: 19
    Dernier message: 02/06/2012, 21h02
  2. Réponses: 6
    Dernier message: 28/11/2010, 19h09
  3. Sous-formulaire avec 1 seul enregistrement
    Par Farbin dans le forum Access
    Réponses: 6
    Dernier message: 08/08/2006, 17h37
  4. Voir un seul enregistrement
    Par PrinceMaster77 dans le forum SQL
    Réponses: 1
    Dernier message: 15/11/2004, 17h51
  5. ROLLBACK sur une seul enregistrement
    Par toctoc80 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 30/04/2004, 21h22

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