在MS Access查询中基于表单字段的SELECT TOP x?

时间:2019-03-20 19:58:10

标签: sql vba ms-access access-vba

我有一个Access报告,该报告的Record Source引用了表单上的几个字段。工作正常。就是这样,为简单起见,在SELECT子句中减去了一堆字段:

SELECT
    pt.PA,
    pt.SpfCode
FROM
    PtHead AS pt
    LEFT JOIN tblProblems AS p ON pt.PA = p.PantagNo
WHERE
    pt.PA = [Forms]![fdlgQualityHistory]![PA] AND
    p.ComplaintDate >= [Forms]![fdlgQualityHistory]![StartDate];

我想升级此报告,使其仅显示最新记录。效果很好:

SELECT TOP 20  -- NEW PART
    pt.PA,
    pt.SpfCode
FROM
    PtHead AS pt
    LEFT JOIN tblProblems AS p ON pt.PA = p.PantagNo
WHERE
    pt.PA = [Forms]![fdlgQualityHistory]![PA] AND
    p.ComplaintDate >= [Forms]![fdlgQualityHistory]![StartDate]
ORDER BY p.ComplaintDate DESC;  -- NEW PART

但是,我不希望将其硬编码为TOP 20。我希望它是TOP x,基于相同表单上的另一个字段。以下失败:

SELECT TOP [Forms]![fdlgQualityHistory]![MaxProblems]  -- FAILS HERE
    pt.PA,
    pt.SpfCode
FROM
    PtHead AS pt
    LEFT JOIN tblProblems AS p ON pt.PA = p.PantagNo
WHERE
    pt.PA = [Forms]![fdlgQualityHistory]![PA] AND
    p.ComplaintDate >= [Forms]![fdlgQualityHistory]![StartDate]
ORDER BY p.ComplaintDate DESC;

错误:

  

SELECT语句包含的保留字或参数名称拼写错误或丢失,或者标点符号不正确。

我可以更改语法以使其工作吗?如果没有,我该怎么办?每次通过VBA运行报告时,是否都必须覆盖整个查询文本?

2 个答案:

答案 0 :(得分:1)

Access does not support using a parameter for SELECT TOP.

在该[Forms]![fdlgQualityHistory]![MaxProblems]控件的更新后事件中修订记录源 SQL。

答案 1 :(得分:1)

或者,由于无法TOP数字进行参数化,因此无法使用表单字段,因此请考虑通过递减日期来创建运行计数,然后可以对其进行过滤。但是请注意,对于较大的表,此相关子查询可能会带来性能挑战。

SELECT 
    pt.PA,
    pt.SpfCode
FROM
    PtHead AS pt
    LEFT JOIN tblProblems AS p ON pt.PA = p.PantagNo
WHERE
     pt.PA = [Forms]![fdlgQualityHistory]![PA]
 AND p.ComplaintDate >= [Forms]![fdlgQualityHistory]![StartDate]
 AND (SELECT Count(*) 
      FROM PtHead sub_pt
      LEFT JOIN tblProblems AS sub_p ON sub_pt.PA = sub_p.PantagNo
      WHERE sub_p.ComplaintDate >= p.ComplaintDate) <= [Forms]![fdlgQualityHistory]![MaxProblems];

也许有一天,MS Access将支持窗口功能,并在RDBMS世界中加入其他功能,以避免相关的子查询:

ROW_NUMBER() OVER (ORDER BY pt.ComplaintDate DESC)