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

VBA Access Discussion :

Comment renseigner les champs dans une requete avec VBA


Sujet :

VBA Access

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 71
    Points : 57
    Points
    57
    Par défaut Comment renseigner les champs dans une requete avec VBA
    Bonjour,

    Je souhaite utiliser ce code source trouver sur le net :

    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
    Function ConcatForQuery(strRegroup As String, fldRegroup As String, _
        strConcat As String, strTable As String, _
        Optional strSep As String = "/") As String
     
    '** Regroupement de donnée sur le champ fldRegroup
    '** et concaténation sur le champ strConcat
    Dim db As Database
    Dim rst As Recordset
    Dim strResult As String
    Dim strRst As String
     
    Set db = CurrentDb()
    strRst = "Select * From [" & strTable & "] " _
        & "Where [" & strRegroup & "] = """ & fldRegroup & """;"
     
    Set rst = db.OpenRecordset(strRst, dbOpenDynaset)
    With rst
        If Not .BOF Then
            .MoveFirst
            Do Until .EOF
                If strResult = "" Then
                    strResult = .Fields(strConcat)
                Else
                    strResult = strResult & strSep & .Fields(strConcat)
                End If
            .MoveNext
            Loop
        End If
    End With
    rst.Close: Set rst = Nothing
    db.Close: Set db = Nothing
    ConcatForQuery = strResult
     
    End Function
    Avec la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT fldNom, ConcatForQuery("fldNom",[fldNom],"fldPrénom","MaTable"," - ") AS Résultat
    FROM MaTable
    GROUP BY fldNom;
    que j'ai trouvé à cette adresse : http://access.jessy.free.fr/htm/Quer...atForQuery.htm.

    Je parviens à le faire marcher avec la requette suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT idparcelle,ConcatForQuery("idparcelle",[idparcelle],"prise","parcelles_concat"," - ") AS Résultat
    FROM parcelles_concat
    GROUP BY  idparcelle;
    Cependant j'aimerais savoir pourquoi la requête ci-dessous ne fonctionne pas? Je suppose que les champs faisant office de variable doivent être formatés correctement (voila plusieurs années que je n'ai pas codé sous vb), style un problème de cote?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT parcelles_concat.idparcelle,ConcatForQuery("parcelles_concat.idparcelle",[parcelles_concat.idparcelle],"parcelles_concat.prise","parcelles_concat"," - ") AS Résultat
    FROM parcelles_concat
    GROUP BY  parcelles_concat.idparcelle;
    .


    *EDIT
    Les deux requêtes exposées ci dessus sont exécutées à partir de la même table parcelles_concat.

    Lorsque j'utilise l’assistant de requête de access puis que je bascule en mode sql, le champ apparait sous le nom parcelles_concat.idparcelle ( NOMDELATABLE.NOM DU CHAMPS). Cependant, access autorise, en mode sql, de simplifier le nom du champ. Ainsi le champ précédemment cité peut aussi s'écrire idparcelle.

    Par avance merci,

    Cordialement.

  2. #2
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    Si tu peines à écrire les requêtes en SQL, je te conseille de le faire en mode Création standard.
    Tu y verras plus clair, surtout si tu as des critères, et tu seras assisté.

    titi95
    Un problème bien posé est à moitié résolu

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 71
    Points : 57
    Points
    57
    Par défaut
    Mon réel problème ici est de savoir comment nommer les champs de ma deuxieme requête sql (dois je ajouter des cotes...?)

  4. #4
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    Mon réel problème ici est de formater mes champs faisant office de variables de ma requête sql faisant appel à une fonction VBA.
    Vraiment désolé, mais je ne comprends pas.

    titi95
    Un problème bien posé est à moitié résolu

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 71
    Points : 57
    Points
    57
    Par défaut
    Il est vrai que je ne suis pas tres clair, je précise :

    Les deux requêtes exposées ci dessus sont exécutées à partir de la même table parcelles_concat.

    Lorsque j'utilise l’assistant de requête de access puis que je bascule en mode sql, le champ apparait sous le nom parcelles_concat.idparcelle ( NOMDELATABLE.NOM DU CHAMPS). Cependant, access autorise, en mode sql, de simplifier le nom du champ. Ainsi le champ précédemment cité peut aussi s'écrire idparcelle.

    Ainsi les deux requêtes proposées dans mon 1er post sont identiques, seul la facon de nommé les champs est modifiée (une fois complète, une fois simplifié).
    C'est pourquoi je ne comprends pas pourquoi ma requête fonctionne lorsque j'utilise les champs simplifiés puis ne fonctionne plus avec les champs complets.

  6. #6
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    C'est plus clair.
    Et avec ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT parcelles_concat.idparcelle,ConcatForQuery("idparcelle",[parcelles_concat.idparcelle],"prise","parcelles_concat"," - ") AS Résultat
    titi95
    Un problème bien posé est à moitié résolu

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 71
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par titi95 Voir le message
    C'est plus clair.
    Et avec ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT parcelles_concat.idparcelle,ConcatForQuery("idparcelle",[parcelles_concat.idparcelle],"prise","parcelles_concat"," - ") AS Résultat
    titi95
    Ok merci, j'y vois un peu plus clair. Cette requête fonctionne. Il semblerait donc que le caractère 'point' ne soit pas accepté par ce code source.

    J'essayais d'utiliser aussi ce code avec une requête imbriquée, mais la encore, le code ne semble pas fonctionné ou aurais -je fais une erreur (cf requête ci dessous)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select id,   ConcatForQuery("id",[id],"prise","parcelles_concat"," - ") AS prise
     FROM    (SELECT left(public_parcelles.idparcelle,12) AS id, prise
                     FROM public_parcelles)
     
    GROUP BY id;

  8. #8
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    Bonjour

    Excuse moi d'insister !
    Essaie de construire plutôt que d'écrire ta requête.

    Déjà, dans le 1er Select, il me se semble qu'il faille ajouter devant le champ id le nom de la table d'origine suivi d'un point (prendre modèle sur celui qui marche)
    En mode création cela se fait "tout seul"...

    Mon avis sur le sujet
    Je ne suis pas du tout contre l'utilisation du SQL, mais :
    - c'est une syntaxe de plus qu'il faut pratiquer couramment, comme toute syntaxe, si on veut la maitriser
    - elle peut avoir quelques différences avec les autres, d'où des sources de de mélange et de plantage... et de pertes de temps (la preuve)
    - on écrit en ligne, alors qu'en mode Création classique, on est en "2D" du coup, la construction est beaucoup plus claire*
    - en mode Création classique on est assisté

    * dès que l'on a beaucoup de champs qui viennent de plusieurs tables et requêtes, et surtout de nombreux critères avec des ET sur plusieurs lignes (OU), il faut être très doué et très pro pour écrire et lire la requête en SQL.
    J'ai des exemples où c'est inextricable ! Et je ne parle pas des conséquences d'une petite modif toute simple...

    Donc, si on ne pratique pas couramment, et surtout lorsqu'on débute, je conseille vivement de "construire" les requêtes en mode Création. Quitte à aller voir le SQL obtenu pour se familiariser ou pour le récupérer.
    Un problème bien posé est à moitié résolu

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 71
    Points : 57
    Points
    57
    Par défaut
    hum...

    Ma vraie question est comment écrire ma requete avec ce code VBA et non comment écrire ma requête. Je suis contraint d'utiliser ce code car je n'ai pas trouvé d'équivalent à la fonction CONCAT() en mysql ou encore STRING_AGG en postgresql.

    Certe je ne suis pas un expert en sql mais je pense avoir un minimum de connaissance et de méthodologie pour répondre à mes besoins.

    Ok merci, j'y vois un peu plus clair. Cette requête fonctionne. Il semblerait donc que le caractère 'point' ne soit pas accepté par ce code source.
    Je mets ce post en résolu. Finalement la conclusion s'avère être le message ci dessus.

  10. #10
    Membre éprouvé

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Novembre 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 904
    Points : 1 229
    Points
    1 229
    Par défaut
    Je suis contraint d'utiliser ce code car je n'ai pas trouvé d'équivalent à la fonction CONCAT() en mysql ou encore STRING_AGG en postgresql.
    équivalents : & ou +

    titi95
    Un problème bien posé est à moitié résolu

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 71
    Points : 57
    Points
    57
    Par défaut
    ok, alors imaginons la table exercice

    note | eleve
    10 | pierre
    12 | paul
    12 | jacques
    14 | francis

    Je souhaite grouper les élèves selon leur note. L'objectif est d'obtenir

    note | eleve
    10 | pierre
    12 | paul - jacques
    14 | francis

    Je ne vois pas comment écrire ma requête avec votre solution.
    SELECT note, (eleve que mettre ici??)
    FROM exercice
    GROUP BY note

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

Discussions similaires

  1. [XL-2007] Renommer les champs d'une colonne avec VBA excel
    Par FramanKalima dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 22/06/2015, 17h25
  2. Faire varier les champs dans une requete
    Par kervin dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 10/09/2014, 12h58
  3. Réponses: 0
    Dernier message: 30/06/2011, 20h33
  4. Forcer un parametre dans une requete avec VBA
    Par PsykotropyK dans le forum VBA Access
    Réponses: 1
    Dernier message: 09/07/2008, 17h42
  5. comment supprimer un champ dans une requete ??
    Par loran v2 dans le forum Bases de données
    Réponses: 2
    Dernier message: 24/03/2006, 20h41

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