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.

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 13
    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 confirmé 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 : 72
    Localisation : France

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

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    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

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

    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
    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 Expert

    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
    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 confirmé
    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
    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 Expert

    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
    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

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

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    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)

+ 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