Суть всех ответов здесь в том, что они используют имена статических полей, поэтому я написал скорректированную версию в стиле ООП. Предположим, вы используете методы 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;
}
}
Если это приложение Access, я бы рекомендовал вместо того, чтобы переписать запрос в код sql / vba, вместо этого использовать другой подход: оставить рабочий запрос как объект запроса и вместо этого использовать vba для его запуска:
[ 110]Это имеет то преимущество, что этот объект запроса существует в навигационной панели, так что вы можете запустить его вручную для тестирования - без необходимости запуска какой-либо vba. Это гораздо более простая стратегия отладки.
Правильный формат: {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
Как прокомментировал и опубликовал @Minty, ваши даты являются проблемой.
Нет двух одинаковых диалектов SQL, но большинство пытаются соответствовать стандартам ANSI. Следовательно, одни и те же запросы могут завершаться ошибкой между Query Designer и VBA.
Даты 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 вы должны придерживаться требования даты {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