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 :

Récupérer la valeur des champs calculés dans une requète SQL dans vba


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 13
    Points : 11
    Points
    11
    Par défaut Récupérer la valeur des champs calculés dans une requète SQL dans vba
    Bonjour à tous,

    je cherche à récuperer un champ somme obtenue apres une opération de regroupement dans une requete SQL
    voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Dim db As DAO.Database, rs As DAO.Recordset
    Set db = CurrentDb
    Dim SQL As String
    SQL = "SELECT [MaTable].Piece, Sum([MaTable].NbOccurence) AS SommeNbOccurence
    FROM [Maintenance curative bus témoin]
    GROUP BY [MaTable].Piece;"
    Set rs = db.OpenRecordset(SQL)
    MsgBox rs("SommeNbOccurence")
    quand j'execute ce code vba me dit qu'il ne connait pas SommeNbOccurence comme élément de la collection rs

    comment faire pour récuperer les informations de ce champ ?

    Merci d'avance

    Frédéric

  2. #2
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour,

    A mon avis ce n'est pas normal ...
    Si tu veux tu peux essayer ça, juste pour voir ce que ça raconte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Dim db As DAO.Database, rs As DAO.Recordset, fld as field
    Set db = CurrentDb
    Dim SQL As String
    SQL = "SELECT [MaTable].Piece, Sum([MaTable].NbOccurence) AS SommeNbOccurence "
    SQL = SQL & "FROM [Maintenance curative bus témoin] "
    SQL = SQL & "GROUP BY [MaTable].Piece;"
    Set rs = db.OpenRecordset(SQL)
     
    For each fld in rs.Fields
        Msgbox fld.name
    Wend
    rs.close
    set rs = Nothing
    set db = nothing
    Voyons...

    A+

    pgz
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  3. #3
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2006
    Messages : 154
    Points : 124
    Points
    124
    Par défaut
    Salut,

    pour que ça fonctionne, il faut déclare rs comme variant:

    puis pour le resultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox rs.SommeNbOccurence
    bonne chance

    CAMIC

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    Bonjour,


    SQL = "SELECT [MaTable].Piece, Sum([MaTable].NbOccurence) AS SommeNbOccurence
    FROM [Maintenance curative bus témoin]
    GROUP BY [MaTable].Piece;"

    Ta table c'est [MaTable] ou [Maintenance curative bus témoin] ?
    Faut faire un choix...

    Philippe

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    Re bonjour,

    CAMIC a écrit :
    pour que ça fonctionne, il faut déclare rs comme variant
    J'ai un doute...

    Philippe

  6. #6
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2006
    Messages : 154
    Points : 124
    Points
    124
    Par défaut
    salut philben,

    il faut le type variant pour rs, car lors de l'interprétation du code il y aura une erreur car SommeNbOccurence n'est pas une propriété natif de l'objet Recordset.

    CAMIC

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    Bonjour,

    voici un code qui fonctionne à première vue :
    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
     
     
    Dim db As DAO.Database, rs As DAO.Recordset
    Set db = CurrentDb
    Dim SQL As String
    SQL = "SELECT [MaTable].Piece, Sum([MaTable].NbOccurence) AS SommeNbOccurence " & _
          "FROM [Maintenance curative bus témoin] as [MaTable] " & _
          "GROUP BY [MaTable].Piece;"
    Set rs = db.OpenRecordset(SQL, dbOpenSnapshot)
    Do Until rs.EOF = True
       MsgBox rs("SommeNbOccurence")
       rs.MoveNext
    Loop
    Set rs = Nothing
    Set db = Nothing
    Philippe

  8. #8
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    Citation Envoyé par CAMIC
    salut philben,

    il faut le type variant pour rs, car lors de l'interprétation du code il y aura une erreur car SommeNbOccurence n'est pas une propriété natif de l'objet Recordset.

    CAMIC


    Non, déclarer un objet variant quand un type existe est inutile et surtout dangereux.

    Quand on écrit rs("sommeNbOccurence"), on accède pas à la propriété sommeNbOccurence qui bien sûr n'existe pas, mais à l'élément sommeNbOccurence de la propriété Fields (qui est la propriété par défaut) de rs.

    Ainsi :

    rs("sommeNbOccurence") est en fait l'équivalent de l'écriture complète

    rs.Fields("sommeNbOccurence").Value

    Value étant la propriété par défaut d'un objet Field.

    Jamais un champ ne sera une propriété d'un recordset, mais un élément de sa collection field. Le fait de le déclarer en variant, en objet ou en DAO.Recordset ni changera rien.

    Pour éviter les alias, le plus simple est de passer par la position du champ dans le select

    Msgbox rs(1)

  9. #9
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2006
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2006
    Messages : 154
    Points : 124
    Points
    124
    Par défaut
    Tofalu,

    En quoi est il dangereux de déclarer un objet variant quand on peut le remplacer par un type approprié ?
    N'est-ce pas un type de variable qui s'adapte selon sa dernière utilisation ?

    J'avais proposé le type variant, car suite à la reprise d'une application access, quand j'avais rajouté l'option explicit et déclaré toutes les variables avant de les utiliser, l'interpréteur m'indiquait une erreur, puisque je ne voulais pas touché pour le moment au code qui fonctionne, j'avais simplement remplacé le type Recordset par Variant.

    J'espère que personne n'a cru que le faits de déclarer une variable de type variant permetait de crée de nouvelle propriété! Malheureusement la syntaxe permise pourrait nous le faire croire.

    Suite à cela, je vais remettre le type Recordset pour mes variables et modifier le code en conséquence en utilisant la syntaxe explicite

    Pour ma part, je déconseile fortement l'utilisation d'index pour accéder à des champs, excepté pour des raisons d'optimisation, car si on modifie le nombre de colonne dans la requête, le code ne fonctionnera plus.

    CAMIC

  10. #10
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Ok merci pour vos réponse
    Effectivement ca marche en utilisant le type variant

    Avec le type recordset il faut utiliser rs(1) c'est plus propre mais moins lisible...

    Fred

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 399
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 399
    Points : 2 221
    Points
    2 221
    Par défaut
    Bonjour,


    Effectivement ca marche en utilisant le type variant
    Ca marche aussi et surement mieux avec le type Recordset !!!


    Avec le type recordset il faut utiliser rs(1) c'est plus propre mais moins lisible...
    Ah bon voici 3 écritures possibles avec un recordset pour accéder à un champ :
    - rs("MonChamp")
    - rs![MonChamp]
    - rs(1)

    Si une méthode ne convient pas on en prend une autre...


    UTILISER UN TYPE RECORDSET C'EST DONC PROPRE ET LISIBLE !!!

    Philippe

  12. #12
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Salut philben

    dans le cas ou l'on veut acceder à champ calculé : rs("MonChampCalculé") ne fonctionne pas! (cf plus haut)

    effectivement rs![MonChampCalculee] marche

    donc le mieux est d'utiliser cette syntaxe plus lisible que rs(1)



    Fred

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 710
    Points : 847
    Points
    847
    Par défaut
    Et le jour ou tu modifie le contenu de SQL (ajout d'un champ, suppression d'un autre, modif de l'ordre des champs ...) il faut que tu reprennes tout ton code pour remplacer rs(1) par rs(4) par exemple

    Ce n'est qu'un avis personnel, mais je trouve plus lisible une synyaxe rs("nomduchamp) que rs(1). Si les nom de champs sont explicites (et sans espace ni accent) au moins on sait de quel champ on parle.

    A+

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/03/2012, 12h56
  2. Visibilité des champs XAML d'une UserControl déclaré dans une DLL
    Par Lelio1407 dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 24/12/2011, 00h25
  3. erreur dans une requête sql dans une fonction php
    Par frboyer dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2009, 13h37
  4. Réponses: 5
    Dernier message: 26/02/2008, 12h45
  5. Réponses: 2
    Dernier message: 11/12/2006, 12h38

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