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 :

Requete qui écrit dans une table dont un champ est un format personnalisé [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 Requete qui écrit dans une table dont un champ est un format personnalisé
    Bonjour,

    Je dois réaliser une détection de clients perdus (5 semaines de suite avec un volume = 0). Mon programme fonctionne avec un numéro de semaine simple.

    Cependant je dois modifier le format de la date pour coller à des exigences (le format est année-n°semaine -> masque de saisie 0000-00).

    Je suis capable de manipuler les semaines dans des requêtes grâce à left([champ],4) pour l'année et Right([champ],2) pour la semaine.

    Cependant au moment de remplir ma table de détection de clients perdus, je n'arrive pas à imposer le numéro de semaine!

    Voici mon code:

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    Private Sub Commande24_Click()
     
        'tableCompteur
        Dim rst As DAO.Recordset
     
        'requete
        Dim rst_2 As DAO.Recordset
     
        Dim i As Long
        Dim sql As String 'requete
        ' Ouvrir la table tableCompteur en lecture/écriture
        Set rst = CurrentDb.OpenRecordset("tableCompteur", dbOpenDynaset)
     
        'a chaque fois que l'on appuie sur le bouton, tous les enregistrements
        'de la tableCompteur sont supprimés
       With DoCmd
            .SetWarnings False   'Désactive les alertes
            .RunSQL ("delete * from [tableCompteur];")       ' effacement global de toutes les semaines
            .SetWarnings True
        End With
     
        'on boucle sur les semaines
        For i = 5 To 53
     
        'la requete va compter le nombres d'occurrences de 0 dans la table source
        'VolumesReels
        sql = "SELECT VolumesReels.Client, Count(VolumesReels.Volume) AS CompteDeVolume" & _
        " FROM VolumesReels " & _
        " WHERE Right([VolumesReels.anneesemaine],2) <= " & i & " And (Right([VolumesReels.anneesemaine],2)>" & i & "-5) " & _
        " GROUP BY VolumesReels.Client, VolumesReels.Volume " & _
        " HAVING (((VolumesReels.Volume)=0));"
        Debug.Print sql
        'on construit le jeu d'enregistrements correspondant a la requete
        Set rst_2 = CurrentDb.OpenRecordset(sql)
     
        'on verifie que la requete n'est pas vide
        If rst_2.RecordCount <> 0 Then
            'on se place au premier enregistrment de la requete
            rst_2.MoveFirst
     
            'on boucle tant quil y a des enregistrements dans la requete
             Do Until rst_2.EOF
                    ' Créer un enregistrement dans la tableCompteur
                    rst.AddNew
                    'on remplit la table tableCompteur
                    rst("Client") = rst_2.Fields(0)
                   rst(Right("dateDebut", 2)) = i - 4
                    'rst("dateFin") = i
                    rst("compteurVolumeZero") = rst_2.Fields(1)    'renvoie le deuxième argument de la requête
     
                    'détection de client perdu
                    'si le compteur est >= 5 on met le flag a oui
                    If rst("compteurVolumeZero") >= 5 Then
                           rst("client_potentiellement_perdu") = -1 'coche la case
                    End If
                    'on met a jour la table
                    rst.Update
                'on passe au deuxieme enregistrement de la requete
                rst_2.MoveNext
            Loop
     
        End If
     
        'on ferme le recordset de la requete
        rst_2.Close
        Next i 'on itere
        'on ferme le recordset de la table
        rst.Close
        'on libère les variables
        Set rst = Nothing
        Set rst_2 = Nothing
     
        'on affiche un message signalant la fin de l'exécution
        MsgBox "Opération terminée !", vbInformation
     
     
    End Sub
    La requête semble fonctionner mais je n'ai pas la moindre idée de la syntaxe nécessaire ici: rst(Right("dateDebut", 2)) = i - 4

    Si quelqu'un a une idée je l'en remercie grandement,

    Ostrich95

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 107
    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 107
    Points : 5 230
    Points
    5 230
    Par défaut
    Bonjour,

    La donnée est dans rst("dateDebut") ou rst!datedebut donc le test s'écrit right(rst!datedebut,2)=i-4 (l'un est alpha et l'autre numérique mais normalement la conversion est implicite)

    Par ailleurs ça ne marche pas au changement d'année donc il vaudrait mieux regarder directement dans le journal des ventes s'il y en a entre J et J-35 !

    Enfin la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    currentdb.execute "delete...", dbfailonerror
    est préférable avec docmd... car cela évite de désactiver setwarnings et on a une vraie gestion d'erreur

  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
    Bonsoir Nico84 et merci de ta réponse!

    Malheureusement j'obtiens une erreur d'exécution 424 : objet requis

    Ai-je fais une erreur?

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    Private Sub Commande24_Click()
     
        'tableCompteur
        Dim rst As DAO.Recordset
     
        'requete
        Dim rst_2 As DAO.Recordset
     
        Dim i As Long
        Dim sql As String 'requete
        ' Ouvrir la table tableCompteur en lecture/écriture
        Set rst = CurrentDb.OpenRecordset("tableCompteur", dbOpenDynaset)
     
        'a chaque fois que l'on appuie sur le bouton, tous les enregistrements
        'de la tableCompteur sont supprimés
     '  With DoCmd
     '       .SetWarnings False   'Désactive les alertes
     '       .RunSQL ("delete * from [tableCompteur];")       ' effacement global de toutes les semaines
     '       .SetWarnings True
     '   End With
            CurrentDb.Execute "delete * from [tableCompteur];", dbFailOnError
        'on boucle sur les semaines
        For i = 5 To 53
     
        'la requete va compter le nombres d'occurrences de 0 dans la table source
        'VolumesReels
        sql = "SELECT VolumesReels.Client, Count(VolumesReels.Volume) AS CompteDeVolume" & _
        " FROM VolumesReels " & _
        " WHERE Right([VolumesReels.anneesemaine],2) <= " & i & " And (Right([VolumesReels.anneesemaine],2)>" & i & "-5) " & _
        " GROUP BY VolumesReels.Client, VolumesReels.Volume " & _
        " HAVING (((VolumesReels.Volume)=0));"
        Debug.Print sql
        'on construit le jeu d'enregistrements correspondant a la requete
        Set rst_2 = CurrentDb.OpenRecordset(sql)
     
        'on verifie que la requete n'est pas vide
        If rst_2.RecordCount <> 0 Then
            'on se place au premier enregistrment de la requete
            rst_2.MoveFirst
     
            'on boucle tant quil y a des enregistrements dans la requete
             Do Until rst_2.EOF
                    ' Créer un enregistrement dans la tableCompteur
                    rst.AddNew
                    'on remplit la table tableCompteur
                    rst("Client") = rst_2.Fields(0)
                    Right(rst!dateDebut, 2) = i - 4
                    Right(rst!dateFin, 2) = i
                    'rst("dateFin") = i
                    rst("compteurVolumeZero") = rst_2.Fields(1)    'renvoie le deuxième argument de la requête
     
                    'détection de client perdu
                    'si le compteur est >= 5 on met le flag a oui
                    If rst("compteurVolumeZero") >= 5 Then
                           rst("client_potentiellement_perdu") = -1 'coche la case
                    End If
                    'on met a jour la table
                    rst.Update
                'on passe au deuxieme enregistrement de la requete
                rst_2.MoveNext
            Loop
     
        End If
     
        'on ferme le recordset de la requete
        rst_2.Close
        Next i 'on itere
        'on ferme le recordset de la table
        rst.Close
        'on libère les variables
        Set rst = Nothing
        Set rst_2 = Nothing
     
        'on affiche un message signalant la fin de l'exécution
        MsgBox "Opération terminée !", vbInformation
     
     
    End Sub

  4. #4
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 107
    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 107
    Points : 5 230
    Points
    5 230
    Par défaut
    A quelle ligne ???

  5. #5
    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, nico84

    Oui je pense comme Nico que l'erreur ne vient pas de là, par contre il faut éviter d'utiliser le Currendb successivement dans un appel de fonction. Tofalu m'a fait la remarque à ce sujet :

    http://warin.developpez.com/tutoriel...erieurs/#LII-C

    Concernant le dbFailOnError il n'est valable que si une gestion d'erreur a été mise en place.

    JimBoLion

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

    Donc je dois laisser comme avant?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     With DoCmd
           .SetWarnings False   'Désactive les alertes
           .RunSQL ("delete * from [tableCompteur];")       ' effacement global de toutes les semaines
           .SetWarnings True
       End With
    Et pour Nico84 j'obtiens cette erreur sur la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Right(rst!dateDebut, 2) = i - 4

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

    Non ce n'est pas ce que j'ai dit, la syntaxe de Nico est cohérente, c'est juste que la déclaration successive de Currentdb est à proscrire !


    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    Private Sub Commande24_Click()
        Dim cDb As DAO.Database
        Set cDb = CurrentDb
        '
        'tableCompteur
        Dim rst As DAO.Recordset
     
        'requete
        Dim rst_2 As DAO.Recordset
     
        Dim i As Long
        Dim sql As String 'requete
        On Error GoTo Err_Commande24
        '
        cDb.Execute "delete * from [tableCompteur];", dbFailOnError
        '
        ' Ouvrir la table tableCompteur en lecture/écriture
        Set rst = cDb.OpenRecordset("tableCompteur", dbOpenDynaset)
     
        'a chaque fois que l'on appuie sur le bouton, tous les enregistrements
        'de la tableCompteur sont supprimés
     '  With DoCmd
     '       .SetWarnings False   'Désactive les alertes
     '       .RunSQL ("delete * from [tableCompteur];")       ' effacement global de toutes les semaines
     '       .SetWarnings True
     '   End With
        'on boucle sur les semaines
        For i = 5 To 53
     
        'la requete va compter le nombres d'occurrences de 0 dans la table source
        'VolumesReels
        sql = "SELECT VolumesReels.Client, Count(VolumesReels.Volume) AS CompteDeVolume" & _
        " FROM VolumesReels " & _
        " WHERE Right([VolumesReels.anneesemaine],2) <= " & i & " And (Right([VolumesReels.anneesemaine],2)>" & i & "-5) " & _
        " GROUP BY VolumesReels.Client, VolumesReels.Volume " & _
        " HAVING (((VolumesReels.Volume)=0));"
        Debug.Print sql
        'on construit le jeu d'enregistrements correspondant a la requete
        Set rst_2 = cDb.OpenRecordset(sql)
     
        'on verifie que la requete n'est pas vide
        If rst_2.RecordCount <> 0 Then
            'on se place au premier enregistrment de la requete
            ' rst_2.MoveFirst (inutile car la requête automatiquement positionné sur enreg 1)
     
            'on boucle tant quil y a des enregistrements dans la requete
             Do Until rst_2.EOF
                    ' Créer un enregistrement dans la tableCompteur
                    rst.AddNew
                    'on remplit la table tableCompteur
                    rst("Client") = rst_2.Fields(0)
                    '
                    rst("dateDebut") = i - 4
                    rst("dateFin") = i
                    '
                    'rst("dateFin") = i
                    rst("compteurVolumeZero") = rst_2.Fields(1)    'renvoie le deuxième argument de la requête
     
                    'détection de client perdu
                    'si le compteur est >= 5 on met le flag a oui
                    If rst("compteurVolumeZero") >= 5 Then
                           rst("client_potentiellement_perdu") = -1 'coche la case
                    End If
                    'on met a jour la table
                    rst.Update
                'on passe au deuxieme enregistrement de la requete
                rst_2.MoveNext
            Loop
     
        End If
     
        'on ferme le recordset de la requete
        rst_2.Close
        Next i 'on itere
        'on ferme le recordset de la table
        '
        MsgBox "Opération terminée !", vbInformation
        '
    Exit_Commande24:
        rst.Close
        'on libère les variables
        Set rst = Nothing
        Set rst_2 = Nothing
        cDb.Close
        Set cDb = Nothing
     
        'on affiche un message signalant la fin de l'exécution
     
        Exit Sub
    Err_Commande24:
        MsgBox Err.Description & " " & Err.Number
        Resume Exit_Commande24
    End Sub
    En ce qui concerne tes deux lignes erronées :

    quel est le type de données décrit dans ta table tableCompteur concernant les deux champs dateDebut et dateFin car tu manipules une partie du champ sans qu'aucune valeur soir renseignée ?

    C'est un peu comme si tu remplaces les deux fleurs fanées d'un vase qui ne contient aucune fleur.

    De plus, le masque de saisie 0000-00 ne reflète pas le contenu du champ dans la table puisqu'il est en la transformation à l'affichage. Je pense donc que le champ à insérer est de type date ?

    JimBoLion

  8. #8
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 107
    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 107
    Points : 5 230
    Points
    5 230
    Par défaut
    Sans connaitre le contenu ni la structure de tablecompteur c'est colin-maillard

    Si datedebut est une date (ce qui semblerait logique...) le test est à faire entre J et J-35 comme dit plus haut

  9. #9
    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
    Jimbolion,

    J'ai compris ta remarque sur le Currentdb!

    Maintenant mes champs dateDebut et dateFin sont de types texte avec le masque de saisie (numérique) 0000-00.

    Normalement je devrais être quand même capable de traiter Left(..,4) et Right(..,2) comme s'ils étaient des nombres normaux, non?

    A moins que je doive les passer en type date mais comme c'est un masque personnalisé est ce que ça change quelque chose?

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

    Si c'est un type texte, c'est encore plus simple.

    Mais avant un peu d'explication, l'image du vase ne devait pas être bonne

    Lorsque tu fais un delete de ta table, tous les champs qui la compose sont définis par la valeur par défaut donné dans ta table ou une chaîne Null. En faisiant un addnew sur cette table afin d’insérer un enregistrement, la valeur inistiale de datedébut est égal à "" (plus précisément null).

    Tu essayes de remplacer les 4 premiers caractères à gauche (Left(..,4)) dans une châine qui ne contient rien. C'est un peu comme remplir 1 litre d'eau dans une bouteille de 20 cl.

    Donc ton format devient quelque chose comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rst("dateDebut") = format(Date,"yyyy") & "-" & format(i-4,"00")
    JimBoLion

  11. #11
    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
    Il n'y aurait pas moyen de reprendre les dates venant de ma table VolumesReels?

    Voici la table:
    Nom : tableVolumesReels.jpg
Affichages : 138
Taille : 92,4 Ko

    Par ailleurs j'ai un petit souci de décalage des dates: en faisant comme tu as écrit, j'obtiens une itération à partir de la semaine 11 au lieu de la semaine 1. C'est peut etre du au format?

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

    Bien sûr si l'info est disponible (ce qui ne semble pas être le cas dans ton la collection d'enregistrements renvoyée par rst_2)
    Donc rajouter la valeur dans la requête rst_2 et dans le group by

    Mais je suppose qu'une transformation est nécessaire car la valeur stockée dans la table tableCompteur doit tenir compte de la semaine

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    rst("dateDebut") = left(rst_2.Fields(n),5) &  "-" & format(i-4,"00")  ' x correspond à la colonne n de ta requête
    rst("dateFin") =left(rst_2.Fields(n),5) &  "-" & format(i,"00")
    Dans ce cas on peut prendre une partie de la chaîne puisque constituée d'une valeur

    JimBoLion

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

    J'ai ajouté mon champ de date dans le select et dans le group by et j'obtiens bien l'année d'origine dans tableCompteur.

    Néanmoins comme j'ai mis la date dans le group by je perds mon compteur!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sql = "SELECT VolumesReels.Client, Count(VolumesReels.Volume) AS CompteDeVolume, VolumesReels.anneesemaine" & _
        " FROM VolumesReels " & _
        " WHERE Right([VolumesReels.anneesemaine],2) <= " & i & " And (Right([VolumesReels.anneesemaine],2)>" & i & "-5) " & _
        " GROUP BY VolumesReels.Client, VolumesReels.Volume,VolumesReels.anneesemaine " & _
        " HAVING (((VolumesReels.Volume)=0));"
    Pour dateDebut et dateFin j'ai fait comme tu me l'as proposé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rst("dateDebut") = Left(rst_2.Fields(2), 5) & "-" & Format(i - 4, "00") 
    rst("dateFin") = Left(rst_2.Fields(2), 5) & "-" & Format(i, "00")
    Et voici ce que j'obtiens dans tableCompteur (au tiret(-) près si on change le 4 de left en 5):

    Nom : dateDebut et dateFin.jpg
Affichages : 125
Taille : 24,0 Ko

    En m'excusant encore du côté un peu "chaotique" de ce sujet,

    Ostrich95

  14. #14
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rst("dateDebut") = Left(rst_2.Fields(2), 4) & "-" & Format(i - 4, "00") 
    rst("dateFin") = Left(rst_2.Fields(2), 4) & "-" & Format(i, "00")
    Par ailleurs ça ne marche pas au changement d'année donc il vaudrait mieux regarder directement dans le journal des ventes s'il y en a entre J et J-35 !
    Nico, si tu fais cette remarque, elle est nécessairement fondée mais je ne comprends pas car Dans la boucle je vois que l'on commence entre semaine 5 et 53 (avec i-4) donc je ne vois pas à quel moment on peut avoir un problème sur le changement d'année ?
    En tout cas il y a nécessairement faille dans le processus (j'ai pas nécessairement étudié le code dans le détail), car entre année N-1 et année N il peut y avoir des clients qui n'entrent pas dans le traitement ! (pourquoi commencer semaine 5 ?)

    Le compteur est t-il nécessaire ? Si il dénature pas le regroupement, tu peux cas échéant, le passer dans ton Select et ton Group By

    jmb

  15. #15
    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
    Jimbolion,

    Je commence semaine 5 pour avoir 5 semaines consécutives avec un volume = 0.

    Je pourrai aussi commencer à 1 jusqu'à 49 et aller de i à i+4. Comment vois-tu les choses?

    Pour ce qui est de passer le compteur dans la requête, je ne peux pas car compteurVolumeZero est un champ du rst. Ai-je tort?

    Ostrich95

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

    Pour ce qui est de passer le compteur dans la requête, je ne peux pas car compteurVolumeZero est un champ du rst. Ai-je tort?
    Si tu n'en as pas besoin dans ton traitement, aucun intérêt !

    Je pourrai aussi commencer à 1 jusqu'à 49 et aller de i à i+4. Comment vois-tu les choses?
    Je ne sais pas ! Que se passe t-il pour les clients perdus (5 semaines de suite avec un volume = 0) sur les deux dernières semaines de décembre et trois premières semaines de Janvier ? C'est si il me semble la réflexion de Nico

    Dans ton traitement ils ne sont pas comptabilisés, je constate. Après c'est toi qui fixe les règles

    Nous sommes là pour t'aider, nous poser des questions, éventuellement donner notre point de vue mais pas pour prendre une décision à ta place

    JimBoLion

  17. #17
    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
    Jimbolion,

    Oui je suis d'accord avec toi sur le fait que c'est moi qui fixe mes règles!

    En effet je ne gère pas ton cas de figure (=0 sur deux années) mais je ne vois pas comment faire (boucler sur l'année par dessus?, gérer dans la requête?).

    Encore merci de vos réponses,

    Ostrich95

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

    Ta table VolumesReels enregistre t-elle les semaines des années précedentes ou uniquement les semaines de l'année en cours ?

    Si oui dans ce cas la condition where doit être modifiée (la boucle commençant à 1 : le i-1 renvoie donc 0 et doit retourner 53... donc condition à poser: du côté de iif probablement). De plus l'interprétation ne peut pas se faire sur la semaine de l'année en cours mais celle de l'année précédente (d'ou ma question en préambule).


    JimBoLion

  19. #19
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 107
    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 107
    Points : 5 230
    Points
    5 230
    Par défaut
    Au risque de me répéter, il y a sûrement une table des ventes qqpart et ça serait bien plus facile avec elle...

  20. #20
    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
    Nico84,

    Non je n'ai que ma table VolumesReels (en fait elle doit être alimentée par un classeur Excel mais je ne me soucie pas de cette question pour l'instant et je la remplis avec des valeurs factices).

    Jimbolion,

    Je peux mettre les dates que je veux dans ma table VolumesReels et donc les années précédentes.

    Donc je peux peut etre créer une autre variable pour les années (j par exemple) que j'appellerai dans ma requete?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [AC-2003] Ajout d'enregistrements dans une table dont un champ est le résultat d'une requête
    Par ostrich95 dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 08/03/2014, 09h09
  2. Réponses: 4
    Dernier message: 15/04/2008, 17h41
  3. Requete SQL sur une table dont le nom est dans une autre table
    Par orangepresse dans le forum Langage SQL
    Réponses: 3
    Dernier message: 29/09/2007, 13h32
  4. Accéder à une table dont le nom est dans une table
    Par claralavraie dans le forum Oracle
    Réponses: 7
    Dernier message: 26/12/2006, 15h51
  5. Réponses: 2
    Dernier message: 16/02/2006, 23h09

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