使用动态创建的SQL更新并显示Access子表单的结果

时间:2012-10-05 18:06:38

标签: access-vba subform

我有一个主窗体frm_Main,它有一个子窗体,subform_Child。当显示主窗体时,子窗体也会显示,它只是空白,因为其中没有数据(完全没问题)。当用户单击主窗体上的按钮时,代码会根据用户在文本框中输入的内容构建一个包含WHERE子句的SQL字符串。到目前为止这么好,我以前做过这个。现在,我无法弄清楚的部分(因为我以前没有做过)是使用刚刚创建的SQL填充该子表单!构建SQL字符串没有问题,我只是不知道Access VBA是否足以知道用于从主窗体更新子窗体的代码,并让它在查询运行后显示记录集。

编辑:我的理解是使用QueryDef不是推荐的方法,对吗?

1 个答案:

答案 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”。

我希望这能帮助别人,因为它对我来说不那么直观。如果有另一种/更好的方法,我就是要学习新东西!