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 :

Concaténation plusieurs valeurs dans un même enregistrement [AC-2003]


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 28
    Points : 22
    Points
    22
    Par défaut Concaténation plusieurs valeurs dans un même enregistrement
    Bonjour,

    J'ai trouvé dans les FAQ exactement ce dont j'avais besoin pour régler ce pbm
    (http://access.developpez.com/sources...QLLigneColonne). Merci à TOFALU.
    J'ai essayé d'adapter le code exemple mais, malheureusement, cela ne marche pas: au lancement de la fonction, j'obtiens un message d'erreur "Runtime error 3061: Too few parameters. Expected 1"
    à la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set res = CurrentDb.OpenRecordset(SQL)
    J'ai essayé d'ajouter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set res = CurrentDb.OpenRecordset(SQL, dbOpenTable)
    Mais alors:
    "Runtime error 3011: Microsoft Jet could not find the object 'SELECT.....'. Make sur the object exists...."

    Il semble qu'il y ait un pbm dans la syntaxe de la variable SQL, mais je n'arrive pas à trouver quoi.

    Attaché base très simplifiée
    Merci d'avance pour toute aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur VBA Access
    Inscrit en
    Avril 2006
    Messages
    1 109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VBA Access

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 109
    Points : 1 535
    Points
    1 535
    Par défaut
    Bonjour,
    le premier message d'erreur stipule qu'un nom de champ ou de table dans le code SQL n'est pas connu.
    Le deuxième semble signifier qu'Access essaie de trouver un objet Table ou Requête dans la base nommé : SELECT....
    vérifie l'orthographe des noms de champs, de la (ou des tables) table et que le qu'il y a bien un espace après le SELECT dans la variable.

  3. #3
    Membre chevronné
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Points : 2 178
    Points
    2 178
    Par défaut
    une erreur dans le code SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SQL = "SELECT ContractBase FROM query1 WHERE client=""" & Client & """"
    il ne faut pas oublié les guillemets car client est de format Texte

  4. #4
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 28
    Points : 22
    Points
    22
    Par défaut
    Merci Helas.
    J'avais bien modifié le type du paramêtre dans la déclaration, mais j'ai oublié d'en tenir compte dans la chaîne SQL.
    Ca marche mais je n'ai pas encore vraiment le résultat escompté, parce que j'obtiens la table suivante:

    Période Client Expr1
    901 D 8091 - 8092 - 9001 - 9002 - 9010 - 9011
    901 F 8090 - 9003 - 9007
    901 H 8095 - 9004 - 9006
    902 D 8091 - 8092 - 9001 - 9002 - 9010 - 9011
    902 F 8090 - 9003 - 9007
    902 G 8099 - 9008
    902 H 8095 - 9004 - 9006
    903 B 9009
    903 D 8091 - 8092 - 9001 - 9002 - 9010 - 9011
    903 F 8090 - 9003 - 9007
    903 G 8099 - 9008
    903 H 8095 - 9004 - 9006

    alors que je veux obtenir:

    Période Client Expr1
    901 D 8091 - 8092
    901 F 8090
    901 H 8095
    902 D 9001 - 9002
    902 F 9003
    902 G 8099
    902 H 9004
    903 B 9009
    903 D 9010 - 9011
    903 F 9007
    903 G 9008
    903 H 9006

    Il faut tenir compte du champ "période" dans la chaîne SQL. Mais franchement, je ne vois pas comment.

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

    j'avais mis dans les contributions une fonctions de concaténation qui peut être utilisée dans votre cas :

    Ajouter la fonction de concaténation dans un module :
    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
     
    '---------------------------------------------------------------------------------------
    ' Procédure    : ConcatColonne   [Function]
    ' Retour       : String
    ' Auteur       : PhilBen
    ' Version      : 1.05
    ' Création/Maj : Le lundi 8 octobre 2007 à 18:46
    ' Objet        : Permet de concaténer en ligne les données d'une colonne
    '              : d'enregistrements en fonction d'un pivot
    ' Arguments    : vValeurPivot : La valeur de la colonne pivot
    '              : sNomColonnePivot : Nom de la colonne pivot
    '              : sNomColonneConcat : Nom de la colonne à concaténer
    '              : sNomDomaine : Table ou requête des colonnes
    '              : sWhere : Permet d'appliquer un filtre sur le domaine ("" pour aucun)
    '              : bGroupBy : Regroupement (True) pour éviter des doublons dans la concaténation
    '              : vIsOrderAsc : Trier (Ascendant = True, Desc = False) ou Null les éléments concaténés
    '              : sSeparateur : String qui sépare les éléments concaténés (ex: ",","---",...)
    ' Remarques    : * Ralentie sensiblement la requête
    '              : * Le type de la colonne pivot peut être Date, numérique, string
    '              : * Pour des raisons de performance, éviter de faire de regroupement sur la
    '              :   colonne de concaténation, la déclarer si possible <Expression> !
    ' Exemple      : SELECT [MaColPivot],
    '              : ConcatColonne([MaColPivot],"MaColPivot","MaColConcat","MaTable","",False,Null,",")
    '              : FROM MaTable Group By [MaColPivot]
    ' Historique   : 1.03 : Correction bug si le pivot est de type date
    '              : 1.04 : Complément d'information dans l'en-tête de la fonction
    '              : 1.05 : Correction bug si Pivot numérique avec décimales (, -> .)
    '---------------------------------------------------------------------------------------
    Public Function ConcatColonne(ByVal vValeurPivot As Variant, _
                                  ByVal sNomColonnePivot As String, _
                                  ByVal sNomColonneConcat As String, _
                                  ByVal sNomDomaine As String, _
                                  ByVal sWhere As String, _
                                  ByVal bGroupBy As Boolean, _
                                  ByVal vIsOrderAsc As Variant, _
                                  ByVal sSeparateur As String) As String
       On Error GoTo errtag
       Dim odb As DAO.Database
       Dim ors As DAO.Recordset
       Dim sSql As String
     
       If Not IsNull(vValeurPivot) Then
          'Préparation de la requête
          sSql = "SELECT " & sNomColonneConcat & " & """ & sSeparateur & """ As C FROM " & _
                 sNomDomaine & " WHERE " & sNomColonnePivot & "="
          Select Case VarType(vValeurPivot)
          Case vbString
             sSql = sSql & """" & vValeurPivot & """"
          Case vbDate
             sSql = sSql & Format(vValeurPivot, "\#m-d-yyyy h:n:s\#")
          Case Else 'Numériques
             sSql = sSql & Replace(vValeurPivot, ",", ".")
          End Select
          If Len(sWhere) Then sSql = sSql & " And " & sWhere
          If bGroupBy Then sSql = sSql & " GROUP BY " & sNomColonneConcat
          If IsNumeric(vIsOrderAsc) Then
             sSql = sSql & " ORDER BY " & sNomColonneConcat
             If vIsOrderAsc = 0 Then sSql = sSql & " DESC"
          End If
          'Lance la requête et concatène la colonne
          Set odb = CurrentDb
          Set ors = odb.OpenRecordset(sSql, dbOpenForwardOnly)
          While Not ors.EOF
             ConcatColonne = ConcatColonne & ors(0)
             ors.MoveNext
          Wend
          ConcatColonne = Left$(ConcatColonne, Len(ConcatColonne) - Len(sSeparateur))
       End If
    fin:
       Set ors = Nothing
       Set odb = Nothing
       Exit Function
    errtag:
       ConcatColonne = "Erreur !"
       Resume fin
    End Function
    ensuite, si j'ai bien compris , vous souhaitez pour chaque couple Client/Période regrouper dans une colonne les contrats qui seront classés par ordre croissant et retirer la lettre finale de chaque contrat.

    Paramétrage de la fonction ConcatColonne

    1. vValeurPivot correspond à chaque valeur du couple Client/Période
      = [Client] & [Période]
    2. sNomColonnePivot est le nom des champs du pivot
      = "Client & Période"
    3. sNomColonneConcat est le nom de la colonne à concaténer et enlever la lettre finale (j'ai considéré qu'il n'y avait qu'une lettre au maximum !)
      = "Left$(Contract,len(Contract)-1)"
    4. sNomDomaine est le nom de la table
      = "Contracts"
    5. sWhere pour une condition de filtre particulière, non utilisée ici
      = ""
    6. bGroupBy si on souhaite regrouper les contrats pour éviter les doublons, vrai ici
      = True
    7. vIsOrderAsc pour trier ou non les contrats sur chaque ligne, vrai ici par ordre croissant
      = True

    Enfin, la requête à exécuter est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT T.Période, T.Client, ConcatColonne([Client] & [Période],"Client & Période","Left$(Contract,Len(Contract)-1)","Contracts","",True,True," - ") AS Contrats
    FROM Contracts AS T
    GROUP BY T.Période, T.Client;
    En espérant que ça fonctionne bien dans tous les cas sinon il faudra passer par une fonction dédiée.

    Ce type de requête est relativement lente...

    Philippe

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2008
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 28
    Points : 22
    Points
    22
    Par défaut Pbm réglé

    Après quelques tatonnements, j'ai trouvé comment tenir compte à la fois de la période et du client.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function RecupCB(Client As String, Période As Integer) As String
    dans la déclaration de la fonction et,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL = "SELECT ContractBase FROM query1 WHERE client=""" & Client & """ And Période = " & Période
    dans la variable SQL.
    La fonction RecupCB étant intégrée dans la requète Query2, j'obtiens bien, très rapidement:

    Période Client Expr1
    901 D 8091 - 8092
    901 F 8090
    901 H 8095
    902 D 9001 - 9002
    902 F 9003
    902 G 8099
    902 H 9004
    903 B 9009
    903 D 9010 - 9011
    903 F 9007
    903 G 9008
    903 H 9006

    Attachée table exemple comme contribution.

    Merci à tous, Ilank, Helas et philben pour votre aide.
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. [MySQL] enregistrer plusieurs valeurs dans un même champ
    Par xKryckx dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 30/03/2015, 14h37
  2. Plusieurs valeurs dans un même champ
    Par fidecourt dans le forum Outils
    Réponses: 2
    Dernier message: 30/01/2013, 00h03
  3. [A-03]plusieurs valeurs dans le même champ
    Par eldjuju dans le forum IHM
    Réponses: 1
    Dernier message: 12/03/2009, 17h33
  4. Plusieurs valeurs dans une même cellule
    Par biche1 dans le forum Excel
    Réponses: 4
    Dernier message: 25/09/2008, 15h56
  5. Réponses: 5
    Dernier message: 04/06/2008, 10h03

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