MS Access проходит через в зависимости от значения формы - PullRequest
3 голосов
/ 08 февраля 2011

Как назначить сквозной запрос для источника строки, который зависит от другого значения в форме?

По сути, я хочу сделать это:

SELECT x.companyid, 
       x.companyname, 
       x.productid
  FROM x
 WHERE (((x.CompanyID) = [Forms]![Reporting]![CompanyID_Control]))
ORDER BY x.productid;

Но, конечно, сквозные запросы не поддерживают ссылку на какие-либо элементы управления формой.

Я прочитал здесь , что существует метод через VBA, однако я не знаю, как использовать VBA в сочетании с источником строки элемента управления.

Ответы [ 4 ]

3 голосов
/ 11 февраля 2011

Как сказал Рему в своем ответе, связанные таблицы упростят эту задачу. Однако, если у вас есть сквозной запрос с именем MyQuery, вы можете сделать следующее, чтобы RowSource элемента управления MyComboOrListBox динамически обновлялся при изменении значения CompanyID_Control:

Private Sub CompanyID_Control_AfterUpdate()
Dim SQL As String, qdf AS DAO.QueryDef
    Set qdf = CurrentDB.QueryDefs("MyQuery")
    qdf.SQL = " SELECT  x.companyid, x.companyname, x.productid " & _
              " FROM x " & _
              " WHERE x.CompanyID =" & Me.CompanyID_Control & _
              " ORDER BY x.productid;"
    Me.MyComboOrListBox.RowSource = "MyQuery"
End Sub

Вам также необходимо установить для свойства AfterUpdate CompanyID_Control значение:
[Event Procedure].

Обратите внимание, что даже если вы используете связанные таблицы, как предложил Рему, вам все равно понадобится код в событии AfterUpdate CompanyID_Control, чтобы обновить список со списком.

Private Sub CompanyID_Control_AfterUpdate()
    Me.MyComboOrListBox.Requery
End Sub
3 голосов
/ 12 февраля 2011

В некоторых случаях вы получите эффективные результаты, написав SQL SELECT, используя ваш промежуточный запрос в качестве источника FROM:

  SELECT MyPassthrough.*
  FROM MyPassthrough
  WHERE [criteria here]

Скорее всего, это будет столь же эффективно, как и редактирование QueryDef в passthrough, и он потерпит неудачу, только когда passthrough не возвращает в своем собственном SELECT поля, по которым нужно фильтровать. Стоит ли менять это, зависит от того, для чего вы используете проход, и от того, насколько он сложен.

В общем, я всегда избегаю редактирования сохраненных QueryDefs. Подумайте об этом: как часто вы изменяете SQL Server VIEW с помощью DDL? Не часто! В Access это может привести к небольшому вздутию живота (или, в некоторых случаях, не к такому незначительному), и я всегда избегаю всего, что вызывает вздутие моего интерфейса, насколько это возможно.

1 голос
/ 11 февраля 2011

Если таблица связана, вы можете просто выполнить запрос к ней, как если бы она была таблицей Access, включая ссылку на формы. Итак:

SELECT * FROM MyLinkedTable
WHERE ID = Forms!MyForm!MyID

Будет работать нормально.

Чтобы навсегда изменить SQL запроса, вы можете использовать свойство SQL QueryDef:

 Set qdf = CurrentDB.QueryDefs("MyQuery")
 qdf.SQL = "SELECT * FROM MyLinkedTable " & _
           "WHERE ID = " & Forms!MyForm!MyID  ''Or on MyForm, Me.MyID

Вы также можете установить источник записи формы или источник строки комбинированного списка или списка в строку SQL, для связанной таблицы это достаточно просто:

 Me.RecordSource = "SELECT * FROM MyLinkedTable " & _
           "WHERE ID = " & Forms!MyForm!MyID  ''Or on MyForm, Me.MyID

или

 Me.MyCombo.RowSource = "SELECT * FROM MyLinkedTable " & _
           "WHERE ID = Forms!MyForm!MyID"
0 голосов
/ 10 марта 2011

Я только что понял это после множества попыток, это легко исправить: создайте свой проход через то, что вы хотите вызвать в форме, но оставьте это поле пустым, чтобы он вызывал все, а затем сохраните переход.Закройте это, создайте новый запрос и добавьте каждый столбец из passthrouh. Теперь в критерии нового запроса, вызывающего passthrough, добавьте [Forms]![Reporting]![CompanyID_Control]) и просто убедитесь, что форма открыта, должен работать так же быстро, но теперьВы можете использовать свои формы

...