probleme d'exécution

  • Auteur de la discussion darkspoilt
  • Date de début

darkspoilt

Expert
Bonjour tout le monde j'ai un probleme d'éxécution il me met trop peu de parametre 9 attendu mais je sais pas ou est le souci il me l'indique pas si quelqu'un peut m'aider je le remercie d'avacne
[cpp]
Private Sub Commande13_Click()
On Error GoTo Err_Commande13_Click

Set db = CurrentDb


Dim m As String
Dim a As String
Dim name As String

m = Me!mois
a = Me!année


DoCmd.Se
tWarnings False

'Affectation du lieu de récupération des fichiers

Dim NomDir As String

NomDir = "D:\Eric\dossier_projets\TDB\PJPF\"

'On atteint le répertoire concerné où se trouvent les fichiers

ChDir (NomDir)

Dim XL As Excel.Application
Dim nomClasseur1 As String


Set XL = CreateObject("Excel.Application")
nomClasseur1 = "PJPF2007-" & a & m & ".xls"

DoCmd.TransferSpreadsheet acImport, , "TableTest" & a & m, "D:\Eric\dossier_projets\TDB\PJPF\" & nomClasseur1, 0
name = "TableTest" & a & m

Dim dbCourante As DAO.Database

'Définir la base de travail comme la base actuelle
Set dbCourante = CurrentDb

'Définir la requête
Sql = " INSERT INTO TableTest ( année, OPPO, MPE, MPF, MRE, MRF, M__ ) SELECT '2005_T3', " & name & ".OPPO, " & name & ".MPE, " & name & ".MPF, " & name & ".MRE, " & name & ".MRF, " & name & ".M__ FROM " & name & " WHERE " & name & ".CBQD='total' And " & name & ".MOIS='total' And " & name & ".CMOP='total';"

'Exécuter la requête
dbCourante.Execute (Sql)

Set dbCourante = Nothing


Exit_Commande13_Click:
Exit Sub

Err_Commande13_Click:
MsgBox Err.Description
Resume Exit_Commande13_Click
End Sub
[/cpp]
 

zeb

Modérateur
Spa grave. Tu as corrigé et en plus sans tout réécrire, c'est bien.
 

zeb

Modérateur
/Hors sujet

Ligne 40, de ton code, tu as écrit quelque chose comme ça :
[fixed]
SELECT nom_de_table.champ1,
nom_de_table.champ2,
nom_de_table.champ3
FROM nom_de_table
WHERE nom_de_table.champN ...
[/fixed]

Beurk. (Même si ça marche)

S'il n'y a qu'une seule table, comme dans ton exemple, tu peux écrire directement comme ça :
[fixed]
SELECT champ1,
champ2,
champ3
FROM nom_de_table
WHERE champN ...
[/fixed]

Si tu as plusieurs tables, tu peux leurs donner un ptit nom cour :
[fixed]
SELECT T1.champ1,
T1.champ2,
T2.champ1
FROM nom_de_table1 T1,
nom_de_table2 T2
WHERE T1.champN ...
AND T2.champM ...
[/fixed]
Comme ça, si tu as du SQL dynamique, tu n'as qu'une seule fois à donner le vrai nom de la table. :sol:
 

zeb

Modérateur
Mets un point d'arrêt ligne [strike]49[/strike] 47.
EDIT: oups, au temps pour moi, merci de ta vigilence Freeman

Exécute pour voir si ça plante avant.

Cette syntaxe est erronée pour une procédure (Valable pour une fonction) :
[fixed]dbCourante.Execute (Sql)[/fixed]
Tu dois écrire :
[fixed]dbCourante.Execute Sql[/fixed]
 

Freeman23

Expert
Je viens y mettre mon grain de sel.

Ce message d'erreur provient de ta requête à coup sur c'est un message typique quand il ne reconnait pas un champs ou un paramètre. Donc vérifie tous les champs.

- Met année entre crochet [année] : les accents sont à banir dans les noms de champs...
- J'ai un sale doute sur le champs M__ à mettre entre crochet au cas où...
- Supprime les name inutile comme l'a dit zeb.

Et si avec ca tu bloques toujours met un pointeur d'arrêt sur la ligne 47, et dans la fenêtre d'execution récupère la valeur de ta variable sql (code sql formatée), tu créé une nouvelle requête en mode sql, tu colles ta requête, et tu teste l'execution, il devrait te donner plus de détail sur ton erreur.
 

darkspoilt

Expert
J'ai retiré les parenthèses et c'etait un porbleme de champs il en manquait un mais meme en utilisant une requête qui fonctionne car elle généré par Access il me met une erreur impossible de d'éxécuter une requête de selection et le point d'arret est mon dbCourant.execute Sql

[cpp]Sql = " SELECT PJPF2006_T3.OPPO, PJPF2006_T3.MPE, PJPF2006_T3.MPF, PJPF2006_T3.MRE, PJPF2006_T3.MRF, PJPF2006_T3.M__, '2006_T3' AS année FROM PJPF2006_T3 WHERE (((PJPF2006_T3.CBQD)='total') AND ((PJPF2006_T3.MOIS)='total') AND ((PJPF2006_T3.CMOP)='total'));"[/cpp]
 

zeb

Modérateur
Tu n'écoutes rien !!!

Freeman et moi te proposions de mettre entre crochet les noms de champs bizarres et de virer les noms de tables inutiles devant les champs.

Bon, en plus, vire toutes ces parenthèses inutiles, ça te permettra de bien comprendre ce que tu fais.



Bon, à part ça, il faut que tu fasses la différence entre les différentes commandes SQL. ExecuteSQL prend en compte les commandes DDL, DML et DCL, mais pas les commandes DQL.

Si tu veux faire un "INSERT INTO... " (commande DML), tu peux utiliser ExecuteSQL.

Si tu veux faire un "SELECT..." (commande DQL), il faut utiliser un RecordSet par exemple.
 

darkspoilt

Expert
oki merci et comment je peut recuperer le resultat de mon recordset??
 

zeb

Modérateur
:ouch: M'enfin... C'est à toi de voir.
Un RecordSet, ce n'est qu'un objet qui contient un curseur sur une requête. cf. CurrentDB.OpenRecordSet.


Bon j'ai relu ton code, et je m'aperçois que nous avons affaire à un grand débutant :D
Ce n'est pas grave, nous sommes tous passés par là :)

Alors voilà ton code réécrit :
[cpp]
Option Explicit

Private Sub Commande13_Click()
On Error GoTo Err_Commande13_Click

Dim m As String
Dim a As String
Dim nomTable As String
Dim nomClasseur As String
Dim SQL As String

m = Me!mois
a = Me!année

DoCmd.SetWarnings False

nomClasseur = "D:\Eric\dossier_projets\TDB\PJPF\PJPF2007-" & a & m & ".xls"
nomTable = "TableTest" & a & m

DoCmd.TransferSpreadsheet acImport, , nomTable, nomClasseur, 0

'Définir la requête
SQL = " INSERT " & _
" INTO TableTest ( " & _
" [année], " & _
" OPPO, " & _
" MPE, " & _
" MPF, " & _
" MRE, " & _
" MRF, " & _
" [M__] ) " & _
" SELECT '2005_T3', " & _
" OPPO, " & _
" MPE, " & _
" MPF, " & _
" MRE, " & _
" MRF, " & _
" M__ " & _
" FROM " & nomTable & _
" WHERE CBQD='total' " & _
" AND MOIS='total' " & _
" AND CMOP='total' ;"
'Exécuter la requête
CurrentDb.Execute SQL

Exit_Commande13_Click:
Exit Sub
Err_Commande13_Click:
MsgBox Err.Description
Resume Exit_Commande13_Click
End Sub[/cpp]

Pourquoi est-ce beaucoup mieux ?

Parce que sans l'option Option Explicit, je ne mérite même pas que quelqu'un lise mon code :o
[ Avant de penser que je suis le pire des c0nn@rds avec mes leçons, va lire la doc sur Option Explicit, tu comprendras pourquoi il ne faut pas l'oublier et tu finiras d'accord avec moi ;) ]

Les variables sont déclarées au début. C'est bien plus clair.
name devient nomTable. Ah bah tu appelles bien ton classeur nomClasseur. Restons logique [:spamafote]

[fixed]DoCmd.Se
tWarnings False[/fixed]devient[fixed]DoCmd.SetWarnings False[/fixed]:whistle: ... en fait je me doute bien qu'il s'agit d'une coquille ;)
Par contre, à ta place, je ne mettrais pas ce genre de commandes tant que le code est en cours de test :o

[fixed]ChDir (NomDir)[/fixed]que tu aurais du écrire [fixed]ChDir NomDir[/fixed] disparaît, c'est inutile.
La création de l'instance Excel disparaît pour le même motif.

Tant qu'à faire de créer des variables, je les utilise.

Il est parfois utile, voire intelligent de remplacer un objet par une variable. Mais Set dbCourante = CurrentDB, là tu exagères ! On utilisera CurrentDB.

Je présente la requête bien aérée, bien détachée du reste du code. C'est SUPER IMPORTANT.
Euh, surtout pour un débutant. Quand tu seras devenu un gourou ès SQL, on en reparlera ;)

Bon alors maintenant un tout petit détail. Quelle est structure de la table TableTest ?
J'espère qu'elle n'a que les champs citées dans ton code :o
 

Senvisage

Habitué
Zeb... t'as bouffé du lion ce matin ? ^^;
A la place du bonhomme je répondrais même pas, je me sauverais en courant mdr
Mais faut pas t'inquiéter darkspoilt : notre Zeb national ne mord pas (souvent), même s'il grogne sur tout le monde dès qu'un bout de code le taquine ;)
 

zeb

Modérateur
Ce matin ? :heink: J'ai posté ça hier soir à 7h et demi.
Pis au ptit déj, c'est un n00b ou deux que je dévore tout cru.

darkspoilt, te sauve pas !!! On peut vraiment t'aider. Si si.
 

darkspoilt

Expert
Je le prends pas mal du tout j'avoue que je suis un grand débutant je me met au VBA que depuis deux semaines donc je le prends pas mal du tout sinon Option Explicit était mis mais je pensais qu'il était pas necessaire de l'inclure dans le code a envoyer. et pour les variable c'est vrai mais je fait tout le netoyage a la fin. (je sais c pas bien)
Sinon en fait TableTest a des champs défini et la table que j'importe contient trop de champs donc je la filtre en ajoutant une colonne année présente dans TableTest pour coller le résultat directement dans table test d'ou ma nouvelle commande SQL qui fonctionne lorsque je met tout en fixe.

J'avais un autre code qui fonctionne mais celui de Zeb est énormément plus propre et épuré je dois l'avouer
Sinon la j'ai une erreur dans ma classe FROM je ne vois pas pourquoi si quelqu'un peut m'aider je le remercie d'avance

[cpp]

Private Sub Commande13_Click()
On Error GoTo Err_Commande13_Click

Dim m As String
Dim a As String
Dim nomTable As String
Dim nomClasseur As String
Dim SQL As String
Dim d As String

m = Me!mois
a = Me!année
d = a & m

DoCmd.SetWarnings False

nomClasseur = "D:\Eric\dossier_projets\TDB\PJPF\PJPF2007-" & a & m & ".xls"
nomTable = "TableTest" & a & m

DoCmd.TransferSpreadsheet acImport, , nomTable, nomClasseur, 0

'Définir la requête

SQL = "INSERT INTO Test ( OPPO, MPE, MPF, MRE, MRF, M__, année) " & _
"SELECT OPPO, MPE, MPF, MRE, MRF, M__, " & d & " AS année " & _
"FROM" & name & _
"WHERE CBQD=""total"" AND MOIS=""total"" AND CMOP=""total"";"

'Exécuter la requête
CurrentDb.Execute SQL

Exit_Commande13_Click:
Exit Sub
Err_Commande13_Click:
MsgBox Err.Description
Resume Exit_Commande13_Click
End Sub

[/cpp]
 

zeb

Modérateur
nouvelle commande SQL qui fonctionne lorsque je met tout en fixe Mais dès que je met une variable il ne reconnait plus rien

Tu peux nous montrer la requête qui marche et celle qui ne marche pas. (Juste ce bout là, pas la peine de tout recopier ;) )
 

darkspoilt

Expert
Voila le code qui fonctionne

[cpp]
SQL = "INSERT INTO Test ( OPPO, MPE, MPF, MRE, MRF, M__, année) " & _
"SELECT OPPO, MPE, MPF, MRE, MRF, M__, ""2006_T3"" AS année " & _
"FROM PJPF2006_T3 " & _
"WHERE CBQD=""total"" AND MOIS=""total"" AND CMOP=""total"";"
[/cpp]

Et voila celui qui fonctionne pas j'y ai mis des variables

[cpp]
d="2006_T3"
nomTable = "PJPF2006_T3"

SQL = "INSERT INTO Test ( OPPO, MPE, MPF, MRE, MRF, M__, année) " & _
"SELECT OPPO, MPE, MPF, MRE, MRF, M__, " & d & " AS année " & _
"FROM " & nomTable & _
" WHERE CBQD=""total"" AND MOIS=""total"" AND CMOP=""total"";"
[/cpp]
 

Freeman23

Expert
Lol Edit suffisait d'attendre...

Code:
SQL = "INSERT INTO Test ( OPPO, MPE, MPF, MRE, MRF, M__, année) " & _
    "SELECT OPPO, MPE, MPF, MRE, MRF, M__, " & d & " AS année " & _
    "FROM" & name & _
    "WHERE CBQD=""total"" AND MOIS=""total"" AND CMOP=""total"";"
Comme je l'ai dit avant les accents sont à banir tout comme les espaces donc des crochets autour du champs.

Il faut faire attention au espace entre les lignes et les variables ici tu auras un truc du genre "FROMtabletestWHERE", donc une belle erreur à la clé.

Après les conditions : "WHERE CBQD=""total"" ceci marche, mais je dirai qu'utiliser ici c'est inutile car tu n'auras jamais d'apostrophe dans ta constante total. A remplacer par des simples cotes.

[cpp]"WHERE CBQD='total' AND CMOP='total';"[/cpp]

Ensuite mettre une valeur fixe dans une requête type chaîne de caractère n'est pas si simple que ca ;) Vu que tu sembles savoir que "" est équivalent à une ' dans Access, je te passe la solution dessous

Code:
SQL = "INSERT INTO Test ( OPPO, MPE, MPF, MRE, MRF, M__, [année]) " & _
    "SELECT OPPO, MPE, MPF, MRE, MRF, M__, """ & d & """ AS [année] " & _
    "FROM " & nomTable & _
    " WHERE CBQD='total' AND MOIS='total' AND CMOP='total';"

Puis comme je l'ai écrit précédemment il suffit de récupérer la valeur de SQL (?SQL) dans la fenêtre d'execution (Ctrl+G), de créer une requête avec pour souvent trouver la solution.
 

darkspoilt

Expert
Merci beaucoup ca m'a beaucoup avancé mais le je rencontre un autre souci
ma table créer n'a pas les nom de champs voulu et je voudrais savoir quel est la méthode pour que les noms des champs de la table importée soient la premiere ligne de mon tableau excel
 

zeb

Modérateur
[strike]Je repose la question : Quelle est la structure de la table Test ?

Tips: Par principe, ne pas utiliser d'accent ou de caractères spéciaux dans les variables, les noms de champs, les noms de tables, les URLs, etc.
(Tu ne veux pas appeler ton champ "an" plutôt que "année" pour faire plaisir à Freeman et à moi :( )[/strike]
Réponse à la question de darkspoilt avant edit :sarcastic:
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 135
Messages
6 718 109
Membres
1 586 397
Dernier membre
Chachabidou
Partager cette page
Haut