Regrouper et concaténer dans le même champ

Résolu
mahrezs Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -  
mahrezs Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
Je cherche à concaténer les valeurs d’un champ dans un même champ en fonction d’un autre champ.
J’ai un code VBA qui permet cela quand les deux champs sont dans la MEME TABLE.
Hélas dans mon travail, j’ai le champ à regrouper dans une table et le champ à concaténer dans une autre table. Le code est appelé depuis une requête.
voici le code :

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

Style de requête

SELECT champs à regrouper,
ConcatForQuery("champs à regrouper",[ champs à regrouper],"champ à concaténer","table"," - ") AS Résultat
FROM table
GROUP BY champs à regrouper;

Une solution svp ?
Merci




Configuration: Windows / Chrome 99.0.4844.74

3 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
Je pense que ton code VBA est capable de faire cela sur base d'une requête aussi bien que sur base d'une table.
Il suffit donc de commencer par faire une requête qui rassemble ce dont tu as besoin, puis une seconde requête du même style que celle que tu nous montres, qui utilises la première requête comme source.
0
mahrezs Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,
Je vous remercie pour votre aide, oui ça fonctionne bien avec une requête.
Hélas, j’ai toujours un souci, ça ne marche pas quand le champ regroupé est une clé primaire. J’espère trouver une solution chez vous, comme toujours.

J’ai réalisé un p’tit exemple :

https://drive.google.com/file/d/1_w1N1reWv5M5s1Hr6llZdtjAPTc2DDOq/view?usp=sharing

Y’a deux requêtes dans l’exemple :
1° : R_Cancaténer , elle fonctionne bien avec de simples champs ;
2° : R_Cancaténer_ID , elle fonctionne pas quand le champ regroupé est une clé primaire.

Merci bien.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
"ça ne marche pas": message d'erreur, résultat inattendu, ..., ?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Ta fonction est prévue pour un champ texte, pas pour un champ numérique.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Une façon de corriger cela, c'est de créer une seconde fonction, similaire, pour les cas où le type du champ est numérique, et d'appeler cette fonction quand nécessaire:
Function ConcatForQuerynum(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
ConcatForQuerynum = strResult

End Function

Au lieu d'utiliser deux fonctions presque identiques, il serait peut-être préférable d'ajouter un paramètre à la fonction, pour préciser si le champ est numérique ou pas. J'ai fait au plus simple et au plus rapide, pour que tu puisses confirmer que cela fonctionne.
0
mahrezs Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour, j
Je vous remercie , votre code fonction très bien.
Encore merci à vous, vraiment c’est gentil de votre part.
Bonne journée
0