[VBA Access] Fonction à intégrer dans une requête SQL

Résolu
cs_observatoire Messages postés 75 Date d'inscription vendredi 10 mars 2006 Statut Membre Dernière intervention 23 août 2006 - 21 juil. 2006 à 15:52
cs_observatoire Messages postés 75 Date d'inscription vendredi 10 mars 2006 Statut Membre Dernière intervention 23 août 2006 - 25 juil. 2006 à 10:14
Bonjour,
Dans mon générateur de requête, je souhaite faire intervenir une fonction mathématique que j'ai créé dans le programme (ou plutôt que j'ai repris à partir d'un code du site : c'est le khi-deux). Pour des fonction existantes dans Access pas de problème :

MonSql = " Select ABS(Var1), Var2 From Table "

Mais là, ma fonction Chi2() de type :

Public Function Chi2(ByVal X As Double, ByVal df As Integer) As Double
...
End Function

ne fonctionne pas avec :

MonSql = " Select Chi2(Var1,1), Var2 From Table "

 ni même avec

X = Chi2(Var1,1)
MonSql = " Select " & X & ",Var2 From Table "

Auriez-vous la solution??
siou plait :-(

Observatoire 

11 réponses

pymaster Messages postés 74 Date d'inscription vendredi 14 juillet 2006 Statut Membre Dernière intervention 14 août 2006
21 juil. 2006 à 18:29
reBonjour !

Je pense que j'ai peut-être trouvé une piste pour toi

ou se situ ta fonction Chi2 ? De la manière dont tu en parle on dirait que ta fonction est public mais dans un form, car ton fonction est valide quand tu affecte ton sql dans tes variables mais pas quand Access roule la query de son bord.

Si ce n'est pas le cas il faudrais que tu place ton fonction dans un module, alors Access pourrait y accédé sans faire d'erreur


J'espère que j'ai trouvé une bonne piste

PY
3
pymaster Messages postés 74 Date d'inscription vendredi 14 juillet 2006 Statut Membre Dernière intervention 14 août 2006
21 juil. 2006 à 16:01
Bonjour,

Bien le premier problème que je vois c'est que ta fonction est placé dans la partie SELECT de ton SQL et qu'elle retourne un Double ?????

Je sais pas ce que tu veux faire avec cette fonction mais je ne pense pas que Access aime 2.5656 comme nom de champs. Par contre si tu veux afficher un nom de colonne avec un chiffre qui proviens d'une fonction de Math alors je ferrais plus

MonSql = "SELECT '" & Chi2(Var1, 1) & "'", Var2 From Table "

Comme ça ton Double va être pris comme un string ;)

PY
0
cs_observatoire Messages postés 75 Date d'inscription vendredi 10 mars 2006 Statut Membre Dernière intervention 23 août 2006
21 juil. 2006 à 16:06
sauf que je ne veux pas identifier un nom de colonne avec ma formule, je pourrais très bien mettre un alias
(MonSql = " Select Chi2(Var1,1) as Alias, Var2 From Table ")
ce que je veux c'est créer une colonne qui me calcule à partir de la Var1 (comme paramètre) le Chi2()
0
BasicInstinct Messages postés 1470 Date d'inscription mardi 5 février 2002 Statut Membre Dernière intervention 20 octobre 2014 12
21 juil. 2006 à 16:34
ca marche sans probleme pour moi avec
MonSql = " Select Chi2(Var1,1) as Alias, Var2 From Table "

Mais il faut que
Var1soit bien defini comme un champ numérique.

++

BasicInstinct
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_observatoire Messages postés 75 Date d'inscription vendredi 10 mars 2006 Statut Membre Dernière intervention 23 août 2006
21 juil. 2006 à 16:51
Et bien pour moi ça ne marche toujours pas.
On me dit "Fonction 'Chi2' non définie dans l'expression"
...?

Mon code est plus précisément sous la forme de requêtes imbriquées :Sqltab2 "SELECT tab1.var1 as khi2  FROM (" & Sqltab1 & ") AS tab1"<?xml:namespace prefix o ns = "urn:schemas-microsoft-com:office:office" /??>

Sqltab3 = "SELECT tab2.khi2, Chi2(tab2.khi2,1) as ValeurP FROM (" & Sqltab2 & ") AS tab2 "

Public Function Chi2(ByVal X As Double, ByVal df As Integer) As Double
...
End Function
0
cs_observatoire Messages postés 75 Date d'inscription vendredi 10 mars 2006 Statut Membre Dernière intervention 23 août 2006
21 juil. 2006 à 16:59
par contre quand je fais :
Sqltab3 = "SELECT tab2.khi2, " & Chi2(tab2.khi2,1) & " as ValeurP FROM (" & Sqltab2 & ") AS tab2 "
<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>il reconnaît bien ma fonction chi2, mais plus tab2.khi2
0
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
23 juil. 2006 à 21:56
Salut 716258 observatoire, salut à tous,

beaucoup d'énergie dans l'coin, je viens de trouver la source de la canicule, je crois :)

- d'abord, =820468 pymaster n'a pas forcément tort (même si je trouve que tu as fais pas mal de progrès, et que je doute que n'aies pas fait attention à la portée de ta fonction), donc vérifies ce qu'il dit, ce n'est pas bête du tout (utilises le générateur de requête d'Access, il possède un assistant pour écrire les expressions, et si c'est assistant voit ta fonction, le moteur SQL la verra aussi).

- essaies aussi d'ajouter un niveau d'imbrication, car il est possible qu'il soit trop tôt pour passer tab2.khi2 en argument à une fonction (d'ailleurs, essaies simplement de mettre "SELECT tab2.khi2, tab2.khi2 + 1) as ..." pour vérifier cette hypothèse).

- en ce qui concerne le MP que tu m'as envoyé, je crois que je n'ai pas bien compris la question.

à+

PS: pardon, je ne suis pas en grande forme, je suis très pris, sur un gros projet (avec plein de robots qui n'ont pas un sens de la conversation très aiguisé), et très fatigué, tiens, je ne sais même pas en quelle page on est :).
PS2: je répondrais quand même, bien sûr, mais pas promptement.

rvblog<sup>n
Je veux ton bien....et je l'aurais....mais jamais avant la page 4 des derniers échanges</sup>
0
cs_observatoire Messages postés 75 Date d'inscription vendredi 10 mars 2006 Statut Membre Dernière intervention 23 août 2006
24 juil. 2006 à 16:15
j'avoue que je maîtrise assez mal tout ce qui sort des objets form ou tout ce qui concerne les "public" et "private". si vous pouviez m'expliquer un peu...
ça a l'air d'être en bonne voie, mais le programme bute sur un morceau du calcul, et j'ai peur de ne être à la hauteur!
0
rvblog Messages postés 792 Date d'inscription vendredi 4 mars 2005 Statut Membre Dernière intervention 12 juin 2012 7
24 juil. 2006 à 21:25
Salut 716258 observatoire,

pas à la hauteur, pas à la hauteur... qui est à la hauteur?
Ensuite, la peur dure plus longtemps que la douleur, donc pas de panique, fais-toi mal!

Allez, au boulot maintenant,
je ne suis plus sûr du contexte, mais il me semble que tu travailles sous Access.


Un formulaire est une classe, et peut exposer (publier) des propriétés ou des méthodes. Ces dernières peuvent être intégrées (car héritées de la classe formulaire, par exemple la propriété BackColor [que tu n'as pas déclarée toi-même, mais qui existe pourtant] ou la méthode Print [même combat]), et d'autres peuvent être déclarées par l'utilisateur (trice).

Un module est un ensemble conceptuel (parfois physique) de fonctions ou de variables, qui n'existe que pour répondre à un critère de qualité que l'on nomme la modularité, et qui sert donc (le plus souvent) à regrouper les fonctions et declarations d'un même domaine conceptuel (les entrées/sorties fichier, le dessin sur l'écran, la gestion des appels à l'API...).

Tous 2 font partie intégrante de l'application, mais certaines différences les condamnent à être différents :

-Tant que le formulaire n'est pas chargé, l'appel d'une de ses propriétés échoue. Ex : si tu exécutes l'instruction :
   BackColor = vbGreen
l'application ne sait pas de quel objet on parle, et ne peut pas exécuter l'instruction (enfin si, mais on ne sait pas où, on peut guetter, pour voir si quelque chose devient vert, mais à part mes commentaires, je ne vois pas :)).
Il en va de même pour ses méthodes. (la portée de ses propriétés/méthodes est dépendante du type de leur déclaration [Public lngMaCouleurDeFond As Long est visible de l'extérieur du formulaire (on dit de l'instance de l'objet, d'où "exposé" ou "publié"), Private m_lngMaCouleurDeFond As Long n'est visible que de l'intérieur du formulaire (on l'appelle un "membre", par opposition à un "attribut")], et leur durée de vie est celle du formulaire (en gros au début le formulaire est une classe [une description qui ne fait rien], ensuite on le charge et il devient une instance de classe [ou un objet], et on le décharge [on détruit l'instance de classe ou l'objet])).

- Dès que l'application s'exécute, dans un module standard occupent la mémoire et sont accessiblesleur portée est dépendante du type de déclaration [Public strMaVar As String est visible en dehors du module, et Private strMaVar2 As String n'est visible que dans le module], et leur durée de vie est celle de l'application).

Ton problème réside peut-être dans "" où tu as déclaré ta fonction Chi2 (dans un formulaire, ou dans un module standard). Elle doit être publiquedans un module standard pour pouvoir être utilisée à partir du moteur d'exécution SQL d'Access.

Simple, non?

dis nous,
à+






rvblog<sup>n
Je veux ton bien....et je l'aurais....mais jamais avant la page 4 des derniers échanges</sup>
0
cs_observatoire Messages postés 75 Date d'inscription vendredi 10 mars 2006 Statut Membre Dernière intervention 23 août 2006
25 juil. 2006 à 09:51
Bon ben là j'avoue que bon ben c'est peut-être un peu plus clair... enfin j'sais pas enfin peut-être (cf. le film "Nos jours heureux", mais là c'est un peu hors sujet)
0
cs_observatoire Messages postés 75 Date d'inscription vendredi 10 mars 2006 Statut Membre Dernière intervention 23 août 2006
25 juil. 2006 à 10:14
J'avais juste oublié un bout de la formule (la déclaration d'une constante) en la déplaçant dans le module, mais ça marche!


Merci
0
Rejoignez-nous