在访问表单中使用sql查询时要求参数的弹出框

时间:2013-01-04 09:40:24

标签: vba ms-access access-vba

我有一个包含3件事的表单供我的用户填写:

  1. 名为ProjectName

  2. 的文本框
  3. 分别称为ProjStartDateProjEndDate的两个ActiveX控件对象(Microsoft时间和日期选择器控件6.0)

  4. 在我的用户输入上述任一项之后,他们可以点击一个按钮,该按钮将在表单中的列表框对象上调用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!ProjectNameForms!Search by project!ProjStartDateForms!Search by project!ProjEndDate的参数。如果我输入参数for,让我们说项目名称正确,列表框将显示正确的过滤结果。

    此外,即使我在ProjectName文本框中输入正确的关键字并重新查询,仍会出现参数弹出框。有谁知道如何解决这个问题?非常感谢提前!

1 个答案:

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