我有一个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运行报告时,是否都必须覆盖整个查询文本?
答案 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)