Как правильно написать оператор WHERE с помощью поля со списком в запросе MS Access «Pass Trough», который подключен к серверу MS SQL - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь создать в MS Access проходной запрос, который будет подключен к SQL серверу и использовать поле со списком из формы в качестве параметра фильтра в части инструкции WHERE.

Я знаю, что соединение и все работает, потому что, если я ввожу

SELECT * FROM mrch.Promo_Request_Base

, я получаю все результаты.

Теперь, когда я пытаюсь ввести что-то вроде

SELECT * FROM mrch.Promo_Request_Base WHERE mrch.Promo_Request_Base.Requestor_Name = 'UserABC';

тогда это также работает.

Это не работает для меня, если я ввожу SQL следующим образом:

SELECT * 
FROM mrch.Promo_Request_Base
WHERE (((mrch.Promo_Request_Base.Requestor_Name) = [Forms]![f_PromoRequest_VIEW_Header_001a]![Combo133]));

Я также попробовал это:

SELECT *
FROM mrch.Promo_Request_Base
WHERE (((mrch.Promo_Request_Base.Requestor_Name) = [Forms]![f_PromoRequest_VIEW_Header_001a]![Combo133].Columns(0)));

[Combo133] содержит значение 'UserAB C'.

Я был бы очень благодарен, если бы вы могли мне помочь.

Ответы [ 3 ]

0 голосов
/ 10 апреля 2020

Сквозной запрос означает, что он выполняется на стороне сервера. Этот сервер больше не может go проверять доступ и получать данные, а затем go и пытаться украсть все ваши электронные письма или финансовые данные на вашем компьютере.

простое решение - «обработать» или «оценить» "выражение ДО того, как вы отправите его на sql сервер. Вы можете использовать следующее:

Dim strSQL     As String

strSQL = "SELECT * From mrch.Promo_Request_Base " & _
         "WHERE mrch.Promo_Request_Base.Requestor_Name = '" & _
         [Forms]![f_PromoRequest_VIEW_Header_001a]![Combo133] & "'"

With CurrentDb.QueryDefs("qryPass")
   .SQL = strSQL
End With

' now code here to open form, or say launch report

DoCmd.OpenReport "rptPromoList", acViewPreview

Обратите внимание, что вы должны убедиться, что sql правильно отформатирован для серверной стороны.

Итак, я предполагаю, что Requestor_Name имеет значение текстовый тип поля. Итак, это означает, что вы должны поместить кавычки (я использовал одиночные) вокруг выражения. Если тот столбец, который вы получаете из поля со списком, является числом, тогда кавычки не обязательны, и вы должны использовать это:

strSQL = "SELECT * From mrch.Promo_Request_Base " & _
         "WHERE mrch.Promo_Request_Base.Requestor_Name = " & _
         [Forms]![f_PromoRequest_VIEW_Header_001a]![Combo133]

Таким образом, другой код будет таким же - единственное изменение выше было как я пропустил добавление кавычек (') вокруг выражения.

0 голосов
/ 16 апреля 2020

Большое спасибо за вашу помощь.

В конце я сделал это по-другому. Я изменяю запрос PassTrough через VBA:

Private Sub Command159_Click()

Dim db As dao.Database
Set db = CurrentDb
Dim qdf As dao.QueryDef

Set qdf = db.QueryDefs("q_PassThrough_VIEW_001a")


qdf.SQL = "SELECT * From mrch.Promo_Request_Last_Version_rpt_v " & _
"WHERE mrch.Promo_Request_Last_Version_rpt_v.F_Qtr_CD LIKE '" & _
[Forms]![f_PromoRequest_VIEW_Header_001a]![Combo145] & "%'" 

qdf.Close
db.Close
Set qdf = Nothing
Set db = Nothing

End Sub
0 голосов
/ 08 апреля 2020

Нет.

Сквозные запросы передаются в источник данных как есть и вообще не анализируются Access. Это означает, что в сквозном запросе нет возможности использовать параметры на основе форм.

Вместо этого используйте VBA для установки параметров.

Для получения сведений об этом см. Как сделать Я использую параметры в VBA в разных контекстах в Microsoft Access? . В частности, раздел о DAO применяется к сквозным запросам.

Это также означает, что вы не можете открыть запрос для отображения. Используйте форму в представлении таблицы данных, используя VBA, чтобы установить собственный набор записей. Обратите внимание, что если для набора записей требуются параметры, это может привести к проблемам при сортировке / фильтрации.

...