2011-06-09 109 views
0

我正在使用CurrentDb.QueryDefs对象来更改我的查询中的sql。这很好,直到我改变了select子句。我希望查询现在只显示在我的新选择子句中命名的字段。相反,列标题仍然显示,但没有值。我在子窗体中显示查询。访问vba修改查询def以更改列显示?

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

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

+0

这个让我想起上周的另一个问题。看看有没有对你有用的答案:http://stackoverflow.com/questions/6194992/displaying-a-recordset-on-a-form-in-access-2010-using-vba – HansUp 2011-06-09 19:21:44

+0

@HansUp - 不完全,我已经显示了数据。我的问题是更新显示。 – MAW74656 2011-06-09 20:08:31

+0

我以为你想要一个适应自己的形式,以响应其记录源中的不同字段集合。这就是HK1所描述的。你的目标有何不同? – HansUp 2011-06-09 20:20:42

回答

2

你不能重新查询,您必须刷新子窗体的源对象:

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

为了测试,我创建了一个表table1与田字段1,...,字段4,那么表格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 
+0

你懂了!我唯一缺少的是将SourceObject设置为空字符串,然后返回查询。谢谢! – MAW74656 2011-06-09 21:23:04

+0

没问题。不必严格使用空字符串 - 你可以注释掉它,它仍然可以工作,但它显示了我认为的下一行隐含的内容。 – downwitch 2011-06-09 21:26:36

+0

是的,我刚刚测试过,它是有道理的。我之前尝试过使用.Requery,它保留了相同的字段但没有数据。 – MAW74656 2011-06-09 21:29:12