Почему этот SQL-запрос работает в конструкторе запросов, а не в VBA для Access?

Суть всех ответов здесь в том, что они используют имена статических полей, поэтому я написал скорректированную версию в стиле ООП. Предположим, вы используете методы getter, которые вы можете использовать непосредственно в этом классе и использовать имя поля в качестве параметра. Возможно, кто-то сочтет это полезным.

class CustomSort{

    public $field = '';

    public function cmp($a, $b)
    {
        /**
         * field for order is in a class variable $field
         * using getter function with naming convention getVariable() we set first letter to uppercase
         * we use variable variable names - $a->{'varName'} would directly access a field
         */
        return strcmp($a->{'get'.ucfirst($this->field)}(), $b->{'get'.ucfirst($this->field)}());
    }

    public function sortObjectArrayByField($array, $field)
    {
        $this->field = $field;
        usort($array, array("Your\Namespace\CustomSort", "cmp"));;
        return $array;
    }
} 
0
задан 16 January 2019 в 15:42
поделиться

3 ответа

Если это приложение Access, я бы рекомендовал вместо того, чтобы переписать запрос в код sql / vba, вместо этого использовать другой подход: оставить рабочий запрос как объект запроса и вместо этого использовать vba для его запуска:

[ 110]

Это имеет то преимущество, что этот объект запроса существует в навигационной панели, так что вы можете запустить его вручную для тестирования - без необходимости запуска какой-либо vba. Это гораздо более простая стратегия отладки.

0
ответ дан Parfait 16 January 2019 в 15:42
поделиться

Прочитайте здесь https://support.flexquarters.com/esupport/index.php?/Knowledgebase/Article/View/2638/44/qodbc-desktop-trou устранение неисправностей---how-to-use -date-and-dateadd-function-in-qodbc

Правильный формат: {d 'YYYY-MM-DD'} Существует функция, позволяющая сделать дату правильной строкой;

Функция:

Function fncqbDate(myDate As Date) As String
myDate = Nz(myDate, Now)
fncqbDate = "{d '" & Year(myDate) & "-" & Right("00" & Month(myDate), 2) & "-" & Right("00" & Day(myDate), 2) & "'}"
End Function
0
ответ дан Minty 16 January 2019 в 15:42
поделиться

Как прокомментировал и опубликовал @Minty, ваши даты являются проблемой.

  • При выполнении запросов в графическом интерфейсе MS Access, например, в Query Designer, вы получаете доступ к диалекту Access SQL.
  • При подключении через ODBC-драйвер к внешней базе данных вы получаете доступ к диалекту SQL подключаемой базы данных, в данном случае Quickbooks.

Нет двух одинаковых диалектов SQL, но большинство пытаются соответствовать стандартам ANSI. Следовательно, одни и те же запросы могут завершаться ошибкой между Query Designer и VBA.

MS Access

Даты MS Access, если они отправлены буквально, должны быть заключены в хэштеги, #:

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() для преобразования строки в дату: 1119]

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 внутри объекта ADO Command (не для набора записей 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
0
ответ дан Parfait 16 January 2019 в 15:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: