2009-09-19 8 views
0

Je ne vois pas pourquoi cette requête ne fonctionne pas. J'utilise un msgbox pour afficher mon strSQL, mais cela me semble parfait.Est-ce que j'ai une erreur dans ce SQL créé en utilisant vba?

Dim strSQL As String 
strSQL = "INSERT INTO Jobs (Date, RefNo, ProjectID, PManager, PDesc, PONo, Src_Qty, WC_Qty, Rate, Total, Note, Company) " 
strSQL = strSQL & "VALUES (" & JobDate.Value & ", '" _ 
          & Text41.Value & "', '" _ 
          & ProjectID.Value & "', '" _ 
          & PManager.Value & "', '" _ 
          & PDesc.Value & "', " _ 
          & Text43.Value & ", " _ 
          & Src_Qty.Value & ", " _ 
          & WC_Qty.Value & ", " _ 
          & newRate.Value & ", " _ 
          & ProjTotal.Value & ", '" _ 
          & Text38.Value & "', '" _ 
          & newCompany.Value _ 
          & "');" 
MsgBox (strSQL) 
DoCmd.RunSQL strSQL 
+4

Un message d'erreur? – MartW

+2

Comme une note de côté @ aZn137. Vous avez posé plusieurs questions sans sélectionner l'un d'entre eux pour avoir une réponse correcte. Vous voudrez peut-être revenir à vos questions et sélectionner les bonnes réponses. Je suis certain que certains d'entre eux ont répondu à vos questions. Juste essayer de promouvoir les bonnes pratiques. :) – klabranche

+0

oh merde, j'ai totalement oublié de le faire. merci de me le rappeler. –

Répondre

3

Ajouter une ligne:

Debug.Print strSQL 

après

MsgBox (strSQL) 

Aller à la Fenêtre Immédiate (Ctrl + g) et copiez l'instruction SQL terminée. Ensuite, créez une nouvelle requête, basculez en vue SQL et collez-la dans l'instruction SQL. Déterminez pourquoi l'instruction échoue. Je pense que klabranche est sur l'argent si le champ "Date" de votre table Jobs est un type de données Date/Heure. Si vous ne parvenez pas à identifier le problème, modifiez votre question pour afficher l'instruction SQL défaillante et indiquez-nous les types de données des champs Jobs.

En outre, votre tableau des tâches comprend 3 champs dont les noms sont des mots réservés: Date; Taux; et note. (Voir http://allenbrowne.com/AppIssueBadWord.html) Si vous gardez les noms de champs, au moins les entourer de crochets pour éviter la confusion Accès:

strSQL = "INSERT INTO Jobs ([Date], RefNo, ... 
+0

+1 Bonne prise les mots réservés HansUp – klabranche

+0

oh wow, youre a genius. qui l'a résolu. Je vous remercie! –

7

Si je me souviens bien, vous devrez envelopper votre date avec la livre pour l'accès.

"VALUES (#" & JobDate.Value & "#, '" _ 

Et je ne pense pas qu'il faille le point-virgule à la fin ....

+2

+1 pour la solution la plus probable sans aucun message d'erreur ou plus clair OP –

+0

Je suis d'accord avec Jonathan. :) – klabranche

+0

Ce lien semble confirmer votre souvenir: http://bytes.com/topic/access/insights/575420-literal-datetimes-their-delimiters –

2

En plus d'utiliser # délimiteurs autour de la date mentionnée par klabranche vous devez également utiliser une date non ambiguë format. Utilisez la norme ISO aaaa-mm-jj en utilisant le format (Jobdate, "aaaa-mm-jj") ou Return Dates in US #mm/dd/yyyy# format

Vérifiez que vous utilisez des guillemets autour des champs de test et pas de guillemets autour des champs numériques. ProjectID peut être numérique ou peut-être du texte. Je voudrais renommer les champs text43 et test48 sur le formulaire pour être plus clair quant à ce qu'ils sont. En supposant que c'est une forme liée, vous pouvez les définir au même nom que le champ.

Vous n'avez pas besoin d'utiliser la propriété .Value.

Le problème avec DoCmd.RunSQL est qu'il ignore les erreurs. L'un des éléments suivants affichera les messages d'erreur reçus par la requête. Si vous utilisez DAO, utilisez Currentdb.Execute strSQL, dbfailonerror. Pour ADO, utilisez CurrentProject.Connection.Execute strCommand, lngRecordsAffected, adCmdText Vous pouvez ensuite supprimer les lignes docmd.setwarnings, le cas échéant. Si vous utilisez docmd.setwarnings, assurez-vous de bien placer l'instruction True dans un code de gestion d'erreurs. Sinon, des choses étranges peuvent survenir plus tard, surtout lorsque vous travaillez sur l'application. Par exemple, vous ne recevrez plus le message "Voulez-vous enregistrer vos modifications" si vous fermez un objet. Cela peut signifier que des modifications, des suppressions ou des ajouts indésirables seront enregistrés dans votre MDB.

Les performances peuvent également être significativement différentes entre les deux méthodes. Une publication indiquait que currentdb.execute prenait deux secondes alors que docmd.runsql prenait huit secondes. Comme toujours YMMV.

HansUp a un excellent point sur l'utilisation de noms de champs réservés.Visiter Tony's Table and Field Naming Conventions

0

Je suis d'accord avec klabranche que le coupable le plus probable est que vous devez mettre des marques de hachage ("#") autour de la valeur de la date. Cependant, comme un addendum à cette pensée, si vous utilisez CurrentDb.Execute au lieu de DoCmd.RunSQL vous recevrez un message d'erreur informatif ce qui vous dira que c'est faux. Cela facilitera le débogage beaucoup. J'espère que cela pourra aider!

0

après avoir changé mon nom de domaine, c'est ce que mon strSQL dit:

INSERT INTO Emploi (JobDate, RefNo, ProjectID, PManager, PDESC, Pono, Src_Qty, WC_Qty, JobRate, JobTotal, note, Société) VALUES (# 2009-09-20 #, '1', '3', 'Jean Jou', '4', 2, 5, 6, 7, 42, '9', 'Magnus')

J'ai vérifié mes champs de texte plusieurs fois, ils sont corrects.

iam obtenir "Erreur d'exécution: 3134, erreur de syntaxe dans INSERT INTO", quel que soit Do.Cmd ou CurrentDb.Execute

Les merci les gars.

+0

Les champs de type de données texte RefNo et ProjectID sont-ils? L'un des champs est-il un type de données de numérotation automatique? – HansUp

+0

Suivi des commentaires HansUp. Vérifiez bien que tous les champs avec des guillemets sur les valeurs sont en effet des champs de texte dans la table et que les valeurs numériques sont en effet des champs numériques dans la table. –

Questions connexes