Fonction vba pour executer requete sql [Résolu]

Messages postés
15
Date d'inscription
lundi 6 juin 2005
Dernière intervention
30 juin 2005
- - Dernière réponse : tbbuim1
Messages postés
940
Date d'inscription
jeudi 20 février 2003
Dernière intervention
3 février 2011
- 30 juin 2005 à 15:06
Bonjour,

j'ai une petite question j'ai crée une base de données sous Access et maintenant je crée une interface en vba
dans mon code je voudrais faire une fonction qui retourne le résultat d'une requête
je ne connais pas vraiment la syntaxe j'ai cherché à droite a gauche et on ma dit qu'il fallait que j'entre ça pour commencer

Dim conConnection As ADODB.Connection
Dim recSet As New ADODB.Recordset

il me semble que c'est pour connecter ma base a mon code
moi je pensais que c'était déjà fait quand on n’utilisait vba

voila merci

Shainaizz
Afficher la suite 

18 réponses

Meilleure réponse
Messages postés
940
Date d'inscription
jeudi 20 février 2003
Dernière intervention
3 février 2011
3
Merci
Quel est le message d'erreur

L'erreur est au niveau de A= ou de la requête Insert

As-tu vérifié si Classeur() te retourne bien la valeur souhaité.

Tu peux le savoir en faisant:

Msgbox Classeur( )

Pour ce qui est de la requête insert, il semble y avoir une erreur de syntax...



En principe, il faut écrire

INSERT INTO Table (Champ1) VALUES ('truc');

INSERT INTO Table SELECT * FROM Tbl;



Mais je n'ai jamais essayé

INSERT INTO Table (Champ1) Select Champ1 from Tbl;



Quoiqu'il en soit, il semble qu'il manque la table dans laquelle tu
veux insérer dans ta requête. Donc forcément ça ne marche pas...



Si tu veux avoir la syntax des divers requêtes SQL, va sur google et tape SQL Syntax

tu as un tas de sites qui détails toutes les possiblités

.
Résumé: Si A est le nom de ta table alors il ne doit pas être
entre quotes, ni parenthèse. si c'est le nom d'un champ, il manque le
nom de la table.
TBBUIM

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Messages postés
940
Date d'inscription
jeudi 20 février 2003
Dernière intervention
3 février 2011
0
Merci
AAAAARRRGGGGGG!!!!!!!!

Pas de recordset sous ACCESS, c'est inutile (ou presque)

Pour lancer une requête sous access rien de plus facile



Docmd.OpenQuery "NomDeLaRequête"



Pour lancer une requête écrite dans le code, avec une variable string

Genre rq = "Select * from Table;"



Docmd.RunSQL rq



Regarde dans l'aide access, toutes les possibilités que t'offre la commande

Docmd

Ouverture de table, de formulaire, d'état, de rq...



Pour récupérer un seul élément d'une requête, par exemple, la somme de montants

Me.ZoneDeTexte = Dlookup("Somme","rq_de_somme")



Voir, aussi des trucs très utilie pour faire des opérations sur les tables.

Tels que:

Dlookup, DSum, Dcount, DFirst, Dlast...



Access gère les bases de données, et tout est fait pour pouvoir manipuler le plus simplement du monde des BD ,
contrairement à VB, ou l'on doit faire des pieds et des mains avec des
recordsets, des adodc et des datagrid pour afficher un pauvre
malheureux select * ...



Si tu commences à faire des recordsets avec ACCESS, t'es pas sorti de l'auberge!
TBBUIM
Messages postés
15
Date d'inscription
lundi 6 juin 2005
Dernière intervention
30 juin 2005
0
Merci
ok merci beaucoup

Et pour que ma fonction retourne le résultat de ma requete
c'est :

Code-->Nom de ma fonction

code=Docmd.RunSQL rq

???


Shainaizz
Messages postés
69
Date d'inscription
lundi 3 janvier 2005
Dernière intervention
15 septembre 2005
0
Merci
Salut,

contrairement à ce qui pourrait sembler logique, vba n'est pas relié à
la base access donc il faut lui spécifier l'emplacement de la base et
le type de connection :



'initialisation de la base de données

Set ct = New ADODB.Connection

With ct



.Provider = "Microsoft.Jet.oledb.4.0"



.ConnectionString = "tabase.mdb" 'chemin relatif de ta base



.Open

End With



ensuite il ne te reste qu'à effectuer tes requêtes sachant 2 choses :

les requêtes d'update et d'insertion se font avec un objet Command




'Mise à jour ou insertion


Set
sqlmaj = New ADODB.Command



With sqlmaj



.ActiveConnection = ct



.CommandText = "Ta requête ";"



.Execute



End With



les requêtes de sélection se font avec un recordset



'exemple de récupération de la valeur souhaitée



Set rc = New ADODB.Recordset



rc.Open "Ta requête';", ct,
adOpenDynamic



val = rc(0) 'ici tu récupères la première valeur uniquement



rc.Close



Donc en début de sub il faut que tu déclares 1 ADODC.Connection, 1
ADODC.recordset et 1 ADODC.Command, et surtout n'oublie pas de fermer
ta connection (ici, ct.Close) à la fin de ta sub sinon tu auras des
problèmes d'ouverture.
Messages postés
15
Date d'inscription
lundi 6 juin 2005
Dernière intervention
30 juin 2005
0
Merci
Ok merci je vois que les avis divergent !

j'écris mon code et je vous le montre
encore merci


Shainaizz
Messages postés
940
Date d'inscription
jeudi 20 février 2003
Dernière intervention
3 février 2011
0
Merci
hmm hmm...

Je bosse depuis 3 ans sous ACCESS, tous les jours, 7h par jour, et j'ai
jamais fait de recordset sauf pour accélérer la vitesse d'affichage
dans certains formulaire, sinon ça ne sert à rien si tu utilise les
tables ACCESS. Tu en as besoin pour te connecter à d'autre type de
tables du genre SQLServer, Oracle ou MySQL, d'accord, là tu fais ce que
t'as dit. Mais avec une table access c'est inutile!!! Je suis formel,
sinon, tous les programmes que j'ai fait depuis 3 ans marchent par
l'intervention du st esprit...



Shainaizz>



Ca dépend ce que tu as comme résultat, ta fonction a pour but, d'afficher le résultat de la requête, ok, mais sous quelle forme.

Est-ce que c'est une valeur précise?

Est-ce que c'est un ensemble de valeur sous forme de table?

Ta requête est-elle écrite en code, ou est-elle créé sous ACCESS en tant que rq?



C'est important de le savoir!

De plus, tu ne peux pas dire fonction = résultat rq...

Par contre tu peux dire

Public sub affiche()

docmd.openQuery "rq_bidon"

End sub



Essayes les commandes que j'écris, tu verras laquelle te convient.

Docmd.opnequery affiche le résultat de la requête sous forme de tableau.

Si ya bcp de champ et beaucoup de ligne concernées par le résultat.



En revanche, si ton résultat est unique, comme la somme d'un tout,
comme je te l'ai dit plus haut, là tu peux évidemment l'affecter à une
fonction. qui prendra une seule valeur. dans l'autre cas, ce n'est pas
possible.

Mais dans ce cas, tu dois utiliser, soit la fonction DSum pour avoir
directement la somme, soit la fonction DCount, si tu veux compter le
nombre d'élément, soit la fonciton Dlookup, si tu veux récupérer une
valeur précise dans une fonction de ton cru. Et là tu pourras écrire:

Fonction = dlookup("Somme","rq_somme")



Voilà. et je ne vois pas ou Omsylv a été pécher l'info que ACCESS n'est
pas relié à ACCESS lol... Sinon à quoi servirait ACCESS, juste à faire
des tables? je ne pense pas, tu peux toujours faire des recordset,
certes, mais ce n'est pas du tout, OBLIGATOIRE, pourquoi faire
compliqué quand ACCESS GERE TOUT POUR NOUS! Quand tu as compris le truc
et la FORMIDABLE liaison qu'ACCESS a avec les bases, du dit adieu à ces
maudits recordset!
TBBUIM
Messages postés
15
Date d'inscription
lundi 6 juin 2005
Dernière intervention
30 juin 2005
0
Merci
Merci beaucoup TBBUIM !!!
Je commencé vraiment a paniqué parce que le record set ça me fait peur !!

pour revenir à ma fonction
j explique
elle doit exécuter une requête que je crée en code dans une variable
et la valeur qu'elle doit retourner c'est le résultat de ma requête
ce résultat c'est un seul numéro
ce numéro dépend de la valeur d'une de mon contrôle (choisit par l'utilisateur) j'ai donc mis cette variable en paramètre

plus précisément
je vais ensuite me servir de cette fonction pour enregistrer ce numéro dans le champ d'une table sur une ligne précise

je vais tenter d'écrire le code

voila encore merci


Shainaizz
Messages postés
15
Date d'inscription
lundi 6 juin 2005
Dernière intervention
30 juin 2005
0
Merci
ok je suis vraiment nulle !!

Public Function Classeur(LettreCl As String) As Integer
voila ma requete :
Dim sql As String
sql = "SELECT CL.CodCl FROM CL WHERE (((CL.LibCl)='" & LettreCl & " '));"

je l'execute :
DoCmd.RUN SQL sql

et la normalemen je devrais entrer un code qui va retourner le resultat (un nombre) de ma requete mais je bloque

End Function


Shainaizz
Messages postés
940
Date d'inscription
jeudi 20 février 2003
Dernière intervention
3 février 2011
0
Merci
C'est mieux de créer ta requête avec l'assitant.

C'est plus facile à gérer par la suite.

Pour mettre une zone de texte ou de liste choisi par l'utilisateur en
critère; il faut tout simplement écrire cela dans la zone critère de ta
requête:

[Forms]!NomDuForm.NomDuControl

C'est simple, tu crées une requête, tu choisis la table d'ou vont être
tiré les données, tu clic sur les champs que tu veux voir affichés, ou
qui vont te servir à avoir un résultat, par exemple, ton champ numéro
et le champ du critère. Et ensuite, de mettre dans critère, le nom du
control que tu veux comparer.

Tu sauves cette requête (si tu veux voir le résultat directement
pendant que tu l'as crée, tu dois avoir le formulaire, d'où vient le
control pris en critère, ouvert)

Une fois que ta requête est sauvé et que tu l'as appelé disons rq_first

Et de là tu peux affecter à ta fonction le résultat de ta rq

en faisant fonction = dlookup("NomDuChamp","rq_first")



Tu peux également mettre directement le critère dans un dlookup

Dlookup("NomduChamp","NomTableOuRequête","Numéro = [forms]!NomduForm.NomDuControl")

Bref, ya un tas de possibilité, tout dépend de ce que tu as et veux faire exactement.

Regarde l'aide sur ces fonctions, ya pas mal d'exemples et d'explications.
TBBUIM
Messages postés
940
Date d'inscription
jeudi 20 février 2003
Dernière intervention
3 février 2011
0
Merci
Donc là, tu peux écrire:



Public Function Classeur(LettreCl As String) As Integer

Classeur Dlookup("CodCL","CL","LibCl '" & LettreCL & "'")
End Function



Attention, si ton libellé peut contenir des apostrophes, tu dois écrire

Classeur Dlookup("CodCL","CL","LibCl """ & LettreCL & """)



Tu peux aussi écrire, si ya pas d'apostrophes

Classeur Dlookup("CodCL","CL","LibCl " & LettreCL)



Mais cette écriture est plus adapté pour la comparaison entre nombre.

Si la réponse te convient, n'oublies de cliquer sur "réponse acceptée"

TBBUIM
Messages postés
15
Date d'inscription
lundi 6 juin 2005
Dernière intervention
30 juin 2005
0
Merci
OK une dernière chose après j'accepte ta réponse !
tu peux jeter un coup d'oeuil stp !

Public Function Classeur()


Classeur = DLookup("CodClasseur", "CLASSEUR", "LibClasseur=" & Me.LibFamille)


End Function


Public Sub BOUTON_Click()


Dim A As Integer
Dim SQS As String


j'ai une erreur a ce niveau là
A = Classeur()


SQS = "insert into ('" & A & "') Select MEDIA.CodClasseur From MEDIA where (((MEDIA.CodMedia)='" & Me.CodMedia & "'));"


DoCmd.RunSQL SQS


End Sub


Shainaizz
Messages postés
15
Date d'inscription
lundi 6 juin 2005
Dernière intervention
30 juin 2005
0
Merci
j'ai oublier quelque chose MERCI


Shainaizz
Messages postés
15
Date d'inscription
lundi 6 juin 2005
Dernière intervention
30 juin 2005
0
Merci
Ok merci
j'ai modifié ma requête insert into
mais toujours le même message d'erreur
"impossible de trouver le champ "forms" auquel il est fait référence dans votre fonction"
l'erreur est au niveau du A=
mon A est la variable qui stocke la valeur retourner par ma fonction
insert to me permet d'insérer la valeur contenue par A dans un champ d'une de mes tables

En faite mon formulaire est un formulaire de saisie et le cod classeur fait parti des champs à saisir mes je l'ai crée comme un champ indépendant du coup je suis obligé moi-même (avec du code) de l'enregistrer dans ma table
je me demande si l'erreur ne vient pas du fait que la table ou je veux enregistrer ma valeur contient d'autres champs qui sont obligatoire a la saisie (ce sont des clés étrangères)
a vrai dire je suis un peu perdu et il me reste plus beaucoup de temps pour tout finir !

voila mon code

Public Function Classeur(LettreCl As String) As Integer


Classeur = DLookup("CodClasseur", "CLASSEUR", "LibClasseur='" & LettreCl & "'")
MsgBox = Classeur()

End Function



Public Sub BOUTON_Click()
Dim A As Integer
Dim SQS As String


A = Classeur([Me.CodClasseur.Value])


SQS = "Insert Into Table Media (CodClasseur) values (" & A & ");"


DoCmd.RunSQL SQS


End Sub


Shainaizz
Messages postés
15
Date d'inscription
lundi 6 juin 2005
Dernière intervention
30 juin 2005
0
Merci
J’ai aussi essayé d'exécuter ma fonction dans la fenêtre d'exécution il me dit qu'il y a
une erreur de compilation
sub ou fonction non définie

voila ce que j'ai tapé dans la fenêtre
? Classeur(b)

Shainaizz
Messages postés
940
Date d'inscription
jeudi 20 février 2003
Dernière intervention
3 février 2011
0
Merci
_Il faut écrire Msgbox Classeur() et pas Msgbox = Classeur()



_Sous Access, le .value est inutile car par défaut.



_N'écris pas entre cochets Me.CodClasseur, les crochets ne sont utiles
que si tu as un nom qui contient des espaces genre Me.[Code Classeur]
ici c'est inutile et mal placé de surcroît. Car le Me. ne doit pas être
entre crochets.



_Tu dois faire le Msgbox dans le bouton_click pour voir si tu as bien la bonne valeur au moment ou tu clic sur le bouton.



_A quoi ça sert de faire un INSERT d'uniquement cette valeur?

Si en plus tu as des valeurs obligatoires, ça ne marchera pas, tu auras un message d'erreur. c'est sur.



_Tu devrais rassembler toutes les valeurs nécessaires pour faire ton
insert et ensuite lancer la commande. Pour le moment vérifie si ton
Msgbox renvoi bien la valeur désirée.


TBBUIM
Messages postés
15
Date d'inscription
lundi 6 juin 2005
Dernière intervention
30 juin 2005
0
Merci
Ok merci
j'ai bien fait tous ce que tu m'as dit et la valeur dans le message box est la bonne !!!!!!!!!!!!!!!!!
maintenant mon message d'erreur est le suivant
erreur de syntaxe dans l'instruction insert to

il bloque ici :
DoCmd.RunSQL SQS

je vais modifier ma syntaxe et voir ce que sa donne


Shainaizz
Messages postés
15
Date d'inscription
lundi 6 juin 2005
Dernière intervention
30 juin 2005
0
Merci
c'est bon j'ai rectifié mon erreur
j'ai crée ma requête avec access et je l'exécute avec la commande DoCmd.OpenQuery "enregistrement"

j'ai également modifié la requête insert to pour quel enregistre tous les champs de mes tables
tous marche sauf au moment d'enregistrer il me dit qu’access a attribué la valeur null a un champ a la suite de conversion type

j'ai également stocké la valeur retournée par ma fonction dans un text box invisible pour faciliter ma requête

voili voilou ! on dirait bien que je vais finir par y arriver


Shainaizz
Messages postés
940
Date d'inscription
jeudi 20 février 2003
Dernière intervention
3 février 2011
0
Merci
Toujours pas de réponse acceptée...
TBBUIM

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.