Сначала некоторые вещи стиля:
1) Вероятно, у вас меньше вложенности, если вы используете ElseIf
вместо
Else
If '...
2) Было бы неплохо переименовать флажки в нечто более значимое, чем Check194
(по крайней мере, для следующего разработчика, который коснется этого кода - даже если это 4 года спустя). То есть, конечно, если предположить, что это не надуманный пример, чтобы немного анонимизировать код.
3) Точно так же наличие пробела в именах столбцов и таблиц может быть проблемой в заднице. Аналогично «Редактировать» выглядит как зарезервированное слово (оно может не быть) и может привести к остановке сердца.
4) Я не уверен в логике вашего первого IF
заявления. Вы можете не иметь порядок работы, может не соответствовать вашим ожиданиям. Это в основном эквивалент
If Nz(Me.cboshowcat) = "" _
And (Me.Check194 = True _
Or Me.Check199 = True _
Or Me.Check205 = True) _
then
Если это то, что вы хотели, тогда все в порядке.
5) Если вы построите строку фильтра на лету, вам не придется проходить все восемь комбинаций (и, возможно, пропустить одну). Представьте, если у вас есть 4, 5 или 10 флажков. Как правило, я бы сделал что-то вроде этого
dim strFilter as string
strFilter = "(1 = 1) " ' so we don't have to decide whether to put `and` or not.
If Nz(Me.cboshowcat) = "" then
if Me.Check194 = then
strFilter = strFilter & "and [contacts].[edit] <=Date()-90 "
end if
if Me.Check199 = then
strFilter = strFilter & "and [contacts].[opt out]='No' "
end if
if Me.Check199 = then
strFilter = strFilter & "and [company].[exclude site] is null "
end if
me.filter = strFilter
me.filteron = true
else
me.filter = ""
me.filteron = false
end if
Второе решение вашей проблемы:
Несколько строк для каждой компании обусловлены объединением, и теперь запрос вынужден показывать строку для каждого контакта с различной комбинацией значений для «Изменить» или «Отказаться».
Поскольку вы уже обновляете источник записи на лету, я просто вставил фильтр в предложение where
источника записи и покончим с этим. Это эффективно, что фильтр делает в любом случае (только на результат запроса, поэтому он не может видеть в таблице контактов).
Опять же, создайте предложение where
на лету, вместо того, чтобы делать 8 различных комбинаций.