在Access中使用子表单过滤表单

时间:2009-06-09 22:01:56

标签: sql-server ms-access ms-access-2007

在SQL数据库中,我有一个表Table1。此表与另一个表Table2相关,而Table3又与Query1相关。有一个查询Table1可以从Table1Data中选择某些记录。

此数据库链接到Access数据库项目

表单Table1基于Table2,其中的数据表包含相关的Table3数据(以及随后的Switchboard数据)。此表单由另一种表单(Query1)打开。打开表单时出现问题。我希望过滤表单,但是当我设置宏并打开表单并将过滤器设置为Query1时,表单中的数据不会被过滤。为什么会发生这种情况,这不是这样做的方法吗? Table1会选择Query1中的所有列,因此不匹配的列不应成为问题。

此外,我想将其锁定 - 只有某些人可以执行Query2,与其他查询(Query3,{{1}}等相同。因此,他们只能编辑允许编辑的数据。

1 个答案:

答案 0 :(得分:0)

我首选的解决方案是在Form Open事件中设置记录源。这使我能够最大程度地控制正在发生的事情。

这是我做这个的样板。它还包括查找调用表单时传递的OpenArgs。如果您不想在SQL中的调用表单中指定任何内容,则可以注释掉或删除If / Then语句。

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