SELECT ProductData.ShiftStart, ProductData.ExtrusionLine, Avg(ProductData.RollDensity) AS AvgOfRollDensity, StDev(ProductData.RollDensity) AS StDevOfRollDensity
FROM ProductData
GROUP BY ProductData.ShiftStart, ProductData.ExtrusionLine
HAVING (((ProductData.ShiftStart)=[Forms]![RollRelease]![ShiftStart]) AND ((ProductData.ExtrusionLine)=[Forms]![RollRelease]![Line]));

Если я открою форму «RollRelease», введите данные, а затем запустите «qryRollDensity» с «RollRelease», откройте запрос. Когда я пытаюсь использовать запрос в операторе выбора, я получаю ошибки несоответствия или пропущенные ошибки параметров и т. Д. В конечном счете мне нужно значение AvgOfRollDensity и StDevOfRollDensity в моей форме, чтобы я мог выполнить некоторые вычисления.

0
Thomas Heikkila 30 Июл 2020 в 00:01

2 ответа

Лучший ответ

Используйте WHERE вместо HAVING для фильтрации записей перед агрегацией.

Параметры динамического запроса не будут перенесены в оператор SQL набора записей VBA.

Один из вариантов - использовать агрегатные функции домена в текстовых полях формы; либо выражения DLookup () в запросе, либо DAvg () и DStDev () в таблице необработанных данных с критериями WHERE. Предполагая, что ShiftStart и ExtrusionLine являются полями текстового типа:

=DAvg("[RollDensity]", "ProductData", "[ShiftStart] = '" & Me.ShiftStart & "' AND [ExtrusionLine] = '" & Me.Line & "'"
=DStDev("[RollDensity]", "ProductData", "[ShiftStart] = '" & Me.ShiftStart & "' AND [ExtrusionLine] = '" & Me.Line & "'"

В противном случае удалите апострофы и вместо этого используйте # разделитель для поля даты / времени и без разделителя для числового типа.

0
June7 29 Июл 2020 в 23:09

Я хочу использовать результаты запроса AvgOfRollDensuty и StDevOfRollDensity в коде VBA формы. - Томас Хейккила

Что ж, это решает вопрос в виде любой кнопки или события, которое вы хотите вызвать, вы можете использовать этот код:

Dim db as Database, rs as Recordset, SQL as String, AVGRollDen as Variant, STDevRollDen as Variant
Set db = CurrentDb
SQL = "SELECT ProductData.ShiftStart, ProductData.ExtrusionLine, Avg(ProductData.RollDensity) AS AvgOfRollDensity, StDev(ProductData.RollDensity) AS StDevOfRollDensity " & _
"FROM ProductData " & _
"GROUP BY ProductData.ShiftStart, ProductData.ExtrusionLine " & _
"HAVING (((ProductData.ShiftStart)='" & Me.ShiftStart & "') AND ((ProductData.ExtrusionLine)='" & Me.Line & "'));" 
'Big chance you will have to change the Me.ShiftStart and Me.Line to Me.Text## that has the value. Also, I am calling "Me." because this is supposed to run somewhere in your Form Code. If these values are numbers, remove the ' (apostrophes) from the line above.

Set rs = db.OpenRecordset(SQL)
If Not rs.BOF And Not rs.EOF Then
    'Records Returned
    rs.MoveFirst
    AVGRollDen = rs.Fields(2).Value
    STDevRollDen = rs.Fields(3).Value
    'Now AVGRollDen and STDevRollDen has the values you want
Else
    'No records returned
End If
rs.Close
db.Close
Set rs = nothing
Set db = nothing
0
Ricardo A 29 Июл 2020 в 22:43