Как прокомментировал и опубликовал @Minty, ваши даты являются проблемой
- При выполнении запросов в графическом интерфейсе MS Access, например, с помощью Query Designer, вы получаете доступ к диалекту Access SQL.
- При подключении через ODBC-драйвер к внешней базе данных вы подчиняетесь диалекту SQL подключаемой базы данных, в данном случае Quickbooks.
Нет двух одинаковых диалектов SQL, но большинство пытается соответствовать стандартам ANSI. Следовательно, одни и те же запросы могут завершаться ошибкой между Query Designer и VBA.
MS Access
Даты доступа MS, если они отправлены буквально, должны быть заключены в хэштеги, #
:
INSERT INTO Invoice (CustomerRefListID, ARAccountRefListID, TxnDate, RefNumber,
BillAddressAddr1, BillAddressAddr2, BillAddressCity, BillAddressState,
BillAddressPostalCode, BillAddressCountry, IsPending, TermsRefListID,
DueDate, ShipDate, ItemSalesTaxRefListID, [Memo], IsToBePrinted,
CustomerSalesTaxCodeRefListID)
VALUES ('800001F6-1482536280', '8000001E-1478562986', #9/23/2020#, '1', 'Brad Lamb',
'1921 Appleseed Lane', 'Bayshore', 'CA', '94326', 'USA', 0, '80000002-1478562832',
#10/31/2020#, #10/01/2020#, '8000295C-1541711590',
'Memo Test', 0, '80000001-1478562826')
В качестве альтернативы используйте CDate()
для преобразования строки в дату:
INSERT INTO Invoice (CustomerRefListID, ARAccountRefListID, TxnDate, RefNumber,
BillAddressAddr1, BillAddressAddr2, BillAddressCity, BillAddressState,
BillAddressPostalCode, BillAddressCountry, IsPending, TermsRefListID,
DueDate, ShipDate, ItemSalesTaxRefListID, [Memo], IsToBePrinted,
CustomerSalesTaxCodeRefListID)
VALUES ('800001F6-1482536280', '8000001E-1478562986', CDate('9/23/2020'), '1', 'Brad Lamb',
'1921 Appleseed Lane', 'Bayshore', 'CA', '94326', 'USA', 0, '80000002-1478562832',
CDate('10/31/2020'), CDate('10/01/2020'), '8000295C-1541711590',
'Memo Test', 0, '80000001-1478562826')
Quickbooks ODBC
В Quickbooks вы должны придерживаться требования даты {d 'YYYY-MM-DD'}
или функциональной формы fncqbDate()
. Однако документация по этим методам редко встречается и может варьироваться в зависимости от версии драйвера ODBC.
sql = "INSERT INTO Invoice (CustomerRefListID, ARAccountRefListID, TxnDate, RefNumber, " _
& " BillAddressAddr1, BillAddressAddr2, BillAddressCity, " _
& " BillAddressState, BillAddressPostalCode, BillAddressCountry, " _
& " IsPending, TermsRefListID, DueDate, ShipDate, " _
& " ItemSalesTaxRefListID, [Memo], IsToBePrinted, " _
& " CustomerSalesTaxCodeRefListID) " _
& " VALUES ('800001F6-1482536280', '8000001E-1478562986', {d '2020-09-23'}, '1', " _
& " 'Brad Lamb', '1921 Appleseed Lane', 'Bayshore', 'CA', '94326', 'USA', 0, " _
& " '80000002-1478562832', {d '2020-10-31'}, {d '2020-10-01'}, " _
& " '8000295C-1541711590', 'Memo Test', 0, '80000001-1478562826')"
Параметрирование
С учетом вышесказанного, даже если вышеприведенное не работает, это еще одна веская причина для параметризации, отраслевой стандарт программирования для любого прикладного уровня, такого как VBA, для запуска SQL. Параметризация облегчает сопоставление типов данных между клиентом и сервером без необходимости заключать в кавычки или другие символические замыкания. ADO поддерживает параметры с помощью метода CreateParameter внутри объекта Command ADO (не для набора записей ADO).
' PREPARED STATEMENT WITH PLACEHOLDERS (NO LITERAL DATA)
sql = "INSERT INTO Invoice (CustomerRefListID, ARAccountRefListID, TxnDate, RefNumber, " _
& " BillAddressAddr1, BillAddressAddr2, BillAddressCity, " _
& " BillAddressState, BillAddressPostalCode, BillAddressCountry, " _
& " IsPending, TermsRefListID, DueDate, ShipDate, " _
& " ItemSalesTaxRefListID, [Memo], IsToBePrinted, " _
& " CustomerSalesTaxCodeRefListID) " _
& " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?," _
& " ?, ?, ?, ?, ?, ?, ?, ?, ?)"
' OPEN CONNECTION
Set oConnection = CreateObject("ADODB.Connection")
oConnection.Open sConnectString
' INITIALIZE AND RUN COMMAND
Set oCmd = CreateObject("ADODB.Command") ' NEW ADO OBJECT
With oCmd
.ActiveConnection = oConnection
.CommandText = sql
.CommandType = adCmdText
' BIND PARAMETERS
.Parameters.Append .CreateParameter("pm1", adVarChar, adParamInput, ,"800001F6-1482536280")
.Parameters.Append .CreateParameter("pm2", adVarChar, adParamInput, ,"8000001E-1478562986")
.Parameters.Append .CreateParameter("pm3", adDate, adParamInput, , CDate("9/23/2020"),
.Parameters.Append .CreateParameter("pm4", adVarChar, adParamInput, ,"1")
.Parameters.Append .CreateParameter("pm5", adVarChar, adParamInput, ,"Brad Lamb")
.Parameters.Append .CreateParameter("pm6", adVarChar, adParamInput, ,"1921 Appleseed Lane")
.Parameters.Append .CreateParameter("pm7", adVarChar, adParamInput, ,"Bayshore")
.Parameters.Append .CreateParameter("pm8", adVarChar, adParamInput, ,"CA")
.Parameters.Append .CreateParameter("pm9", adVarChar, adParamInput, ,"94326")
.Parameters.Append .CreateParameter("pm10", adVarChar, adParamInput, ,"USA")
.Parameters.Append .CreateParameter("pm11", adInteger, adParamInput, , 0)
.Parameters.Append .CreateParameter("pm12", adVarChar, adParamInput, ,"80000002-1478562832")
.Parameters.Append .CreateParameter("pm13", adDate, adParamInput, , CDate("10/31/2020"))
.Parameters.Append .CreateParameter("pm14", adDate, adParamInput, , CDate("10/01/2020"))
.Parameters.Append .CreateParameter("pm15", adVarChar, adParamInput, ,"8000295C-1541711590")
.Parameters.Append .CreateParameter("pm16", adVarChar, adParamInput, ,"Memo Test")
.Parameters.Append .CreateParameter("pm17", adInteger, adParamInput, ,0)
.Parameters.Append .CreateParameter("pm18", adVarChar, adParamInput, ,"80000001-1478562826")
' RUN PARAMETERIZED QUERY
.Execute
End With
oConnection.Close
Set oCmd = Nothing: Set oConnection = Nothing