shainaizz
Messages postés15Date d'inscriptionlundi 6 juin 2005StatutMembreDernière intervention30 juin 2005
-
29 juin 2005 à 10:08
tbbuim1
Messages postés940Date d'inscriptionjeudi 20 février 2003StatutMembreDerniè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 nutilisait vba
voila merci
Shainaizz
A voir également:
Vba sql
Requête sql vba excel - Meilleures réponses
Exécuter une requête sql en vba access - Meilleures réponses
tbbuim1
Messages postés940Date d'inscriptionjeudi 20 février 2003StatutMembreDernière intervention 3 février 20119 29 juin 2005 à 17:13
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
tbbuim1
Messages postés940Date d'inscriptionjeudi 20 février 2003StatutMembreDernière intervention 3 février 20119 29 juin 2005 à 11:29
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
omsylv
Messages postés69Date d'inscriptionlundi 3 janvier 2005StatutMembreDernière intervention15 septembre 2005 29 juin 2005 à 11:39
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
tbbuim1
Messages postés940Date d'inscriptionjeudi 20 février 2003StatutMembreDernière intervention 3 février 20119 29 juin 2005 à 14:33
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
shainaizz
Messages postés15Date d'inscriptionlundi 6 juin 2005StatutMembreDernière intervention30 juin 2005 29 juin 2005 à 14:56
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
shainaizz
Messages postés15Date d'inscriptionlundi 6 juin 2005StatutMembreDernière intervention30 juin 2005 29 juin 2005 à 15:11
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
tbbuim1
Messages postés940Date d'inscriptionjeudi 20 février 2003StatutMembreDernière intervention 3 février 20119 29 juin 2005 à 15:13
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
shainaizz
Messages postés15Date d'inscriptionlundi 6 juin 2005StatutMembreDernière intervention30 juin 2005 30 juin 2005 à 10:51
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
tbbuim1
Messages postés940Date d'inscriptionjeudi 20 février 2003StatutMembreDernière intervention 3 février 20119 30 juin 2005 à 11:09
_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.
shainaizz
Messages postés15Date d'inscriptionlundi 6 juin 2005StatutMembreDernière intervention30 juin 2005 30 juin 2005 à 11:25
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és15Date d'inscriptionlundi 6 juin 2005StatutMembreDernière intervention30 juin 2005 30 juin 2005 à 14:22
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 quaccess 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