我有一个主窗体frm_Main,它有一个子窗体,subform_Child。当显示主窗体时,子窗体也会显示,它只是空白,因为其中没有数据(完全没问题)。当用户单击主窗体上的按钮时,代码会根据用户在文本框中输入的内容构建一个包含WHERE子句的SQL字符串。到目前为止这么好,我以前做过这个。现在,我无法弄清楚的部分(因为我以前没有做过)是使用刚刚创建的SQL填充该子表单!构建SQL字符串没有问题,我只是不知道Access VBA是否足以知道用于从主窗体更新子窗体的代码,并让它在查询运行后显示记录集。
编辑:我的理解是使用QueryDef不是推荐的方法,对吗?
答案 0 :(得分:0)
这是我所做的,因为它似乎是唯一的方法。
1)构建了一个名为“zqry_PlaceHolder”的查询。在我的例子中,这是正在使用的数据集(只有WHERE会改变)。我确实在这里添加了一个WHERE子句(WHERE dbo_project.projectid =“_”),但只是这样才会返回任何内容,以免延迟显示主窗体。
2)在子表单中将源对象设置为我刚构建的查询“Query.zqry_PlaceHolder”。这是必需的。
3)当用户单击主窗体上的按钮时,将运行VBA代码。它在字符串变量 sWhereFilter 中创建WHERE子句,然后将其添加到SQL字符串中:
'Build SQL string
sSQL = Empty 'Ensure string is empty
sSQL = "SELECT Proj_Locs.ProjectID, dbo_PROJECTS.PROJECTID, Proj_Locs.Location, Master_Scans.FileName, Proj_Locs.Title, dbo_PROJECTS.TITLE" & vbCrLf
sSQL = sSQL & "FROM (tbl_Project_Locations AS Proj_Locs" & vbCrLf
sSQL = sSQL & " LEFT JOIN dbo_PROJECT AS dbo_PROJECTS ON Proj_Locs.ProjectID = dbo_PROJECTS.PROJECTID)" & vbCrLf
sSQL = sSQL & " LEFT JOIN tblMasterScans AS Master_Scans ON Proj_Locs.ProjectID = Master_Scans.Project" & vbCrLf
sSQL = sSQL & sWhereFilter
sSQL = sSQL & "ORDER BY Proj_Locs.ProjectID ASC, dbo_PROJECTS.PROJECTID ASC;"
然后我抛出一个“请等待”表单让用户知道正在处理的事情,并将子表单的RecordSource设置为构建的SQL字符串:
DoCmd.OpenForm "frm_PleaseWait", acNormal
DoCmd.Hourglass True
DoCmd.RepaintObject acForm, "frm_PleaseWait" 'Needed to show everything in the form immediately, otherwise there's a delay
Me.subform_Results.Form.RecordSource = sSQL 'This updates the subform AND executes it, refreshing the results
Beep 'Let user know processing completed
Me.txt_RecordsReturned = Me.subform_Results.Form.Recordset.RecordCount 'Let user know how many records were returned with their query (if any)
这有效,并且它不会更改占位符查询“zqry_PlaceHolder”。
我希望这能帮助别人,因为它对我来说不那么直观。如果有另一种/更好的方法,我就是要学习新东西!