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

Requêtes et SQL. Discussion :

Détection d'occurrences consécutives d'une valeur selon un critère [AC-2003]


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Février 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Février 2014
    Messages : 75
    Points : 49
    Points
    49
    Par défaut Détection d'occurrences consécutives d'une valeur selon un critère
    Bonjour à tous,

    Voici mon problème:

    Je dispose d'une table "VolumesReels" avec des champs "Client", "Volume" et "Semaine" où je sais quel client a demandé tel volume lors de telle semaine.

    Mon objectif est d'être capable de dire quand un client est "perdu".
    Un client est perdu lorsque pendant 4 semaines consécutives, son volume est à 0.

    J'aimerais alimenter une table "tableCompteur" qui afficherait le client, la semaine de début et de fin où le compteur a été établi et enfin le compteur.

    Voici mon code (s'exécute depuis un formulaire en cliquant sur un bouton).
    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
    54
    55
    56
    57
     
    Private Sub Commande6_Click()
     
        Dim rst As DAO.Recordset
        Dim rst_2 As DAO.Recordset
         Dim i As Long
        Dim cpt As Long
        Dim strsql As String
     
        ' Ouvrir la table en lecture/écriture
        Set rst = CurrentDb.OpenRecordset("tableCompteur", dbOpenDynaset)
     
     
        With DoCmd
            .SetWarnings False   'Désactive les alertes
            .RunSQL ("delete * from [tableCompteur];")       ' effacement global de toutes les semaines
            .SetWarnings True
        End With
     
        For i = 5 To 52
     
     ' Créer un enregistrement dans la table
        rst.AddNew
     
        sql = "SELECT VolumesReels.Client, Count(VolumesReels.Volume) AS CompteDeVolume" & _
        " FROM VolumesReels " & _
        " WHERE((VolumesReels.Semaine) <= " & i & "And (VolumesReels.Semaine)>" & i & "-5) " & _
        " GROUP BY VolumesReels.Client, VolumesReels.Volume " & _
        " HAVING (((VolumesReels.Volume)=0));"
        Debug.Print sql
        Set rst_2 = CurrentDb.OpenRecordset(sql)
     
        'On remplit le champ client par la première valeur de la requete
         rst("Client") = rst_2.Fields(0)
         rst("semaineDebut") = i - 5
        rst("semaineFin") = i
        If rst_2.RecordCount <> 0 Then
            rst("compteurVolumeZero") = rst_2.Fields(1)    'renvoie le deuxième argument de la requête
            If rst("compteurVolumeZero") >= 4 Then
                MsgBox "client potentiellement perdu détecté!", vbInformation
            End If
        Else
            rst("compteurVolumeZero") = 0                 ' si aucun enregistrement alors 0 dans sommeValue
        End If
     
        ' Valider
        rst.Update
        rst_2.Close
        Next i
        rst_2.Close
        Set rst = Nothing
        Set rst_2 = Nothing
     
        MsgBox "Opération terminée !", vbInformation
     
     
    End Sub
    Mon code fonctionne partiellement puisqu'à l'exécution, la fenêtre "client potentiellement perdu détecté!" s'affiche autant de fois que le compteur atteint au moins 4 (l'intervalle de semaines se décale 1-6 puis 2-7 puis 3-8 etc).

    Voici ma table tableCompteur
    Nom : tableCompteur.png
Affichages : 154
Taille : 19,1 Ko

    Cependant à la fin un message d'erreur s'affiche :

    "Erreur d'exécution 3021 : aucun enregistrement en cours" qui me pointe à la ligne
    rst("Client") = rst_2.Fields(0)

    Si quelqu'un aurait une idée de méthode plus "propre" qui ne me ferait pas d'erreur je suis preneur!

    En vous remerciant d'avance de vos réponses,

    Ostrich95

  2. #2
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    ostrich95,

    La solution est sous tes yeux

    Il faut que l'affectation de tes valeurs soient dans la condition de contrôle de présence d'un enregistrement (à déplacer) : If rst_2.RecordCount <> 0 Then ...

    Ensuite l'injection de valeurs ne devrait probablement jamais se faire si ta requête renvoie rst_2 je suppose

    JimBoLion

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Février 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Février 2014
    Messages : 75
    Points : 49
    Points
    49
    Par défaut
    Bonjour JimboLion!

    En effet tu as entièrement raison, je n'ai pas été vigilant!

    Bon maintenant mon code tourne

    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
    54
    55
    56
    57
    Private Sub Commande6_Click()
     
        Dim rst As DAO.Recordset
        Dim rst_2 As DAO.Recordset
         Dim i As Long
        Dim cpt As Long
        Dim strsql As String
     
        ' Ouvrir la table en lecture/écriture
        Set rst = CurrentDb.OpenRecordset("tableCompteur", dbOpenDynaset)
     
     
        With DoCmd
            .SetWarnings False   'Désactive les alertes
            .RunSQL ("delete * from [tableCompteur];")       ' effacement global de toutes les semaines
            .SetWarnings True
        End With
     
        For i = 5 To 52
     
     ' Créer un enregistrement dans la table
        rst.AddNew
     
        sql = "SELECT VolumesReels.Client, Count(VolumesReels.Volume) AS CompteDeVolume" & _
        " FROM VolumesReels " & _
        " WHERE((VolumesReels.Semaine) <= " & i & "And (VolumesReels.Semaine)>" & i & "-5) " & _
        " GROUP BY VolumesReels.Client, VolumesReels.Volume " & _
        " HAVING (((VolumesReels.Volume)=0));"
        Debug.Print sql
        Set rst_2 = CurrentDb.OpenRecordset(sql)
     
        'On remplit le champ client par la première valeur de la requete
     
        If rst_2.RecordCount <> 0 Then
            rst("Client") = rst_2.Fields(0)
            rst("semaineDebut") = i - 5
            rst("semaineFin") = i
            rst("compteurVolumeZero") = rst_2.Fields(1)    'renvoie le deuxième argument de la requête
            If rst("compteurVolumeZero") >= 4 Then
                MsgBox "Client " & rst("Client") & " perdu en semaine " & rst("semaineDebut"), vbInformation
            End If
        Else
            rst("compteurVolumeZero") = 0                 ' si aucun enregistrement alors 0 dans sommeValue
        End If
     
        ' Valider
        rst.Update
        rst_2.Close
        Next i
        rst.Close
        Set rst = Nothing
        Set rst_2 = Nothing
     
        MsgBox "Opération terminée !", vbInformation
     
     
    End Sub
    J'ai encore un problème:

    J'aimerais savoir comment faire pour n'afficher qu'une seule fois la fenêtre de perte du client.
    Actuellement quand j'ai un client qui a un volume égal à 0 sur 10 semaines par exemple à partir de la semaine 7, il m'affiche la fenêtre pour les semaines 5-10, 6-11, 7-12 etc. J'aimerais que seule la fenêtre 5-10 soit affichée (comme ensuite le volume reste à 0).

    Sinon merci encore (dis moi si je dois ouvrir un autre sujet pour ma question comme ça je mets en résolu celui-là).

  4. #4
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    ostrich95,

    Dans ta table compteur tu peux eventuellement rajouter un flag (Client_potentiellement_perdu) dont la valeur par défaut est égal à 0.

    Dans ton traitement en lieu et place d'afficher le message tu passes dans ton champ une valeur à true (=-1).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     If rst_2.RecordCount <> 0 Then
            rst("Client") = rst_2.Fields(0)
            rst("semaineDebut") = i - 5
            rst("semaineFin") = i
            rst("compteurVolumeZero") = rst_2.Fields(1)    'renvoie le deuxième argument de la requête
            If rst("compteurVolumeZero") >= 4 Then
                ' suppresion de ce message MsgBox "Client " & rst("Client") & " perdu en semaine " & rst("semaineDebut"), vbInformation
                rst("client_potentiellement_perdu") = -1
            End If
        Else
            rst("compteurVolumeZero") = 0                 ' si aucun enregistrement alors 0 dans sommeValue         
        End If

    ensuite il ne te suffit plus qu'exploiter ta requête (écran, code ou etat) comme tu l'entends.

    JimBoLion

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Février 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Février 2014
    Messages : 75
    Points : 49
    Points
    49
    Par défaut
    Je suis d'accord pour le flag mais où je le déclare puis où je le mets?

    Et dans ce cas je n'affiche plus la fenêtre?

    Car j'aimerais bien prévenir l'utilisateur de la perte du client

  6. #6
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    ostrich95

    Je suis d'accord pour le flag mais où je le déclare puis où je le mets?
    Dans ta table tableCompteur tu crées ce flag client_potentiellement_perdu (Oui/non) valeur par défaut 0


    Car j'aimerais bien prévenir l'utilisateur de la perte du client
    Une fois fini ton traitement, tu disposes dans ta table tableCompteur de toutes les informations. Ensuite tu peux l'exploiter de plusieurs manières :

    1. ouvrir la requête (docmd.openquery...) en filtrant que les flags à true (-1)
    2. Creer un formulaire en filtrant que les flags à true (-1)
    3. Creer un état (avec ou sans filtres)

    JimBoLion

  7. #7
    Membre du Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Février 2014
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Février 2014
    Messages : 75
    Points : 49
    Points
    49
    Par défaut
    Ok j'ai compris! merci encore JimboLion je passe le sujet en résolu et te souhaite à très bientôt!

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

Discussions similaires

  1. codage vba pour rechercher une valeur selon 2 critères
    Par sims92.66 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 13/10/2011, 21h29
  2. Réponses: 4
    Dernier message: 22/02/2011, 03h51
  3. [AC-2003] afficher une valeur selon une condition
    Par Souri84 dans le forum IHM
    Réponses: 3
    Dernier message: 19/11/2009, 11h10
  4. [Vxi3] afficher une valeur selon la ligne du tableau
    Par aurelie83 dans le forum Deski
    Réponses: 10
    Dernier message: 23/10/2009, 20h56
  5. Spliter une valeur selon des mots spécifiques
    Par witch dans le forum Langage
    Réponses: 15
    Dernier message: 03/10/2008, 11h10

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