我有一个包含3件事的表单供我的用户填写:
名为ProjectName
分别称为ProjStartDate
和ProjEndDate
的两个ActiveX控件对象(Microsoft时间和日期选择器控件6.0)
在我的用户输入上述任一项之后,他们可以点击一个按钮,该按钮将在表单中的列表框对象上调用requery,这将显示已过滤的结果。
我已将列表框的行源类型设置为“表/查询”,并将其行源设置为以下SQL查询:
SELECT p.Title
FROM Project AS p
WHERE
p.Title = [Forms]![Search by project]![ProjectName]
OR (p.StartDate <= [Forms]![Search by project]![ProjStartDate]
AND p.EndDate >= [Forms]![Search by project]![ProjEndDate])
ORDER BY
p.ProjectId DESC;
但是,每次我输入表单时,它都会弹出一个弹出框,提示我输入一个名为Forms!Search by project!ProjectName
,Forms!Search by project!ProjStartDate
和Forms!Search by project!ProjEndDate
的参数。如果我输入参数for,让我们说项目名称正确,列表框将显示正确的过滤结果。
此外,即使我在ProjectName
文本框中输入正确的关键字并重新查询,仍会出现参数弹出框。有谁知道如何解决这个问题?非常感谢提前!
答案 0 :(得分:2)
我首先根据所有控件都包含在一个表单中的假设来写这个答案。但是,如果列表框位于子表单上,则在父表单首次打开时,父表单的控件(例如[Forms]![Search by project]![ProjectName]
)尚不可用。如果是这种情况,您可以将列表框行源属性保留为空,并等待父表单的Form Load事件将您的SELECT
语句分配给列表框行源。或者将列表框行源保留为空,直到用户单击命令按钮。
这个答案的其余部分是关于诊断命名问题。由于您在评论中指出查询在某些时间运行时可以正常工作,我认为毕竟不会涉及命名,但是如果它可以帮助其他人,则会留下它。
打开立即窗口( Ctrl + g )并调查数据库引擎无法找到这些参数的原因。
在“表单视图”中打开“按项目搜索”表单,只需检查其.Name
属性,即可验证Access是否符合您的预期名称。如果您和Access同意表单的名称,您将获得此...
? Forms![Search by project].Name
Search by project
OTOH,如果Access认为表单具有不同的名称,则该尝试将触发错误。如果发生这种情况,请检查表单名称是否为Access。这将为您提供所有未结表格的名称:
for each f in Forms : ? f.Name : next
最后,检查这些表单控件的值。假设“按项目搜索”确实是正确的表单名称......
? Forms![Search by project]!ProjectName
? Forms![Search by project]!ProjStartDate
? Forms![Search by project]!ProjEndDate