Requete VBA contre requete VB6+access

Messages postés
18
Date d'inscription
samedi 5 juillet 2003
Statut
Membre
Dernière intervention
13 novembre 2008
-
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
-
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

Messages postés
189
Date d'inscription
mercredi 21 août 2002
Statut
Membre
Dernière intervention
19 janvier 2011

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
Messages postés
74
Date d'inscription
vendredi 14 juillet 2006
Statut
Membre
Dernière intervention
14 août 2006

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
Messages postés
74
Date d'inscription
vendredi 14 juillet 2006
Statut
Membre
Dernière intervention
14 août 2006

t'as été plus rapide que moi ThePhil ^_^
Messages postés
189
Date d'inscription
mercredi 21 août 2002
Statut
Membre
Dernière intervention
19 janvier 2011

je me suis dis, "ho le copieur !..." ^_^
Messages postés
18
Date d'inscription
samedi 5 juillet 2003
Statut
Membre
Dernière intervention
13 novembre 2008

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
Messages postés
189
Date d'inscription
mercredi 21 août 2002
Statut
Membre
Dernière intervention
19 janvier 2011

donne la séquence de code, enfin si c'ets pas trop long ;-), et dis nous où ça plante.
Messages postés
18
Date d'inscription
samedi 5 juillet 2003
Statut
Membre
Dernière intervention
13 novembre 2008

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)
Messages postés
18
Date d'inscription
samedi 5 juillet 2003
Statut
Membre
Dernière intervention
13 novembre 2008

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....
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
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.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
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
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
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 ?
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
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
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
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+
Messages postés
18
Date d'inscription
samedi 5 juillet 2003
Statut
Membre
Dernière intervention
13 novembre 2008

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)??
Messages postés
189
Date d'inscription
mercredi 21 août 2002
Statut
Membre
Dernière intervention
19 janvier 2011

docom est une fonction propore à Access, c'est une instruction interne pour exéuter une action : ouvrir un form, une requete...etc
Messages postés
189
Date d'inscription
mercredi 21 août 2002
Statut
Membre
Dernière intervention
19 janvier 2011

il fallait bien sûr lire "docmd" et non docom, et "exécuter" :-)
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
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
Messages postés
18
Date d'inscription
samedi 5 juillet 2003
Statut
Membre
Dernière intervention
13 novembre 2008

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
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
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
Messages postés
189
Date d'inscription
mercredi 21 août 2002
Statut
Membre
Dernière intervention
19 janvier 2011

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.