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 :

Souci d'index ?


Sujet :

IHM

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 19
    Points : 9
    Points
    9
    Par défaut Souci d'index ?
    Salut

    J'ai un sous-formulaire "subform_comment" dans lequel j'ai un champ "Comment" et un champ "Date_day"

    Mon sous-formulaire a comme source la requête rqt_comment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT tbl_comment.N°, tbl_comment.ID_pro, tbl_comment.Date_day, tbl_comment.Comment
    FROM tbl_promoters RIGHT JOIN tbl_comment ON tbl_promoters.ID_pro = tbl_comment.ID_pro;
    La table tbl_comment contient les champs suivants :
    N° : Clé primaire - NuméroAuto - indexé sans doublons
    ID_pro : Numérique - indexé avec doublons
    Comment : Texte long : non indexé
    Date_day : Date/heure : non indexé

    La table tbl_promoters contient entre autres le champ suivant :
    ID_pro : Clé primaire - NuméroAuto - indexé sans doublons

    Une relation a été créée entre ces 2 tables avec comme champ père/fils "ID_pro".

    J'ai un code qui permet de ne pas créer plus d'un commentaire le même jour. Le champ date indiquant automatiquement la date du jour.

    Le problème est que je reçois le message d'erreur suivant lorsque je créé un nouveau commentaire dans un enregistrement du formulaire principal. frm_promoters

    Nom : Capture d'écran 2024-01-03 020852.png
Affichages : 81
Taille : 12,4 Ko

    Voici le code de mon sous-formulaire :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Private Sub Form_BeforeInsert(Cancel As Integer)
        Me.Date_day = Date
     
    Dim rs As DAO.Recordset
     
    Set rs = CurrentDb.OpenRecordset("SELECT N° FROM rqt_comment WHERE N°=" & Me!N°, dbOpenSnapshot)
     
       If rs.EOF Then
       Me!N° = 1
       Else
       rs.MoveLast
       Me!N° = rs!N° + 1
       End If
     
    rs.close
    Set rs = Nothing
    End Sub
     
    Private Sub Form_BeforeUpdate(Cancel As Integer)
        Dim strSQL As String
        Dim rst As DAO.Recordset
        Dim currentDate As Date
        Dim currentID_pro As Long
     
        currentDate = Date
     
        currentID_pro = Me.Parent.ID_pro
     
        strSQL = "SELECT * FROM rqt_comment WHERE ID_pro = " & currentID_pro & " AND date_day = #" & Format(currentDate, "yyyy-mm-dd") & "#"
     
        Set rst = CurrentDb.OpenRecordset(strSQL)
     
        If Not rst.EOF Then
     
            MsgBox "You can't post more than one comment per day !", vbExclamation, "Database Prospect"
            Cancel = True
     
            Me.Undo
        End If
     
        rst.close
        Set rst = Nothing
    End Sub
     
    Private Sub Form_Current()
        Me.txtTotalComments.Value = CountComments(Me.ID_pro) & " comment(s)"
    End Sub
     
    Private Function CountComments(ID_pro As Variant) As String
        Dim count As Long
        count = DCount("*", "rqt_comment", "ID_pro = " & Nz(ID_pro, 0))
        CountComments = CStr(count)
    End Function

    Je ne comprends pas quel peut être le problème.

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 112
    Points : 5 237
    Points
    5 237
    Par défaut
    Bonsoir,

    1. la source de la sous-fenêtre appelle la table tbl_promoters pour rien (aucun champ de cette table n'est dans le select)

    2. faudrait vérifier que la relation entre les 2 tables est bien paramétrée (1-infini dans le bon sens...)

    3. on parle de père/fils entre form et sous-form et non entre tables ou on parle plutot de clé primaire/secondaire

  3. #3
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 840
    Points : 14 944
    Points
    14 944
    Par défaut
    bonsoir,
    ce n'est pas clair:
    Le problème est que je reçois le message d'erreur suivant lorsque je créé un nouveau commentaire dans un enregistrement du formulaire principal. frm_promoters
    1) l'insertion d'un nouveau commentaire ne devrait-il pas se faire plutôt directement dans le sous-formulaire ?
    2) c'est bizarre ce Right join dans la requête rqt_comment et de toute façon, quel est l'intérêt d'avoir la table tbl_promoters d'autant plus si une relation champs pères/champs fils existe
    3) à la place du code pour ne permettre qu'un commentaire par jour, il suffit de créer un index unique non primaire composé de ID_pro/date_day dans la table tbl_comment:

    Nom : _1.JPG
Affichages : 60
Taille : 69,8 Ko

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Merci à vous 2

    Je réponds à vos questions/remarques
    1) L'insertion d'un nouveau commentaire se fait bien dans le sous-formulaire frm_comment et non pas dans le formulaire principal frm_promoters
    2) J'ai créé une relation entre les 2 tables :
    Nom : Capture d'écran 2024-01-03 223444.png
Affichages : 57
Taille : 10,2 Ko
    3) J'ai adapté la requête rqt_comment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT tbl_comment.N°, tbl_comment.ID_pro, tbl_comment.Date_day, tbl_comment.Comment
    FROM tbl_comment;
    4) J'ai préféré codé pour éviter les doublons du champ Comment à la même date pour avoir une msgbox personnalisée

    En modifiant les points 2 et 3, le problème persiste. Je pense que cela se situe au niveau des index des champs ou au niveau du code mais je ne vois vraiment pas ce qui cloche.

  5. #5
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 840
    Points : 14 944
    Points
    14 944
    Par défaut
    normalement ce code tiré de Form_Before_Insert du sous-formulaire ne devrait pas passer et doit provoquer une erreur car il écrit dans le numéro auto de la table tbl_comment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       If rs.EOF Then
       Me!N° = 1
       Else
       rs.MoveLast
       Me!N° = rs!N° + 1
       End If
    un numéro auto s'incrémente tout seul, comme son nom l'indique

  6. #6
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 840
    Points : 14 944
    Points
    14 944
    Par défaut
    d'autre part, voici comment modifier le message d'erreur 3022 en ayant un index unique sur id_pro et date_day (avec valeur par défaut: =Date() dans la table, ce qui évite encore un peu de code) comme je l'ai suggéré:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Form_Error(DataErr As Integer, Response As Integer)
     
    If DataErr = 3022 Then   ' erreur doublon dans un index
     MsgBox "You can't post more than one comment per day !", vbExclamation, "Database Prospect"
    End If
    ' permet de continuer sans afficher le message Access:
    Response = acDataErrContinue
     
    End Sub

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    normalement ce code tiré de Form_Before_Insert du sous-formulaire ne devrait pas passer et doit provoquer une erreur car il écrit dans le numéro auto de la table tbl_comment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       If rs.EOF Then
       Me!N° = 1
       Else
       rs.MoveLast
       Me!N° = rs!N° + 1
       End If
    un numéro auto s'incrémente tout seul, comme son nom l'indique
    Je supprime ce code et je n'ai plus le message.
    Si je laisse juste le code suivant, le message d'erreur apparaît :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form_BeforeInsert(Cancel As Integer)
        Me.Date_day = Date
    End Sub

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2024
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2024
    Messages : 19
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    d'autre part, voici comment modifier le message d'erreur 3022 en ayant un index unique sur id_pro et date_day (avec valeur par défaut: =Date() dans la table, ce qui évite encore un peu de code) comme je l'ai suggéré:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Form_Error(DataErr As Integer, Response As Integer)
     
    If DataErr = 3022 Then   ' erreur doublon dans un index
     MsgBox "You can't post more than one comment per day !", vbExclamation, "Database Prospect"
    End If
    ' permet de continuer sans afficher le message Access:
    Response = acDataErrContinue
     
    End Sub
    Problème solutionné !
    Merci beaucoup GRANDBOIS

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/11/2014, 16h24
  2. Souci d'index et de doublons
    Par catsyl dans le forum Access
    Réponses: 1
    Dernier message: 21/03/2013, 21h50
  3. Soucis d'index dans listview.
    Par azerty53 dans le forum VB.NET
    Réponses: 1
    Dernier message: 24/05/2007, 10h35
  4. Soucis d'index indéfini
    Par djey08 dans le forum Langage
    Réponses: 3
    Dernier message: 24/05/2007, 10h05

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