访问vba修改查询def以更改显示的列?

时间:2011-06-09 18:29:55

标签: ms-access vba access-vba

我正在使用CurrentDb.QueryDefs对象来更改查询中的sql。这很有效,直到我更改select子句。我希望查询现在只显示我的新select子句中指定的字段。相反,列标题仍然显示,但没有值。我在子表单中显示查询。

如何强制子窗体/查询仅显示可以在按钮单击时更改的指定列?

原因:这是一个高级搜索表单,其中复选框代表每个字段,用户可以在每次搜索时删除和添加字段。

1 个答案:

答案 0 :(得分:2)

你不能重新查询,你必须刷新子表单的源对象:

MySubformControl.SourceObject = ""
MySubformControl.SourceObject = "Query.MyQuery"

为了测试,我创建了一个表Table1,其中包含字段Field1,...,Field4,然后是一个包含4个复选框和一个子表单的表单,然后是一个查询Query1,其中包含Table1中的字段。这是表单背后的代码(我让Access命名所有对象,因此子表单称为Child8):

Private Sub Check0_AfterUpdate()
    Rewrite_Query
End Sub

Private Sub Check2_AfterUpdate()
    Rewrite_Query
End Sub

Private Sub Check4_AfterUpdate()
    Rewrite_Query
End Sub

Private Sub Check6_AfterUpdate()
    Rewrite_Query
End Sub

Private Sub Rewrite_Query()

    Dim qdf     As QueryDef
    Dim strSQL  As String

    Set qdf = CurrentDb.QueryDefs("Query1")
    If Check0.Value = True Then
        If Len(strSQL) > 0 Then strSQL = strSQL & ","
        strSQL = strSQL & "Field1"
    End If

    If Check2.Value = True Then
        If Len(strSQL) > 0 Then strSQL = strSQL & ","
        strSQL = strSQL & "Field2"
    End If

    If Check4.Value = True Then
        If Len(strSQL) > 0 Then strSQL = strSQL & ","
        strSQL = strSQL & "Field3"
    End If

    If Check6.Value = True Then
        If Len(strSQL) > 0 Then strSQL = strSQL & ","
        strSQL = strSQL & "Field4"
    End If

    strSQL = "SELECT " & strSQL & " FROM Table1"

    qdf.SQL = strSQL
    qdf.Close
    Set qdf = Nothing

    Child8.SourceObject = ""
    Child8.SourceObject = "Query.Query1"

End Sub