Regrouper et concaténer dans le même champ

Résolu/Fermé
mahrezs Messages postés 10 Date d'inscription jeudi 25 novembre 2021 Statut Membre Dernière intervention 24 mars 2022 - 20 mars 2022 à 17:43
mahrezs Messages postés 10 Date d'inscription jeudi 25 novembre 2021 Statut Membre Dernière intervention 24 mars 2022 - 24 mars 2022 à 07:53
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 22998 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 juillet 2024 1 496
21 mars 2022 à 11:23
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.
mahrezs Messages postés 10 Date d'inscription jeudi 25 novembre 2021 Statut Membre Dernière intervention 24 mars 2022
22 mars 2022 à 20:15
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.
yg_be Messages postés 22998 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 juillet 2024 1 496
22 mars 2022 à 20:51
"ça ne marche pas": message d'erreur, résultat inattendu, ..., ?
0
yg_be Messages postés 22998 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 juillet 2024 1 496 > yg_be Messages postés 22998 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 juillet 2024
22 mars 2022 à 21:06
Ta fonction est prévue pour un champ texte, pas pour un champ numérique.
0
yg_be Messages postés 22998 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 juillet 2024 1 496 > yg_be Messages postés 22998 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 20 juillet 2024
22 mars 2022 à 21:13
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 jeudi 25 novembre 2021 Statut Membre Dernière intervention 24 mars 2022
24 mars 2022 à 07:53
Bonjour, j
Je vous remercie , votre code fonction très bien.
Encore merci à vous, vraiment c’est gentil de votre part.
Bonne journée