Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Utilisation Fonction ConcatForQuery

7 réponses
Avatar
sophie-k
Bonjour,

Je cherche à faire une concaténation d'un champ à partir d'un regroupement avec la fonction ConcatForQuery. J'ai lu le post suivant : http://www.generation-nt.com/fonction-concatforquery-j-sempere-entraide-3270421.html mais je ne comprends pas comment on utilise cette fonction. J'ai essayé en créant un champ calculé dans ma requête (toto: ConcatForQuery("ChampRegroupement";[ChampRegroupement];"ValeurConcatene";"TABLE";" - "), comme l'avait fait la personne du post, en ayant préalablement activé le regroupement, mais cela ne marche pas (message d'erreur = Fonction ConcatForQuery non définie dans l'expression). Je précise que je ne suis pas experte en programmation...
Merci par avance pour votre aide

7 réponses

Avatar
Bruno13
Est-ce que tu as collé le code de la fonction dans un module ?
Si tu ne l'as pas fait tu peux la trouver à cette adresse
http://access.jessy.free.fr/htm/Query/ConcatForQuery.htm

Je ne connaissais pas cette fonction que tu me fais découvrir et qui marche
nickel.
Merci à toi et surtout à Jessy.

Bruno

"sophie-k" a écrit dans le message de news:

Bonjour,

Je cherche à faire une concaténation d'un champ à partir d'un regroupement
avec
la fonction ConcatForQuery. J'ai lu le post suivant :
http://www.generation-nt.com/fonction-concatforquery-j-sempere-entraide-3270421.html
mais je ne comprends pas comment on utilise cette fonction. J'ai essayé en
créant un champ calculé dans ma requête (toto:
ConcatForQuery("ChampRegroupement";[ChampRegroupement];"ValeurConcatene";"TABLE";"
- "), comme l'avait fait la personne du post, en ayant préalablement
activé le
regroupement, mais cela ne marche pas (message d'erreur = Fonction
ConcatForQuery non définie dans l'expression). Je précise que je ne suis
pas
experte en programmation...
Merci par avance pour votre aide



Avatar
sophie-k
Bruno13 a écrit le 19/09/2009 à 18h48 :
Est-ce que tu as collé le code de la fonction dans un module ?
Si tu ne l'as pas fait tu peux la trouver à cette adresse
http://access.jessy.free.fr/htm/Query/ConcatForQuery.htm

Je ne connaissais pas cette fonction que tu me fais découvrir et qui
marche
nickel.
Merci à toi et surtout à Jessy.

Bruno

"sophie-k" a écrit dans le
message de news:

Bonjour,

Je cherche à faire une concaténation d'un champ à partir
d'un regroupement
avec
la fonction ConcatForQuery. J'ai lu le post suivant :
http://www.generation-nt.com/fonction-concatforquery-j-sempere-entraide-3270421.html
mais je ne comprends pas comment on utilise cette fonction. J'ai essayé
en
créant un champ calculé dans ma requête (toto:
ConcatForQuery("ChampRegroupement";[ChampRegroupement];"ValeurConcatene";"TABLE";"
- "), comme l'avait fait la personne du post, en ayant
préalablement
activé le
regroupement, mais cela ne marche pas (message d'erreur = Fonction
ConcatForQuery non définie dans l'expression). Je précise que je
ne suis
pas
experte en programmation...
Merci par avance pour votre aide






En fait, je ne sais pas comment on se sert d'un module (création, insertion...). J'ai besoin d'insérer cette fonction dans un état. Merci.

Sophie
Avatar
Bruno13
> En fait, je ne sais pas comment on se sert d'un module (création,
insertion...).


Dans la barre de menu Access tu choisis Insertion puis Module.
L'éditeur de code s'ouvre.
Tu y colles la fonction ci-dessous puis tu enregistres avec le nom que tu
veux.

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

Ta fonction est maintenant définie et appelable dans toute requête de ton
application.
Tu ne devrais plus avoir ton message : (Fonction ConcatForQuery non définie
dans l'expression)

J'ai besoin d'insérer cette fonction dans un état


Attention, cette fonction ne peut être appelée que dans le cadre d'une
requête.
Quand tu dis "dans un état", c'est donc dans la requête source de ton état
(ou d'un controle liste de ton état).

@+ Bruno
Avatar
sophie-k
sophie-k a écrit le 18/09/2009 à 16h21 :
Bonjour,

Je cherche à faire une concaténation d'un champ à partir
d'un regroupement avec la fonction ConcatForQuery. J'ai lu le post suivant :
http://www.generation-nt.com/fonction-concatforquery-j-sempere-entraide-3270421.html
mais je ne comprends pas comment on utilise cette fonction. J'ai essayé
en créant un champ calculé dans ma requête (toto:
ConcatForQuery("ChampRegroupement";[ChampRegroupement];"ValeurConcatene";"TABLE";"
- "), comme l'avait fait la personne du post, en ayant
préalablement activé le regroupement, mais cela ne marche pas
(message d'erreur = Fonction ConcatForQuery non définie dans
l'expression). Je précise que je ne suis pas experte en programmation...

Merci par avance pour votre aide


Bonjour,

Merci pour ton aide ; je progresse mais ce n'est pas encore cela. J'ai créé le module : c'est OK. Lorsque je lance ma requête qui est la suivante :
SELECT R_PasBlanc.EngRegrpt_txt, ConcatForQuery("EngRegrpt_txt",[EngRegrpt_txt],"Eng_txt","R_PasBlanc"," - ") AS Résultat
FROM R_PasBlanc
GROUP BY R_PasBlanc.EngRegrpt_txt;

il m'est renvoyé un message d'erreur "Erreur d'exécution '13' / incompatibilité de type et avec le débogage apparait surlignée la ligne : Set rst = db.OpenRecordset(strRst, dbOpenDynaset). Le champ Résultat est en erreur. Je précise que ma variable à concaténer est un champ texte (au départ c'était du numérique et forcément cela ne fonctionnait pas...) et que j'ai retiré les enregistrements nul du champ sur lequel est effectué le regroupement (d'où la requête utilisée R_PasBlanc à partir de laquelle je crée ma requête avec la fonction ConcatForQuery. J'ai recréé l'exemple de Jessy et effectivement cela fonctionne parfaitement. Je ne vois pas du tout où cela pêche avec mes données...


Sophie
Avatar
Bruno13
Bonjour Sophie,
Est ce que par hasard le champ sur lequel tu fais ton regroupement ne serait
pas numérique ? ce qui expliquerait l'erreur de type.

Je me suis un peu intéressé à la fonction de Jessy et je l'ai un modifiée
pour enlever certaines limitations.
Ma version modifiée permet :
1- d'utiliser un champ numérique (y compris réel) comme champ de
regroupement (attention ce n'est pas le comportement par défaut, voir plus
loin)
2- d'utiliser un champ numérique pour la concaténation
3- d'avoir une concaténation même sur la valeur NULL du regroupement
4- de ne pas concaténer si la valeur est "" ou NULL ce qui évite d'avoir par
exemple : "jean,,paul,,,,,rémi" mais plutôt "jean, paul, rémi."
5- de ne pas planter si il y a une erreur (affiche simplement "#Erreur" dans
le champ concaténé)

Attention :
pour le point 1:
Si l'on souhaite utiliser un champ numérique pour le regroupement il faut
mettre à True le 6ème paramètre
ConcatForQuery("ChampRegroupement";[ChampRegroupement];"ValeurConcatene";"TABLE";"/",True)

pour le point 4 :
Si l'on ne souhaite pas éliminer les valeurs nulles et vides il faut mettre
à False le 7ème paramètre.
ConcatForQuery("ChampRegroupement";[ChampRegroupement];"ValeurConcatene";"TABLE";"/",True,
False)
ConcatForQuery("ChampRegroupement";[ChampRegroupement];"ValeurConcatene";"TABLE";"/",False,
False)

Voici la fonction modifiée :

Function ConcatForQuery(strRegroup As String, fldRegroup, _
strConcat As String, _
strTable As String, _
Optional strSep As String = "/", _
Optional booRegroupIsNumeric As Boolean = False, _
Optional booIgnoreNullEtBlanc As Boolean = True) 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

On Error GoTo Erreur

Set db = CurrentDb()
If IsNull(fldRegroup) Then
strRst = "Select * From [" & strTable & "] " _
& "Where [" & strRegroup & "] IS NULL ;"
ElseIf booRegroupIsNumeric Then
strRst = "Select * From [" & strTable & "] " _
& "Where [" & strRegroup & "] = " & Replace(fldRegroup, ",", ".")
& ";"
Else
strRst = "Select * From [" & strTable & "] " _
& "Where [" & strRegroup & "] = """ & fldRegroup & """;"
End If
Set rst = db.OpenRecordset(strRst, dbOpenDynaset)
With rst
If Not .BOF Then
.MoveFirst
Do Until .EOF
If Not (booIgnoreNullEtBlanc And Nz(.Fields(strConcat), "") =
"") Then
If strResult = "" Then
strResult = Nz(.Fields(strConcat), "")
Else
strResult = strResult & strSep &
Nz(.Fields(strConcat), "")
End If
End If
.MoveNext
Loop
End If
End With
ConcatForQuery = strResult
Sortie:
On Error Resume Next
rst.Close: Set rst = Nothing
db.Close: Set db = Nothing
Exit Function
Erreur:
ConcatForQuery = "#Erreur"
Resume Sortie
End Function


Pour toi Sophie, si réellement ton problème est le caractère numérique de
ton champ de regroupement il faut que tu utilises
ConcatForQuery("EngRegrpt_txt",[EngRegrpt_txt],"Eng_txt","R_PasBlanc"," -
",True) AS Résultat

Remarque aussi que tu n'as plus à utiliser "R_PasBlanc" puisque les blancs
sont maintenant gérés.

Bon tests
@+ Bruno
Avatar
sophie-k
sophie-k a écrit le 18/09/2009 à 16h21 :
Bonjour,

Je cherche à faire une concaténation d'un champ à partir
d'un regroupement avec la fonction ConcatForQuery. J'ai lu le post suivant :
http://www.generation-nt.com/fonction-concatforquery-j-sempere-entraide-3270421.html
mais je ne comprends pas comment on utilise cette fonction. J'ai essayé
en créant un champ calculé dans ma requête (toto:
ConcatForQuery("ChampRegroupement";[ChampRegroupement];"ValeurConcatene";"TABLE";"
- "), comme l'avait fait la personne du post, en ayant
préalablement activé le regroupement, mais cela ne marche pas
(message d'erreur = Fonction ConcatForQuery non définie dans
l'expression). Je précise que je ne suis pas experte en programmation...

Merci par avance pour votre aide


Merci pour l'évolution du code de Jessie qui lève des problèmes potentiels. Toutefois, cela ne change rien pour moi. En testant ma requête de ma base test (celle qui fonctionne) dans ma base de travail, je me suis rendue compte qu'elle ne fonctionne alors plus (et que ma requête marche lorsque je la copie dans ma base test). Le problème est donc lié à ma base de données !!! D'ailleurs, lorsque je veux afficher ses propriétés dans Access 2000, il me renvoie un message d'erreur "Impossible de charger les propriétés de la base de données", alors qu'elle s'affiche parfaitement avec la base test. Je précise que les 2 bases ont été créées avec Access 2003 mais pas sur les 2 mêmes ordinateurs. Un problème de registre ?

Sophie
Avatar
sophie-k
sophie-k a écrit le 18/09/2009 à 16h21 :
Bonjour,

Je cherche à faire une concaténation d'un champ à partir
d'un regroupement avec la fonction ConcatForQuery. J'ai lu le post suivant :
http://www.generation-nt.com/fonction-concatforquery-j-sempere-entraide-3270421.html
mais je ne comprends pas comment on utilise cette fonction. J'ai essayé
en créant un champ calculé dans ma requête (toto:
ConcatForQuery("ChampRegroupement";[ChampRegroupement];"ValeurConcatene";"TABLE";"
- "), comme l'avait fait la personne du post, en ayant
préalablement activé le regroupement, mais cela ne marche pas
(message d'erreur = Fonction ConcatForQuery non définie dans
l'expression). Je précise que je ne suis pas experte en programmation...

Merci par avance pour votre aide


J'ai résolu mon problème en copiant toute ma base de données dans une nouvelle BDD, et là tout fonctionne parfaitement.
Merci à toi Bruno pour m'avoir fait progresser sur les modules et pour le développement de la fonction de Jessie qui marche très bien sur mes données (concaténation de valeurs de type numérique et des enregistrements vides).

Sophie