У меня есть ошибка в этом SQL создан с использованием VBA? - PullRequest
0 голосов
/ 19 сентября 2009

Я не могу понять, почему этот запрос не работает. Я использую msgbox, чтобы отобразить мой strSQL, но мне он выглядит прекрасно.

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

Ответы [ 5 ]

7 голосов
/ 19 сентября 2009

Если я правильно помню, вам нужно свернуть дату с фунтом за доступ.

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

И я не думаю, что вам нужна точка с запятой в конце ....

3 голосов
/ 19 сентября 2009

Добавить строку:

Debug.Print strSQL

после

MsgBox (strSQL)

Перейдите в окно немедленных действий (Ctrl + g) и скопируйте завершенный оператор SQL. Затем создайте новый запрос, переключитесь в представление SQL и вставьте оператор SQL. Выясните, почему утверждение не удается. Я думаю, что klabranche стоит денег, если в поле «Дата» в вашей таблице заданий указан тип данных «Дата / Время». Если вы не можете определить проблему, отредактируйте свой вопрос, чтобы отобразить ошибочный оператор SQL, и сообщите нам типы данных полей Jobs.

Кроме того, ваша таблица заданий включает 3 поля, имена которых являются зарезервированными словами: Дата; Темп; и Примечание. (См. http://allenbrowne.com/AppIssueBadWord.html) Если вы сохраняете эти имена полей, по крайней мере заключите их в квадратные скобки, чтобы избежать путаницы. Access:

strSQL = "INSERT INTO Jobs ([Date], RefNo, ...
2 голосов
/ 19 сентября 2009

В дополнение к использованию # delimeters вокруг даты, как упомянуто klabranche, вы также должны использовать однозначный формат даты. Либо используйте стандарт ISO гггг-мм-дд, используя формат (Jobdate, "гггг-мм-дд"), либо см. Даты возврата в формате США # мм / дд / гггг #

Дважды проверьте, что вы используете кавычки вокруг тестовых полей и нет кавычек вокруг числовых полей. ProjectID может быть числовым или текстовым.

Я бы переименовал поля text43 и test48 в форме, чтобы было яснее, что они собой представляют. Предполагая, что это связанная форма, вы можете присвоить им то же имя, что и поле.

Вам не нужно использовать свойство .Value.

Проблема с DoCmd.RunSQL заключается в том, что он игнорирует любые ошибки. Любое из следующего покажет любые сообщения об ошибках, полученные запросом. При использовании DAO используйте Currentdb.Execute strSQL, dbfailonerror. Для ADO используйте CurrentProject.Connection.Execute strCommand, lngRecordsActed, adCmdText. Затем можно удалить строки docmd.setwarnings, если они есть.

Если вы собираетесь использовать docmd.setwarnings, убедитесь, что вы добавили выражение True также в любой код обработки ошибок. В противном случае странные вещи могут произойти позже, особенно когда вы работаете над приложением. Например, вы больше не будете получать сообщение «Вы хотите сохранить свои изменения», если закроете объект. Это может означать, что нежелательные изменения, удаления или добавления будут сохранены на вашем MDB.

Кроме того, производительность может существенно отличаться между двумя методами. В одной публикации сообщалось, что currentdb.execute занял две секунды, а docmd.runsql - восемь секунд. Как всегда YMMV.

У HansUp есть отличная точка зрения на использование зарезервированных имен полей. Посетите Соглашения Тони о таблицах и именах полей

0 голосов
/ 20 сентября 2009

после изменения имени моего поля, вот что говорит мой strSQL:

INSERT INTO Jobs (JobDate, RefNo, ProjectID, PManager, PDesc, PONo, Src_Qty, WC_Qty, JobRate, JobTotal, Note, Company) ЗНАЧЕНИЯ (# 2009-09-20 #, '1', '3', ' Жан Жу ',' 4 ', 2, 5, 6, 7, 42,' 9 ',' Магнус ')

Я проверял свои текстовые поля несколько раз, они правильные.

iam получает «Ошибка времени выполнения: 3134, синтаксическая ошибка в операторе INSERT INTO», независимо от Do.Cmd или CurrentDb.Execute

спасибо, ребята.

0 голосов
/ 19 сентября 2009

Я согласен с klabranche в том, что наиболее вероятным виновником является то, что вам нужно поставить хеш-метки ("#") вокруг значения даты. Однако в качестве дополнения к этой мысли, если вы используете CurrentDb.Execute вместо DoCmd.RunSQL, вам будет выдано информативное сообщение об ошибке, которое скажет вам, что это неправильно. Это сделает отладку намного проще. Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...