Как ограничить элементы с несколькими категориями?

У меня есть код Access 2010 VBA, вызывающий Outlook для фильтрации элементов электронной почты.

Элементы должны иметь две категории, например. МОПС, ПСА.

Я использую ключевое слово Restrict следующим образом:

Set rootItems = oFolderRoot.Items
strCategory = sGroupCompanyName & ", MOPS"
'>>>
filterCriteria = "[Categories] = " & QuoteWrap(strCategory)
Set objItems = rootItems.Restrict(filterCriteria)

filterCriteria равно [Категории] = 'PSA, MOPS'


person botakelymg    schedule 10.02.2019    source источник


Ответы (1)


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

Поскольку почтовые элементы могут быть отнесены к нескольким категориям, вы не можете полагаться на порядок, в котором каждая категория будет отображаться в строке с разделителями-запятыми, возвращаемой при программном доступе к полю Categories.

Это описано в документации MSDN:

Ключевые слова (или категории)

Поле «Категории» относится к типу ключевых слов и предназначено для хранения нескольких значений. При программном доступе поле «Категории» ведет себя как текстовое поле, и строка должна точно совпадать.

Значения в текстовой строке разделяются запятой и пробелом. Обычно это означает, что вы не можете использовать методы Find и Restrict для поля ключевых слов, если оно содержит более одного значения.

Таким образом, ваш фильтр должен будет учитывать оба возможных случая, используя строку фильтра в следующих строках:

Set rootItems = oFolderRoot.Items
Set objItems = rootItems.Restrict _
( _
    "[Categories] = '" & sGroupCompanyName & ", MOPS' OR " & _
    "[Categories] = 'MOPS, " & sGroupCompanyName & "'" _
)
person Lee Mac    schedule 10.02.2019
comment
Лучший фильтр: [Категории] = 'Синяя категория' И [Категории] = 'Зеленая категория'. - person Dmitry Streblechenko; 10.02.2019
comment
@DmitryStreblechenko Основываясь на содержании документации MSDN, я не понимаю, как это будет работать в этом случае - не могли бы вы объяснить? - person Lee Mac; 10.02.2019
comment
Должен ли я сделать вывод, что пример кода с оператором ИЛИ ставит акцент на порядок значений? @Ли Мак - person botakelymg; 10.02.2019
comment
Ваш пример зависит от того, что разделитель списка должен быть ,. OOM анализирует ваше ограничение и в любом случае создает ограничение, подобное моему примеру. Порядок не важен — вам не нужен оператор or — любой из них будет работать независимо от порядка — попробуйте. - person Dmitry Streblechenko; 10.02.2019
comment
@DmitryStreblechenko Я пробовал разные методы. Нет ошибок, за исключением того, что выбранные элементы являются только последними (в течение последних двух дней для моего теста). Я не понимаю, почему все остальные не пойманы. Чтобы быть более точным, другие старше, и я изменил Категории, чтобы они соответствовали PSA и MOPS. Может ли это быть причиной? Для моего приложения это проблематично. - person botakelymg; 11.02.2019
comment
Кроме того, даже если это не то, что я ожидал, Items.Count прав: всегда самая последняя электронная почта ... Есть ли какие-либо другие скрытые параметры, которые фильтруют? - person botakelymg; 11.02.2019
comment
filterCriteria = [Categories] = 'PSA, MOPS' OR [Categories] = 'MOPS, PSA' Set objItems = rootItems.Restrict(filterCriteria) objItems передается функции для получения свойств электронной почты для вставки их в таблицу доступа eMsg. Как и вчера, objItems.Count дает 1, и когда я сегодня отправил новое электронное письмо, Count вернул 2. Как будто другие электронные письма слишком старые, чтобы их можно было фильтровать. Я должен сказать, что они до октября 2017 года. - person botakelymg; 11.02.2019