Фильтрация формы с подчиненными формами в Access - PullRequest
0 голосов
/ 10 июня 2009

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

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

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

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

1 Ответ

0 голосов
/ 10 июня 2009

Мое предпочтительное решение - установить источник записей в событии «Открыть форму». Это дает мне максимальный контроль над тем, что происходит.

Вот мой пример для этого. Это также включает поиск 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
...