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

Access Discussion :

Requête cumul en VBA


Sujet :

Access

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Requête cumul en VBA
    Voici mon problème; je possède une table tb_VolumeMag134 avec les chps suivants :
    NOMTR - Texte
    DATEM - Date/heure
    VARHUILE - Numérique
    VAR187 - Texte
    CUMUL - Numérique
    Je desire faire le cumul de VARHUILE ligne par ligne , j'y arrive avec une requete (Requête trouver sur ce site déjà )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE tb_VolumeMag134 SET tb_VolumeMag134.CUMUL = CDbl(DSum("[VARHUILE]","tb_VolumeMag134","[DATEM]<=" & DateUS([DATEM])));
    Afin de rendre cette requête plus rapide je voudrais créer ma table tb_VolumeMag134 et mettre à jour mon champ CUMUL via du code VBA. J'ai tenter ceci mais cela ne fonctionne pas
    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
    Private Sub Commande0_Click()
    Dim Db As DAO.Database
    Dim SQL As String
    Dim sSQL As String
    
    '
    SQL = "SELECT tb_histotfo.NOMTR, tb_histotfo.DATEM, tb_histotfo.VARHUILE, tb_histotfo.VAR187 INTO tb_VolumeMag134"
    SQL = SQL & " FROM tb_tfo INNER JOIN tb_histotfo ON tb_tfo.NOMTR = tb_histotfo.NOMTR"
    SQL = SQL & " WHERE (((tb_histotfo.VAR187)='M134'))"
    CurrentDb().Execute SQL
    
    sSQL = "UPDATE tb_VolumeMag134 SET tb_VolumeMag134.CUMUL = CDbl(DSum("[VARHUILE]","tb_VolumeMag134","[DATEM]<=" & DateUS([DATEM])))"
    MsgBox (sSQL)
    CurrentDb().Execute sSQL
    
    End Sub
    La ligne sSQL sort en rouge.Quelqu'un peut il m'aider ??

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2006
    Messages : 6
    Points : 6
    Points
    6
    Par défaut les guillemets
    Je crois que c'est une question de guillemets,

    ton code :
    sSQL = "UPDATE tb_VolumeMag134 SET tb_VolumeMag134.CUMUL = CDbl(DSum("[VARHUILE]","tb_VolumeMag134","[DATEM]<=" & DateUS([DATEM])))"

    si DateUs est une fonction je crois que ce serait mieux (mais je ne peux le tester où je suis en ce moment) :
    sSQL = "UPDATE tb_VolumeMag134 SET tb_VolumeMag134.CUMUL = CDbl(DSum("[VARHUILE]","tb_VolumeMag134","[DATEM]<=" & DateUS([DATEM]) & "))"

    villemtl

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merçi pour ta réponse . DateUS est effectivement une fonction placée dans un module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Function DateUS(ByVal dt As Variant)
    If IsNull(dt) Then Exit Function
    DateUS = "#" & Month(dt) & "/" & Day(dt) & "/" & Year(dt) & "#"
    End Function
    J'ai essayer avec ta ligne de code mais mon problème est identique. J'ai une erreur de syntaxe...

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 10
    Points : 10
    Points
    10
    Par défaut Peut etre soluce
    Salut,

    La chaine de caractere est determinée par des ". Si ta chaine contient des ", pour qu'ils puissent etre prise en compte, il faut que tu ajoutes des " devant deux fois.

    Cad
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sSQL = "UPDATE tb_VolumeMag134 SET tb_VolumeMag134.CUMUL = CDbl(DSum(""[VARHUILE]"",""tb_VolumeMag134"",""[DATEM]<=" & DateUS([DATEM]) & "))"
    Voila.

    Dis moi si c'est OK

  5. #5
    Membre expérimenté
    Avatar de Mahefasoa
    Homme Profil pro
    Manager IT
    Inscrit en
    Octobre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Manager IT

    Informations forums :
    Inscription : Octobre 2003
    Messages : 835
    Points : 1 664
    Points
    1 664
    Par défaut Un Dot je crois ...
    Salut Pascal,

    Si j'ai bien compris ton objectif c'est de pouvoir mettre à jour le champ CUMUL dans tb_VolumeMag134.
    Citation Envoyé par Pascal__
    SQL = "SELECT tb_histotfo.NOMTR, tb_histotfo.DATEM, tb_histotfo.VARHUILE, tb_histotfo.VAR187 INTO tb_VolumeMag134"
    SQL = SQL & " FROM tb_tfo INNER JOIN tb_histotfo ON tb_tfo.NOMTR = tb_histotfo.NOMTR"
    SQL = SQL & " WHERE (((tb_histotfo.VAR187)='M134'))"
    CurrentDb().Execute SQL
    Quel est l'intérêt de ces lignes de code? Ou est-ce pour vérification tout simplement?
    Citation Envoyé par Pascal__
    ...DateUS([DATEM])...
    et
    Citation Envoyé par Pascal__
    Function DateUS(ByVal dt As Variant)
    If IsNull(dt) Then Exit Function
    DateUS = "#" & Month(dt) & "/" & Day(dt) & "/" & Year(dt) & "#"
    End Function
    La fonction DateUS permet, d'après ce que je vois, à "formater" la date au format américain. Tu sais, tu n'as pas besoin de réécrire une fonction qui existe déja dans Access et qui se nomme Format. Tu peux l'utiliser comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Format([DATEM],"mm/dd/yyyy")
    Ensuite,
    Citation Envoyé par Pascal__
    ...CDbl(DSum("[VARHUILE]","tb_VolumeMag134","[DATEM]<=" & DateUS([DATEM])))"
    Ici je te conseille de placer cette ligne dans une variable afin de mieux contrôler ce qu'elle renvoie comme valeur. Saches que si DSum ne trouve rien à additionner, alors elle renvoie null et peut-être une erreur surgira. Donc je te conseille d'utiliser la fonction nz qui convertit null en d'autres valeurs comme zéro par exemple.
    Donc ton code d'après mois sera transformé de cette manière:
    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
    Private Sub Commande0_Click()
    Dim Db As DAO.Database
    Dim SQL As String
    Dim sSQL As String
    Dim dblCumul As Double
    
    '
    SQL = "SELECT tb_histotfo.NOMTR, tb_histotfo.DATEM, tb_histotfo.VARHUILE, tb_histotfo.VAR187 INTO tb_VolumeMag134"
    SQL = SQL & " FROM tb_tfo INNER JOIN tb_histotfo ON tb_tfo.NOMTR = tb_histotfo.NOMTR"
    SQL = SQL & " WHERE (((tb_histotfo.VAR187)='M134'))"
    CurrentDb().Execute SQL
    dblCumul = CDbl(nz(DSum("[VARHUILE]","tb_VolumeMag134","[DATEM]<=#" & Format([DATEM],"mm/dd/yyyy") & "#),0))"
    sSQL = "UPDATE tb_VolumeMag134 SET tb_VolumeMag134.CUMUL = " & dblCumul
    MsgBox (sSQL)
    CurrentDb().Execute sSQL
    
    End Sub
    Autre problème, tu as utilisé CDbl qui permet de convertir en type Double donc un truc AVEC décimale dans le style 1,85. Et c'est là le problème! Supposons que dblCumul est égale à 1,85 alors to sSQL est écrit comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE tb_VolumeMag134 SET tb_VolumeMag134.CUMUL = 1,85
    Est-ce que tu sais que la virgule est interprétée par SQL comme étant un séparateur? et du coup il comprend que 85 est une autre chose!
    L'astuce est de pouvoir transformer la virgule (,) en point (.). Dans ce cas je te suggère de créer une fonction de type String qui va faire la transformation de 1,85 en 1.85.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Private Function DotToPoint (Valeur As Double) As String
       DotToPoint = "0"
       Dim Partie As Integer, Reste As Double
       Partie = Int(Valeur)
       If Valeur - Partie <> 0 Then
          Reste = Valeur - Partie
          DotToPoint = Partie & "." & Mid(Reste,3)
       Else
          DotToPoint = Partie
       End If
    End Function
    Donc, ton code se transforme en ceci:
    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
    Private Sub Commande0_Click()
    Dim Db As DAO.Database
    Dim SQL As String
    Dim sSQL As String
    Dim dblCumul As Double
    
    '
    SQL = "SELECT tb_histotfo.NOMTR, tb_histotfo.DATEM, tb_histotfo.VARHUILE, tb_histotfo.VAR187 INTO tb_VolumeMag134"
    SQL = SQL & " FROM tb_tfo INNER JOIN tb_histotfo ON tb_tfo.NOMTR = tb_histotfo.NOMTR"
    SQL = SQL & " WHERE (((tb_histotfo.VAR187)='M134'))"
    CurrentDb().Execute SQL
    dblCumul = CDbl(DSum("[VARHUILE]","tb_VolumeMag134","[DATEM]<=#" & Format([DATEM],"mm/dd/yyyy") & "#"
    sSQL = "UPDATE tb_VolumeMag134 SET tb_VolumeMag134.CUMUL = " & DotToPoint(dblCumul)
    MsgBox (sSQL)
    CurrentDb().Execute sSQL
    
    End Sub
    Je pense que c'est tout. Bon courage.
    La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici nous avons réuni théorie et pratique: Rien ne fonctionne ... et personne ne sait pourquoi!
    Albert Einstein

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merçi pour toutes ces explications. J'essaye cela ce soir et je vous tiens informé............

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Salut les amis, je sais bien que je ne suis pas en phase avec tout ce que vous racontez et j'aimerai bien avoir une bonne explication sur cette question, est ce que cette méthode consiste à modifier les données dans la table "tb_VolumeMag134"? Est ce que ceci permis?

Discussions similaires

  1. Réponses: 5
    Dernier message: 05/04/2006, 15h54
  2. Requête action en VBA
    Par Virgile59 dans le forum Access
    Réponses: 4
    Dernier message: 07/11/2005, 17h28
  3. [requête] cumul d'horaires par semaine
    Par Toff !!!!! dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 02/11/2005, 11h42
  4. Requête et Module VBA
    Par Telemak dans le forum Access
    Réponses: 1
    Dernier message: 15/10/2005, 13h04
  5. Conversion d'une requête SQL en VBA
    Par Keraccess dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 26/10/2004, 17h33

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