2009-06-09 2 views
0

В базе данных SQL у меня есть таблица, Table1. Эта таблица относится к другой таблице, Table2, которая в свою очередь относится к Table3. Появляется запрос Query1, который выбирает определенные записи из Table1.Фильтрация формы с подформами в Access

Эта база данных связана в проекте базы данных доступа

А образуют Table1Data основан на Table1, с таблицы, содержащей данные, связанные с Table2 (и впоследствии Table3 данные). Эта форма открывается другой формой (Switchboard). Проблема возникает, когда форма открывается. Я хочу, чтобы форма была отфильтрована, но когда я настраиваю макрос и открываю форму и устанавливаю фильтр на Query1, данные в форме не фильтруются. Почему это происходит, разве это не способ сделать это? Query1 выбирает все столбцы от Table1, поэтому несоответствующие столбцы не должны быть проблемой.

Кроме того, я хочу заблокировать его - только некоторые люди могут выполнить Query1, то же самое с другими запросами (Query2, Query3 и т. Д.). Поэтому они могут редактировать только те данные, которые им разрешено редактировать.

ответ

0

Мое предпочтительное решение - установить источник записей в событии Form Open. Это дает мне больше всего контроля над тем, что происходит.

Вот мой шаблон для этого. Он также включает в себя поиск OpenArgs, которые передаются при вызове формы. Вы можете просто прокомментировать или удалить инструкцию If/Then, если вы не хотите указывать что-либо из вызывающей формы в вашем SQL.

Private Sub Form_Open(Cancel As Integer) 
    ' Comments : 
    ' Parameters: Cancel - 
    ' Modified : 
    ' -------------------------------------------------- 

    On Error GoTo Err_Form_Open 

    Dim strSQL As String 
    Dim strVariable As String 
    Dim strDateVariable As String 
    Dim dteDateVariable As String 
    Dim i As Integer 
    Dim n As Integer 

    'Get variables from Left and right of | in OpenArgs 
    If Not (IsNull(Me.OpenArgs)) Then 

     i = InStr(1, Me.OpenArgs, "|") 
     n = Len(Me.OpenArgs) 

     strVariable = Left(Me.OpenArgs, n - (n - i + 1)) 

     strDateVariable = Right(Me.OpenArgs, (n - i)) 

     dteDateVariable = CDate(strDateVariable) 

    Else 

     GoTo Exit_Form_Open 

    End If 

    strSQL = "SELECT ... " _ 
      & "FROM  ... " _ 
      & "WHERE (((Field1)='" & strVariable & "') " _ 
      & " AND ((Field2)=#" & dteDateVariable & "#));" 

    Me.RecordSource = strSQL 

    Me.Requery 

Exit_Form_Open: 

    Exit Sub 

Err_Form_Open: 

    Select Case Err.Number 
     Case Else 
      Call ErrorLog(Err.Number, Err.Description, "Form_Open", "frmName", Erl) 
      GoTo Exit_Form_Open 
    End Select 

End Sub 
+0

У вас есть пример макроса OpenForm action, который приводит к этому запуску, и переменные устанавливают базу на нем? – SamWM

+0

Как можно скорее отойдите от макросов. Они не обладают универсальностью и не имеют исправления ошибок. Макросы для новичков. После того, как вы используете Access в течение нескольких недель, вы не должны создавать никаких, кроме двух функций, для которых они требуются (AutoExec и AutoKeys). –

+0

Действие OpenForm будет срабатывать при открытии формы Table1Data, которую вы описываете в своем вопросе. Код выполнит установку источника записей в вашу строку SQL, а затем .Requery приведет к тому, что форма будет создана на основе нового RecordSource. Кроме того, я согласен с Дэвидом Фентоном в том, что вы не должны использовать макросы, за исключением того, что я даже не буду использовать их в AutoExec и AutoKeys, потому что я просто нашел другие способы решения этих проблем. –

Смежные вопросы