Outlook: как сделать фильтр???

Программирование на Visual Basic for Applications
dimon2003
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 04.08.2003 (Пн) 11:02
Откуда: Ykb

Outlook: как сделать фильтр???

Сообщение dimon2003 » 04.08.2003 (Пн) 11:07

http://forum.codenet.ru/showthread.php? ... adid=11948



Есть необходимость создавать программно фильтр в текущем представлении папки (типа <поле> = <значение>). Использую Office XP (SP 2) и MS Exchange

Для этого меняю свойство xml, соответсвующего View.
вот кусок кода:
// создаем парсер xml
Set objXML = CreateObject("MSXML2.DOMDocument.4.0")
// вытягиваем все view из нужной папки
Set objViews = Application.GetNameSpace("MAPI").Folders("Общие папки").Folders("Все общие папки").Folders("База клиентов").Folders("Курсы").Views
Set objView = objViews.Item("default")
// загружаем xml в парсер
objXML.loadXML(objView.XML)
Set objRoot = objXML.documentElement
Set newNode = objXML.createNode(1, "filter", "")
// ставим фильтр типа "сотрудник=test"
newNode.Text = "(""DAV:isfolder"" = false AND ""DAV:ishidden"" = false) AND (""http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/Сотрудник"" = 'Test')"
Set filterNode = objRoot.insertBefore(newNode, objRoot.childNodes.item(1))
objView.XML = objXML.XML
'Save and apply the new view.
objView.Save
// эпплаим view и показываем отфильтрованный фолдер
objView.Apply
Application.GetNameSpace("MAPI").Folders("Общие папки").Folders("Все общие папки").Folders("База клиентов").Folders("Курсы").Display

================
однако при попытке сохранения фильтра, возникает ошибка "Не удается правильно сохранить представление".
При попытке создать представление вручную из меню outlook (вид/тек. представление/изм. тек. представление/отбор/дополнительно), все работает. Однако, если я пытаюсь через это же меню напрямую применить автоматиечски сгенеренный (outlookom) SQL фильтр, получаю ошибку "Ошибка при анализе текста SQL" (и это текст SQL сгенеренный САМИМ outlook!!!).
Читал, что был такой баг outlook http://support.microsoft.com/default.aspx?scid=kb;en-us;314248 однако он ликвидировался в SP2, поставил обновление, но ошибка повторяется.
Кто-нибудь сталкивался с подобным????
Буду очень признателен за ответы.[/url]

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Re: Outlook: как сделать фильтр???

Сообщение Rojohn » 08.09.2010 (Ср) 16:14

У меня возникла подобная проблема, но без XML: надо просто достать письма по определённой дате из папки MSOutlook без перебора всех писем. С перебором это выглядит примерно так:

Код: Выделить всё
For Each Fldr In myFolder.Folders 'Все папки почты
      If Fldr.DefaultItemType = olMailItem Then
        Fldr.Items.Sort "[ReceivedTime]", False
        For i = Fldr.Items.Count To 1 Step -1 (вместо цикла нужен фильтр по конкретной дате)
          Set myItem = Fldr.Items.Item(i) 'Письмо
          With myItem
            myDate = Format(.ReceivedTime, "yyyy-mm-dd")
            If myDate < dat Then Exit For
            If (myDate = dat) Then
            ...


или так:

Код: Выделить всё
For Each Fldr In myFolder.Folders 'Все папки почты
      If Fldr.DefaultItemType = olMailItem Then
        Fldr.Items.Sort "[ReceivedTime]", False
        For Each myItem In Fldr.Items (вместо цикла нужен фильтр по конкретной дате)
          With myItem 'Письмо
            myDate = Format(.ReceivedTime, "yyyy-mm-dd")
            If myDate < dat Then Exit For
            If (myDate = dat) Then
            ...


Может хоть мой случай кому попадался?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Re: Outlook: как сделать фильтр???

Сообщение Rojohn » 08.09.2010 (Ср) 18:56

Придумал такую конструкцию:

Код: Выделить всё
Filter = "[ReceivedTime] = '2010-09-03'"
               Fldr.Items.Find(Filter)


Но такой синтаксис не подходит (не находит объект с Find). Может кто поправит?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Re: Outlook: как сделать фильтр???

Сообщение Rojohn » 09.09.2010 (Чт) 20:44

Насколько я понял, это делается примерно так:
Код: Выделить всё
Public m_SearchComplete As Boolean

Private Sub Application_AdvancedSearchComplete(ByVal SearchObject As Search)
    If SearchObject.Tag = "MySearch" Then
        m_SearchComplete = True
    End If
End Sub

m_SearchComplete = False
        Filter = "urn:schemas:mailheader:ReceivedTime = '2010-09-03'"
        Set MySearch = Outlook.AdvancedSearch(Fldr, Filter, True, "MySearch")
        While m_SearchComplete <> True
          DoEvents
        Wend
        Set MyTable = MySearch.GetTable


Подскажите только синтаксис, особенно для Filter... :?:
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Re: Outlook: как сделать фильтр???

Сообщение Rojohn » 13.09.2010 (Пн) 17:51

Пока пришёл к такому варианту:

Код: Выделить всё
For Each Fldr In myFolder.Folders 'Цикл по вложенным папкам (Входящие, Исходящие)
      If Fldr.DefaultItemType = olMailItem Then
        Filter = "[ReceivedTime] = #" & Format(dat, "MM\/dd\/yyyy") & "#"
        If Fldr.Items.Count <> 0 Then
          Set myOLItems = Fldr.Items.Restrict(Filter)
          Debug.Print myOLItems.Count

          For Each myItem In myOLItems
            With myItem 'Новое письмо
               ...

Но .Restrict ничего не находит, хотя и не ругается на формат фильтра. Вероятно к [ReceivedTime] тоже нужно применить Format, но как правильно? Кто-нибудь подскажет :?:
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Re: Outlook: как сделать фильтр???

Сообщение Rojohn » 14.09.2010 (Вт) 2:57

Усё, граждане эксперты - ловите супер-сложный код:

Код: Выделить всё
Filter = "([ReceivedTime] > '" & Format(DateAdd("d", -1, dat), "dd.MM.yyyy") & "') AND ([ReceivedTime] < '" & Format(DateAdd("d", 1, dat), "dd.MM.yyyy") & "')"


:wink:
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Re: Outlook: как сделать фильтр???

Сообщение Rojohn » 05.10.2010 (Вт) 11:03

Поторопился... почему-то достаются и письма за предыдущую дату. Вероятно даты каким-то чудом сравниваются и по времени, хотя вроде как не должны. Может кто знает как написать правильно :?: Вопрос очень насущный!
Спасибо заранее откликнувшимся :!:
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

Gloom
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 200
Зарегистрирован: 23.11.2004 (Вт) 15:57
Откуда: СПб

Re: Outlook: как сделать фильтр???

Сообщение Gloom » 24.10.2010 (Вс) 3:12

Код: Выделить всё
Filter = "[ReceivedTime] >= '" & Format(dat, "ddddd 0:00") & "' and [ReceivedTime] <= '" & Format(DateAdd("d", 1, dat), "ddddd 23:59") & "'"

или так:
Код: Выделить всё
Filter = "@SQL=""urn:schemas:httpmail:datereceived"" >= '" & Format(LocalTimeToUTC(dat), "ddddd 0:00") & "' and ""urn:schemas:httpmail:datereceived"" <= '" & Format(DateAdd("d", 1, LocalTimeToUTC(dat)), "ddddd 23:59") & "'"

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

Re: Outlook: как сделать фильтр???

Сообщение Rojohn » 24.10.2010 (Вс) 4:34

Спасибо за ответ!
А разве [ReceivedTime] <=Format(DateAdd("d", 1, dat), "ddddd 23:59") не будет затрагивать следующий день? Нужен-то только текущий...
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 7

    TopList