Эффективное использование расчетов в MS Access - PullRequest
2 голосов
/ 11 июля 2011

Это то, что я чувствую, я должен уже знать, но не ...

В MS Access, если запрос состоит из n вычисляемых полей (скажем, calc_1, calc_2, .... calc_ n ), но я хочу использовать только их подмножество в определенной форме или отчете - скажем, calc_ x , calc_ y и calc_ z - будет вычислять все вычисления n при выполнении SELECT calc_x, calc_y, calc_z FROM myquery, а затем верните те, которые мне нужны, или это будет достаточно умно, чтобы вычислять только calc_ x , calc_ y и calc_ z ?

В моем случае я использую Access 2003, но, вероятно, ответ будет одинаковым для всех версий.

Ответы [ 4 ]

2 голосов
/ 13 июля 2011

Как и @ Дэвид, я сначала не поверил ответу Андреаса.Поэтому я сам проверил это следующим образом.Я создал следующую функцию:

Function Watch(Val, Optional CalledFrom As String = "")
    Debug.Print Val, CalledFrom
    Watch = Val
End Function

Затем я создал таблицу с именем "Dummy" с одним полем с именем "ID".Я создал форму и использовал следующее в качестве RecordSource формы:

SELECT Watch([ID],"ShowInForm") AS ShowInForm, 
       Watch([ID],"HideFromForm") AS HideFromForm 
FROM Dummy;

Я добавил один элемент управления textbox с ControlSource ShowInForm.

Затем я открыл форму и получил этов ближайшем окне:

 1            ShowInForm
 1            ShowInForm
 1            ShowInForm

Затем я вернулся к RecordSource, предварительно просмотрел его в представлении таблицы и получил следующее:

 1            ShowInForm
 1            HideFromForm

Я не уверен, почему «ShowInForm»выражение оценивается в форме три раза, но кажется довольно ясным, что неиспользуемое поле «HideFromForm» не оценивается.


Чтобы обратиться к комментарию @ HansUp, я вернулся и сохранил запросс именем "Qry":

SELECT Watch([ID],"ShowInForm") AS ShowInForm, 
       Watch([ID],"HideFromForm") AS HideFromForm
FROM Dummy;

Затем изменил форму RecordSource на:

Select ShowInForm FROM Qry

Это дало тот же результат, что и раньше, когда я открывал форму (т.е. 3 строки 1 ShowInForm).Интересно, что когда я открыл RecordSource в виде таблицы, я получил это:

 1            ShowInForm
 1            ShowInForm

Другими словами, он оценил поле ShowInForm дважды .Предположительно, один раз в «Qry» и снова в запросе RecordSource.

Конечный результат все еще является подтверждением ответа @ Andreas.

2 голосов
/ 11 июля 2011

Доступ умный и не рассчитывать невидимые поля. Пробовал с Access 2003

0 голосов
/ 07 февраля 2012

Я помещаю расчеты вот так на стороне сервера .. вычисляемые столбцы потрясающие.

Я думаю, что Access наконец-то получил эту функцию в 2007 году, я не знаю, как люди выжили без нее.

0 голосов
/ 13 июля 2011

Если вы включите вычисляемые поля в предложение SELECT вашего отчета или источника записей формы, он будет рассчитывать их для каждой строки, КАК ЭТО ПОЛУЧЕНО.

Если вы не включите их в SELECT и включите вычислениятолько в свойствах ControlSource элементов управления в вашем отчете / форме то, что вы говорите, является истинным.

Кроме того, если вы выполните какую-либо сортировку / группировку для расчетов или наложите на них критерии, будут вычислены все строки.

Таким образом, в этом источнике записей:

  SELECT Field1/Field2 As Ratio1, Field3/Field4 As Ratio2, FIeld1, Field2, Field3, Field4
  FROM MyTable;

... для каждой извлекаемой строки оба вычисления будут выполняться независимо от того, используется ли результат в форме или отчете..

Если вы хотите отложить вычисления до последнего возможного момента, НЕ включайте их в источник записей SQL, а просто используйте их в качестве ControlSources элементов управления, отображающих вычисления.Однако у этого есть и обратная сторона: во многих случаях вы увидите, как вычисления отображаются на экране.

РЕДАКТИРОВАТЬ:

Кажется, это может быть неправильно, но я чувствую, что здесь что-то происходит, чтоне полностью объяснено ответом @ mwolfe02.Я просто оставлю это здесь для дальнейшего обсуждения.

...