toujours pblm avec fonction access

jack69

Nouveau membre
merci d'avoir fermer mon sujet ca fait toujours plaisir...au sujet des couleurs je veux bien faire un effort mais faites au moins en sorte que l'apercu fonctionne sinon ya pa moyen de s'en rendre compte..enfin ..
Comme je le disais, j'ai un problème avec une fonction que j'ai recupérée sur le net.
je ne connais pas bcp le vba donc je ne sais pas si l'erreur vient du code ou d'une erreur de manip de ma part.
voila le code:

Code:
 Public 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
l'utilisation de ce code est expliquée à l'adresse suivante:

j'avais l'intention de récupérer ce code pour ensuite l'utiliser à ma propre sauce, mais j'ai été confronté au message d'erreur "la fonction ConcatForQuery n'est pas définie dans l'expression"...
J'ai donc refais une table exactement comme dans l'exemple pour voir la différence mais l'erreur est la même, je vous donne le code SQL généré (qui correspond bien à l'exemple):
Code:
SELECT [test-concatforquery].fldNom, ConcatForQuery("fldNom",[fldNom],"fldPrenom","test-concatforquery"," - " ) AS Resultat 
FROM [test-concatforquery] 
GROUP BY [test-concatforquery].fldNom;
test-concatforquery est le nom que j'ai donné à la table qui me sert d'exemple.
y'a t il un problème avec le code ou alors y a t il une configuration à faire pour que la fonction soit définie??
y'a t il une erreur de manip??
 

zeb

Modérateur
[strike]Et au lieu de couleurs dégueulasses, personne ne t'a proposé l'utilisation de la balise
Code:
 ?

Lis donc ça : [/strike][url=www.presence-pc.com/forum/ppc/Programmation/Quelques-regles-simples-respecter-A-lire-avant-poster-sujet-1356-1.htm][img]http://img.presence-pc.com/forum/themes_static/images_forum/1/annonce.gif[/img]Les règles du forum Programmation- A lire ![/url] [strike]et édite ton post.[/strike]

EDIT: L'adresse reste utile :D
 

zeb

Modérateur
Pour vérifier le code de ConcatForQuery, écris la macro suivante, exécute-la et dis-nous ce que ça donne :
Code:
Sub Test
  Msgbox ConcatForQuery("fldNom", valeur_de_nom_qui_existe_dans_ta_table,  ,"fldPrenom","test-concatforquery")
End Sub
 

jack69

Nouveau membre
le résultat est "erreur de compilation: variable ou procédure attendue, et non un module"..

j'ai recherché un peu en attendant, et j'ai lu qu'access ne cherche pas les fonction créees par l'utilisateur, autres que celles d'origine, dans un module crée..J'ai donc essayé comme conseillé de taper le code directement dans le formulaire, comme pour les procédures évenementielles, mais rien ne change..alors info ou intox??

le but de la démarche était à la base de pouvoir concaténer les champs différents, correspondant à un champ de regroupement(par exemple les différents prénom correspondant à un nom), de façon à obtenir des lignes distinctes, mais avec un champ qui concatène l'ensemble des valeurs....je sait pas si je suis bien clair, mais s'il existe une autre solution que celle sur laquelle je me casse la tête, je veux bien essayer..
 

zeb

Modérateur
Argh... Comment s'appelle ton module ? Module1, c'est con, mais c'est bon :whistle: Si le module s'appelle comme la fonction, c'est-à-dire ConcatForQuery, c'est très con et ce n'est pas bon :(

Allez vérifie, recommence et viens nous dire que tu as été très bête mais que maintenant tout va bien :D
 

jack69

Nouveau membre
bon, je crois qu'on s'en approche mais c'est pas encore gagné...:)
j'ai renommé le module contenant la fonction ConcatForQuery en Module1, et déjà ca me supprime l'erreur de "fonction non définie"..c'est déjà ca. ensuite en appelant cette fonction dans une requête, l'erreur suivante de compilation apparaissait: "type défini par l'utilisateur non défini" en me surlignant cette zone du code :
Code:
Public Function ConcatForQuery(strRegroup As String, fldRegroup As String, _
    strConcat As String, strTable As String, _
     Optionnal strSep As String = "/") As String
j'ai donc essayé de supprimer <Optionnal> et < ="/" >
et là magie!!! ca marche!! enfin presque..le champ de regroupement s'affiche( fldNom ) et dans le champ ou doit normalement se faire la concaténation j'ai obtenu des jolis #Erreur...la partie du code modifié ressemble a ca:
Code:
Public Function ConcatForQuery(strRegroup As String, fldRegroup As String, _
    strConcat As String, strTable As String, _
     strSep As String) As String
et le code SQL de la requete:
Code:
SELECT [test-concatforquery].fldNom, ConcatForQuery("fldNom",[fldNom],"fldPrenom","test-concatforquery") AS Resultat
FROM [test-concatforquery]
GROUP BY [test-concatforquery].fldNom;
D'ou viens l'erreur??
Et là je me dis, mince j'ai pas mis le strSep..donc je le rajoute:
Code:
SELECT [test-concatforquery].fldNom, ConcatForQuery("fldNom",[fldNom],"fldPrenom","test-concatforquery","/") AS Resultat
FROM [test-concatforquery]
GROUP BY [test-concatforquery].fldNom;
et là ca marche plus, je retombe sur la meme erreur de compilation qui tourne en boucle et qui me force à rebooter access...Une idée? :heink:
 

jack69

Nouveau membre
j'ai vu que certains utilisent DAO.Recordset a la place de Recordset..ca change qqch?
 

zeb

Modérateur
Oui. L'erreur n'est pas sur la première ligne, mais à l'intérieur de ton code.
C'est DATABASE qui n'est pas reconnu ! (La ligne jaune est sur le nom de la fonction, mais la partie sélectionnée est sur Database.)

Le code que tu as récupéré est très ancien. Il utilise DAO. Depuis,
C'est ADO. Ce n'est pas grave, ajoute Microsoft DAO n.n Objet Library à la liste des références.
 

jack69

Nouveau membre
ok ok...ben fallait déjà le savoir :) en tt cas on avance! j'obtient maintenant une erreur de type "13","incompatibilité de type"..la ligne incriminée est celle ci:
Code:
Set rst = db.OpenRecordset(strRst, dbOpenDynaset)
certainement une subtilité qui m'échappe.. :pt1cable:
 

zeb

Modérateur
Nan, c'est celle-là :
Code:
strRst = "Select * From [" & strTable & "] " & "Where [" & strRegroup & "] = """ & fldRegroup & """;"

Ce qui donne pour le SQL : [fixed]Select * From
Where [Champs] = "1";[/fixed](le caractère pour les chaînes c'est la quote, pas la double-quote. Le séparateur de requête ; n'a rien à foutre là)

Or, si Champs est de type numérique, il est impossible de le comparer avec une chaîne, même si le contenu de la chaîne est un nombre.

Donc il faut faire une version String et un version Integer.
Code:
Function ConcatForQueryStr(..) As String
Function ConcatForQueryInt(..) As String
 

jack69

Nouveau membre
je comprends pas pourquoi tu écris
Code:
Where [Champs] = "1";
j'ai bien regardé la requête, et si j'ai bien compris, ca doit donner ca:
Code:
Select * From [test-concatforquery] Where [fldNom]= "la valeur de fldNom";
alors pourquoi "1"?
sachant que tous mes champs sont des chaines, une version Integer est utile?
 

zeb

Modérateur
Ah bah oui, ça c'est mes tests.

Alors tu as ce code :
Code:
strRst = "Select * From [" & strTable & "] Where [" & strRegroup & "] = """ & fldRegroup & """;"

Set rst = db.OpenRecordset(strRst, dbOpenDynaset)
Ajoute entre ces deux lignes, la ligne suivante :
Code:
MsgBox strRst
et donne-nous le message affiché.
 

zeb

Modérateur
Ok. Remplace quand même les " pour des ' et vire le ; final.

ok ok...ben fallait déjà le savoir :) en tt cas on avance!
Là, tu ne vas pas être déçu du voyage :sol:

Remplace
Code:
Dim db As Database
Dim rst As Recordset
par
Code:
Dim db As DAO.Database
Dim rst As DAO.Recordset

 

jack69

Nouveau membre
bon ba qd je remplace les " par des ' il me fait la gueule le compilateur...si je laisse les " il est tout content...
j'ai aussi remplacé le code, et là tout marche bien...à un détail près c'est qu'il n'y a rien dans le champ ou il devrait y avoir la concaténation des prénoms....youpi
 

zeb

Modérateur
" vs ' --> ACCESS ne respecte peut-être pas les normes du SQL. :sarcastic:
là tout marche bien... --> :sol:
il n'y a rien dans le champ --> Bon, c'est plus de mon ressort.

Bon courage.

(Relis tes premiers posts et comprends que les gens ici ont à coeur de rendre service à tous ceux qui veulent bien respecter quelques règles qui s'apparentent plus à de la politesse :merci: qu'à un endoctrinement
Vous devez être connecté pour voir les images.
)
 

jack69

Nouveau membre
ca y est!!! problème résolu!! :bounce:
il y avait une double cote de trop..en recomptant je m'en suis rendu compte..
merci pour ton aide, grand gourou du vba :love: :hello:
 

isabelle b

Nouveau membre
Bonjour

J'ai relu vos posts et je souhaiterai utiliser également la même chose

par contre je ne suis pas aussi douée que vous et j'ai dû mal avec les explications

pourriez vous me reguider pas à pas sur les modifications qui ont été effectuées car je n'arrive pas à vous suivre

notamment lorsque Zeb parle de
"Donc il faut faire une version String et un version Integer.


Code :

Function ConcatForQueryStr(..) As String
Function ConcatForQueryInt(..) As String"

la je ne vois pas du tout ce qu'il faut faire

merci de votre aide


 

zeb

Modérateur
Bonjour Isabelle,

Le problème de Jacky était très spécifique.
J'ai l'envie de te répondre la même chose qu'à Jacky :



Utilise MsgBox pouir afficher la requête avant de l'exécuter.
Tu peux aussi utiliser la fenêtre espoin ou la fenêtre exécution de l'éditeur VBA.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 128
Messages
6 717 845
Membres
1 586 373
Dernier membre
https://forum.tomshardwar
Partager cette page
Haut