Requete VBA contre requete VB6+access

sokhay3 Messages postés 18 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 13 novembre 2008 - 11 août 2006 à 12:00
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 - 17 août 2006 à 11:22
bonjour à tous

je viens de recuperer un projet VBA que je dois migrer en VB6 + access

mon probleme se situe au niveau des requetes prealablement créées sur access : il s'agit de requete selection utilisant des fonctions (dans un module )

exemple de requete,

select monchamp1, maFonctionDeCalcul (monChamp2) FROM maTable

si j'execute cette fonction dans access, ben forcement ça marche
si j'essaie d'executer cette requete depuis VB6, ça marche pas (objet adodb.command). l'erreur retournée est "Fonction maFonctionDeCalcul' non définie dans l'expression."
pareil si j'essaie maConnection.execute "select monchamp1, maFonctionDeCalcul (monChamp2) FROM maTable"

quelqu'un a t'il une idée pour resoudre ce probleme

par avance merci pour vos reponses et suggestions

test

22 réponses

cs_thephil Messages postés 189 Date d'inscription mercredi 21 août 2002 Statut Membre Dernière intervention 19 janvier 2011
11 août 2006 à 13:53
en supposant que tu as bien déclaré et ouvert ta base access, il te faut reproduire la fonction "maFonctionDeCalcul" dans vb. qui doit te retourner un nom de champ je suppose !?

et après écrire ça comme ça:

dim Chaine_Sql as string
...
Chaine_Sql = "select monchamp1, " & maFonctionDeCalcul (monChamp2) & " FROM maTable"
maConnection.execute Chaine_Sql
0
pymaster Messages postés 74 Date d'inscription vendredi 14 juillet 2006 Statut Membre Dernière intervention 14 août 2006
11 août 2006 à 13:59
bonjour,

dim strQuery as string

strquery = "select monchamp1, " & maFonctionDeCalcul(monChamp2) & " FROM maTable"

ensuite tu execute une requête à partir de strQuery.

Note : Assure toi que la fonction est présente dans ton code et qu'elle est accecible. Pour être sur colle la fonction et son code juste en dessous de la fonction qui doit exécuter la requête ( si possible )

PY
0
pymaster Messages postés 74 Date d'inscription vendredi 14 juillet 2006 Statut Membre Dernière intervention 14 août 2006
11 août 2006 à 13:59
t'as été plus rapide que moi ThePhil ^_^
0
cs_thephil Messages postés 189 Date d'inscription mercredi 21 août 2002 Statut Membre Dernière intervention 19 janvier 2011
11 août 2006 à 14:07
je me suis dis, "ho le copieur !..." ^_^
0

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

Posez votre question
sokhay3 Messages postés 18 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 13 novembre 2008
11 août 2006 à 14:16
merci pour vos reponses

mais le probleme c'est que maintenant, j'ai l'erreur suivante :

Variable non definie

l'erreur est localisée au niveau de monChamp2

monChamp2 est interpreté comme une variable et non pas comme un champ de ma table
0
cs_thephil Messages postés 189 Date d'inscription mercredi 21 août 2002 Statut Membre Dernière intervention 19 janvier 2011
11 août 2006 à 14:18
donne la séquence de code, enfin si c'ets pas trop long ;-), et dis nous où ça plante.
0
sokhay3 Messages postés 18 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 13 novembre 2008
11 août 2006 à 14:33
finalement j'ai trouvé le moyen d'ecrire ma requete sans qu' elle fasse planter VB


strquery = "select monchamp1, " & maFonctionDeCalcul(" & monChamp2 & ") & " FROM maTable"

mais ensuite quand je trace ma fonction (maFonctionDeCalcul) la variable passée en parametre est "monChamp2 ", alors que je devrais avoir (pour que ça fonctionne comme sous VBA) le contenu de la table (enfin du champs)
0
sokhay3 Messages postés 18 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 13 novembre 2008
11 août 2006 à 16:24
j'ai coupé le probleme en deux: je fais une premiere requete pour selectionner mes champs, et ensuite je parcours mon recordset et j'applique ma fonction sur les champs concernés.

c'est pas tres tres beau mais au moins ça marche....
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
11 août 2006 à 17:05
Bonjour,
Et avec ceci ,

strquery = "select monchamp1, " & maFonctionDeCalcul(" & monChamp2 & ") & "  AS Expr1 FROM maTable"

> Expr1 représente la valeur retounée par ta fonction.
  Tu peux remplacer Expr1 par autre chose mais pas par le nom de ton champ.
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
11 août 2006 à 23:50
Salut,


Si tes requêtes sont déjà créées dans Access, tu peux regarder pour la commande
DoCmd.OpenQuery "MaRequête"


Je pense que ça pourrait t'intéresser

MPi
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
12 août 2006 à 00:50
Bonsoir MPi,
Le problème c' est que sa requête execute une fonction non integrée.
Il faudra la déclarer dans VB comme procédure stockée, s' il veut executer
 sa requête comme elle est définie dans Access.
T' es d' accord ?
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
12 août 2006 à 22:43
Salut Chaibat05,

Je ne sais pas... j'utilise jamais de requêtes intégrées à Access.

Par contre, je me dis que s'il démarre la requête à même Access comme
avec Do.Cmd ça devrait faire que la fonction sera reconnue par cette
même requête interne, non ? Les deux étant internes dans Access...


Mais c'est certain que je peux me tromper... ce n'était qu'une piste à envisager...

MPi
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
13 août 2006 à 00:07
Bonsoir MPi,
Rassures toi , ta solution est bonne, et tu as raison de l' envisager.
dans la mesure ou combien même elle n' est pas adaptée à son cas,
peut être que d' autres pourront en bénéficier.

A+
0
sokhay3 Messages postés 18 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 13 novembre 2008
16 août 2006 à 09:58
merci pour vos reponses :


    la fonction existe dans access (fonction publique créée dans un
module : si j'execute ma requete directment dans access ça fonctionne)


    est il possible de faire fonctionner docmd sous VB6 (ou alors je connais pas de moyen pour le faire)??
0
cs_thephil Messages postés 189 Date d'inscription mercredi 21 août 2002 Statut Membre Dernière intervention 19 janvier 2011
16 août 2006 à 10:36
docom est une fonction propore à Access, c'est une instruction interne pour exéuter une action : ouvrir un form, une requete...etc
0
cs_thephil Messages postés 189 Date d'inscription mercredi 21 août 2002 Statut Membre Dernière intervention 19 janvier 2011
16 août 2006 à 10:48
il fallait bien sûr lire "docmd" et non docom, et "exécuter" :-)
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
16 août 2006 à 11:21
Salut,

En premier, tu dois créer une référence à Access dans ton projet VB6,
ainsi qu'une autre à DAO ou ADO selon le cas. Ici j'utilise
DAO...........vieille habitude.............

Ensuite, tu déclares un objet Access et une variable pour pointer sur la base.


Private objAccess As Access.Application

Private Db As Database


Private Sub Form_Load()  ' initialisation des 2 variables-objets

    Set objAccess = New Access.Application

    Set Db = Workspaces(0).OpenDatabase(App.Path & "\bd1.mdb", False, False)  

End Sub


Ensuite, pour utiliser la commande, tu dois écrire

objAccess.DoCmd..... (ici, tu as plusieurs options possibles)

MPi
0
sokhay3 Messages postés 18 Date d'inscription samedi 5 juillet 2003 Statut Membre Dernière intervention 13 novembre 2008
16 août 2006 à 12:13
cette solution me tente mais j'ai l'erreur suivante :


Erreur d'execution : 2486 : "Impossible d'exécuter cette action pour l'instant."


alors que j'ai un projet avec juste (plus bien sur les references à access +dao)


Option Explicit

Private  objAccess As Access.Application

Private  Db As Database


Private Sub Command1_Click()

     objAccess.DoCmd.OpenQuery "maRequete"

End Sub


Private Sub Form_Load()

    Set objAccess = New Access.Application

    Set Db = Workspaces(0).OpenDatabase("C:\maBDD.mdb", False, False)

End Sub
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
16 août 2006 à 23:33
Est-ce que tu vois sur quelle ligne ça plante ?


Est-ce que le chemin et le nom de la base sont bien OK ?


"maRequete" est-il le nom exact de la requête telle que créée dans Access ?


Finalement, est-ce qu'il y a un fichier maBDD.ldb dans le même
répertoire que le mdb lorsque le programme est fermé ? Si oui, vire-le
(delete) et essaie à nouveau.

MPi
0
cs_thephil Messages postés 189 Date d'inscription mercredi 21 août 2002 Statut Membre Dernière intervention 19 janvier 2011
17 août 2006 à 09:17
je viens de tester ce morceau de code et j'ai la même erreur que toi Sokhay3 ...
Ce code ne me semble pas correct. Pour que ça marche, il faut après ces deux lignes de code :
Set objAccess = New Access.Application
Set Db = Workspaces(0).OpenDatabase("C:\maBDD.mdb", False, False)

ouvrir Manuellement la base dans la fenetre access qui s'est ouverte
à ce moment là, on peut continuer le prog et la requete s'exécute.
0
Rejoignez-nous