Se connecter avec
S'enregistrer | Connectez-vous

execution de requete

Dernière réponse : dans Programmation
Lassé par la pub ? Créez un compte

Personnellement, j'aime bien travailler avec des procédures stockées. J'entends par là que tu enregistres tes requêtes dans ta base de données Access, avec des paramètres, ...

Tu peux ensuite appeler ces requêtes depuis VB en lui donnant des noms de procédures et des paramètres. Concernant les chaînes de connexion aux bases de données, je te conseille ce site --> http://www.connectionstrings.com/.

Je n'ai pas d'URL avec des tutos sur les procédures stockées sous la main, mais tu dois pouvoir trouver ceci avec Google.

Cependant, ce principe a un avantage. Tu peux déplacer où tu veux ta base de données, changer de langage de programmation, tu n'auras jamais besoin de re-écrire tes requêtes car elles suivent la BD.

Bonne journée ;) 

En VB Access, pour exécuter une requête action :
docmd.runsql ma_requete (ma_requete est une variable string contenant la requête)

Si c'est une requête sélection, tu l'ouvre comme une table :
set Resultats_de_la_requete = MaBaseDeDonnees.openrecordset(ma_requete)

une requete parametrée est considérée comme une requete action ou une requete selection? car j'ai ecris ca :

Dim toto As Recordset
Dim sauvegarde As Database
Dim titi As TableDef


Set toto = sauvegarde.OpenRecordset(requete)
Set toto = titi.OpenRecordset() ^
|
mon erreur est la il me dit que
la variable objet est non defini.

C'est normal : tu as bien déclaré que Sauvegarde est de type DataBase, mais tu ne lui a rien affecté.

RecordSet : tu accède àla liste de tes données.
TableDef : tu accède à la structure de ta table (liste des champs, que tu peux modifier), pas aux données. Tu est à l'étage au dessus.
Il y en a encore des étages au dessus (liste des table, pour commencer, liste des relations, ...), mais ça fini par devenir costaud (containers).


Que ta requête soit paramatrée ou pas :

Requêtes action (RunSql) :
UPDATE ...
INSERT ...
DELETE ...
SELECT ... INTO

Requêtes sélection (OpenRecordset):
SELECT ...
TRANSFORM ...


Donc :

Dim toto As Recordset
Dim sauvegarde As Database
Dim Requete as String

Requete = "SELECT PremierChamp, ........."
Set Sauvegarde = CurrentDb '(c'est le plus simple, il existe aussi Openxxx)
Set toto = sauvegarde.OpenRecordset(Requete)

' Après, toto est pour toi comme une table
toto.movefirst
LaPremiereValeurDuPremierChamp = toto![PremierChamp]

:-)

ok merci mais il une aitre erreur apres:
le compilateur me dit qu'il manque des parametres (normal c'est une requete parametrée et j'ai pas saisi de parametre) ca c'est resolu en créant un Querydef

mais avec ce querydef il y a une erreur (la meme qu'avant :pt1cable:  ) c'est a dire variabla objet non defini.

Voila le code:

Dim toto As Recordset
Dim Sauvegarde As Database
Dim essai As QueryDef
Dim titi As QueryDef


Set Sauvegarde = CurrentDB()
Set essai = Sauvegarde.CreateQueryDef(titi(requete))
Set toto = Sauvegarde.OpenRecordset(requete)


Set essai = sauvegarde.CreateQueryDef (name, sqltext)

En plus, tu utilise titi sans l'avoir défini et titi(requete) n'a pas de sens pour un queryDef.

Après, tu fais
set toto=essai.openrecordset

Avec
Set toto = Sauvegarde.OpenRecordset(sqltxt)
tu n'a pas besoin de querydef.

Sub fichier_Click ()


Dim num As Integer
Dim requete As String
Dim toto As Recordset
Dim sauvegarde As Database
Dim essai As QueryDef

num = FreeFile
Open "stage.txt" For Output As num

requete = ""

requete = requete & "SELECT [INC_N°], AGENCE.AGE_CODE, Projet1_code, Projet2_code, INTERVENANTS.INT_CODE,[INC_COUT_ESTIME]-[INC_COUT_FACTURE] AS [Montant TTC]"
requete = requete & " FROM AGENCE, INTERVENANTS, INCIDENTS, projet1, projet2"
requete = requete & " WHERE AGENCE.AGE_CODE=INCIDENTS.AGE_CODE"
requete = requete & " AND INCIDENTS.INT_CODE=INTERVENANTS.INT_CODE"
requete = requete & " AND INCIDENTS.PROJET1_CODEALTI=PROJET1.PROJET1_CODEALTI"
requete = requete & " AND INCIDENTS.PROJET2_CODEALTI=PROJET2.PROJET2_CODEALTI"
requete = requete & " AND [INC_DAT/H] Between [entrer la date de debut] And [entrer la date de fin];"


Set sauvegarde = CurrentDB()
Set essai = sauvegarde.CreateQueryDef(e, requete)


Set toto = essai.OpenRecordset()


toto.MoveFirst

While toto.eof
Print #num, requete
toto.MoveNext
Wend

Close num

End Sub


voila le code

Je n'ai pas eu le même message d'erreur.

Set essai = sauvegarde.CreateQueryDef(e, requete) : e n'est pas défini
->"e" ou variable.

A la seconde exécution du code, tu as une injure "e existe déjà". Il faut donc le détruire si il existe.

While = tant que. Ca ne peut que se planter.
While Not toto.EOF

Print #num, requete : encore une fois, tu auras autant de texte de ta requête que d'enregistrements retournés :
Print #num, toto![INC_N°], toto![AGENCE.AGE_CODE], toto![Projet1_code], toto![Projet2_code], toto![INTERVENANTS.INT_CODE], toto![Montant TTC]

:-)

[edit] : voir MP.

J'ai récupéré un PC qui n'a que la run-time d'Access, je n'accède pas aux objets et encore moins au code. En attendant d'arranger ça, regarde dans l'onglet Requetes de ta base : tu devrais y trouver "e" ou "var". Exécutes-les pour vérifier ce qu'elles renvoient.

J'ai modifié le code, la requete n'est plus complétement une requete parametrée et le probleme c'est que la reuete ne s'execute pas.

Le nouveau code :
Sub fichier_Click ()

Dim num As Integer
Dim requete As String
Dim toto As Recordset
Dim sauvegarde As Database
Dim essai As QueryDef
Dim debperiode As Variant
Dim finperiode As Variant

num = FreeFile
Open "stage.txt" For Output As num

debperiode = InputBox("veuillez saisir la date de debut de periode")
finperiode = InputBox("veuillez saisir la date de fin de la periode")

requete = ""

requete = requete & "SELECT [INC_N°], AGENCE.AGE_CODE, Projet1_code, Projet2_code, INTERVENANTS.INT_CODE,[INC_COUT_ESTIME]-[INC_COUT_FACTURE] AS [Montant TTC]"
requete = requete & " FROM AGENCE, INTERVENANTS, INCIDENTS, projet1, projet2"
requete = requete & " WHERE AGENCE.AGE_CODE=INCIDENTS.AGE_CODE"
requete = requete & " AND INCIDENTS.INT_CODE=INTERVENANTS.INT_CODE"
requete = requete & " AND INCIDENTS.PROJET1_CODEALTI=PROJET1.PROJET1_CODEALTI"
requete = requete & " AND INCIDENTS.PROJET2_CODEALTI=PROJET2.PROJET2_CODEALTI"
requete = requete & " AND [INC_DAT/H] >=" & debperiode
requete = requete & " And [INC_DAT/H] <=" & finperiode

Set sauvegarde = CurrentDB()

Set toto = sauvegarde.OpenRecordset(requete)

toto.MoveFirst

While Not toto.eof
Print #num, toto![INC_N°], toto![AGENCE.AGE_CODE], toto![Projet1_code], toto![Projet2_code], toto![INTERVENANTS.INT_CODE], toto![Montant TTC]
toto.MoveNext
Wend

Close num

End Sub


PS : la base fait 46 Mo donc je vais essayer de te l'envoyer.

46 Mo : gag classique d'Access, je n'ai pas pensé à te le dire.

Note la taille de ton fichier

1. Tu fais outils/utilitaires/compacter
Cela fera un nettoyage. Access est pire que Windows, il laisse des trous partout ET ne les réutilise pas.

Tu verra que la taille a bien diminuée.

2. Tu la Zippe.
Les données d'Access sont en format brut, aucune optimisation.

Et il te restera une petite crotte de fichier de rien du tout !!

Bonjour, enstage

A mon avis, le problème se situe au niveau de l'introduction des dates dans ta requête.
Pour utiliser des dates dans une requête SQL, il faut les entourer de dièses (#) et les mettre au format de date US (mm/jj/aaaa). En outre, une InputBox renvoie un élément de type String qu'il faut d'abord convertir en date.
Donc, à la place de :
requete = requete & " AND [INC_DAT/H] >=" & debperiode
requete = requete & " And [INC_DAT/H] <=" & finperiode
, je te propose :
requete = requete & " AND [INC_DAT/H] >=#" & Format(CDate(debperiode),"mm/dd/yyyy")
requete = requete & "# And [INC_DAT/H] <=#" & Format(CDate(finperiode),"mm/dd/yyyy")

Est-ce que c'est mieux ?

Merci de ton aide mais j'ai trouver l'erreur hier et effectivement le probleme était que je n'avais pas mis entre diese(#) les dates et il n'y a pas besoin de les mettre en format americain.
Probleme resolu et merci encore. ++

Bonjour, enstage
Ma remarque concernant le format américain est tout à fait justifiée, crois-moi ! ;) 
Si les dates que tu utilises ne prêtent pas à confusion, tu peux effectivement utiliser le format que tu veux, Access et SQL sauront se débrouiller. Par contre, si tu as une date du style 5 mars 2007, #05/03/2007# sera interprété par SQL comme étant le 3 mai.
Fais un test : crée une requête contenant une date en utilisant l'interface graphique et affiche ensuite le code SQL (menu Affichage \ Mode SQL), tu verras que le mois et le jour sont inversés.
Bonne continuation
Lassé par la pub ? Créez un compte
Tom's guide dans le monde