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

cs_observatoire 75 Messages postés vendredi 10 mars 2006Date d'inscription 23 août 2006 Dernière intervention - 21 juil. 2006 à 15:52 - Dernière réponse : cs_observatoire 75 Messages postés vendredi 10 mars 2006Date d'inscription 23 août 2006 Dernière intervention
- 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 
Afficher la suite 

11 réponses

Répondre au sujet
pymaster 74 Messages postés vendredi 14 juillet 2006Date d'inscription 14 août 2006 Dernière intervention - 21 juil. 2006 à 18:29
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de pymaster
pymaster 74 Messages postés vendredi 14 juillet 2006Date d'inscription 14 août 2006 Dernière intervention - 21 juil. 2006 à 16:01
0
Utile
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
Commenter la réponse de pymaster
cs_observatoire 75 Messages postés vendredi 10 mars 2006Date d'inscription 23 août 2006 Dernière intervention - 21 juil. 2006 à 16:06
0
Utile
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()
Commenter la réponse de cs_observatoire
BasicInstinct 1471 Messages postés mardi 5 février 2002Date d'inscription 20 octobre 2014 Dernière intervention - 21 juil. 2006 à 16:34
0
Utile
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
Commenter la réponse de BasicInstinct
cs_observatoire 75 Messages postés vendredi 10 mars 2006Date d'inscription 23 août 2006 Dernière intervention - 21 juil. 2006 à 16:51
0
Utile
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
Commenter la réponse de cs_observatoire
cs_observatoire 75 Messages postés vendredi 10 mars 2006Date d'inscription 23 août 2006 Dernière intervention - 21 juil. 2006 à 16:59
0
Utile
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
Commenter la réponse de cs_observatoire
rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention - 23 juil. 2006 à 21:56
0
Utile
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>
Commenter la réponse de rvblog
cs_observatoire 75 Messages postés vendredi 10 mars 2006Date d'inscription 23 août 2006 Dernière intervention - 24 juil. 2006 à 16:15
0
Utile
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!
Commenter la réponse de cs_observatoire
rvblog 794 Messages postés vendredi 4 mars 2005Date d'inscription 12 juin 2012 Dernière intervention - 24 juil. 2006 à 21:25
0
Utile
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>
Commenter la réponse de rvblog
cs_observatoire 75 Messages postés vendredi 10 mars 2006Date d'inscription 23 août 2006 Dernière intervention - 25 juil. 2006 à 09:51
0
Utile
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)
Commenter la réponse de cs_observatoire
cs_observatoire 75 Messages postés vendredi 10 mars 2006Date d'inscription 23 août 2006 Dernière intervention - 25 juil. 2006 à 10:14
0
Utile
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
Commenter la réponse de cs_observatoire

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.