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.

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 127
    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 confirmé
    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
    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 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 127
    Par défaut
    A quelle ligne ???

  5. #5
    Expert confirmé
    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
    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 confirmé
    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
    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

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

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