ВЫБЕРИТЕ ТОП x в запросе MS Access на основе поля формы? - PullRequest
2 голосов
/ 20 марта 2019

У меня есть отчет 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 ]

1 голос
/ 20 марта 2019

В качестве альтернативы, поскольку число 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)
1 голос
/ 20 марта 2019

Access не поддерживает использование параметра для SELECT TOP.

Пересмотрите Источник записи SQL в событии После обновления того[Forms]![fdlgQualityHistory]![MaxProblems] контроль.

...