Форум продуктов IBM Lotus
Общие вопросы => Разработка приложений => Тема начата: Kasher от 07 Июль 2011, 13:46:41
-
Добрый день!
Написала модуль, который разбирает входящие сообщения. Написан в Visual Studio 2005 на VB.NET. Планируется, что он будет запускаться автоматом через каждую минуту.
Его задача делать следующее: берет пришедшее письмо, сохраняет из него вложение (это xml-файл) в папку на компьютере, после этого перемещает данное письмо в другую папку "Loaded" в Lotus, а из Входящих удаляет.
Когда написано вот так:
If Not (nDoc1 Is Nothing) Then
Call nDoc1.PutInFolder("Loaded", False) ' помещение письма в папку Loaded
nDoc1.RemoveFromFolder("($Inbox)") ' удаление письма из папки Входящие
End If
то получается, что модуль отрабатывает не больше 3 писем, хотя во Входящих может лежать 10 писем. Т.е. программа думает, что входящих больше нет и останавливается.
А если написано вот так, то отрабатываются все письма:
If Not (nDoc1 Is Nothing) Then
nDoc1.remove(True)
End If
но соответственно, письма не помещаются в папку "Loaded", а только удаляются из Входящих.
Подскажите пожалуйста, как нужно все-таки правильно написать это самое перемещение и при этом отработать все входящие письма?
-
все, что удалось пока найти по своей проблеме это вот
http://web3.inttrust.ru/Site/itforum.nsf/all/33B9BACBD9E52BFAC32576E100235405?OpenDocument (http://web3.inttrust.ru/Site/itforum.nsf/all/33B9BACBD9E52BFAC32576E100235405?OpenDocument)
но честно сказать так и не поняла, решилась там проблема эта или нет. Помогите разобраться пожалуйста.
-
Проблему решила следующим образом:
Sub Main()
Dim s As New NotesSession
Dim db As NotesDatabase
Dim View As Object
Dim nDoc As Object
Dim nDoc1 As Object
Dim itm As Object
Dim sPathToSave As String
sPathToSave = "C:\temp\lotus\"
Const RICHTEXT = 1
Const EMBED_ATTACHMENT = 1454
s.Initialize("password")
db = s.GetDatabase("test/test2/ru", "orders.nsf", False)
View = db.GetView("($Inbox)")
View.AutoUpdate = False
nDoc = View.GetFirstDocument
While Not (nDoc Is Nothing)
nDoc = View.GetFirstDocument
If nDoc.HasEmbedded Then
itm = nDoc.GetFirstItem("Body")
If itm.Type = RICHTEXT Then
Dim attch As Object
For Each attch In itm.EmbeddedObjects
If (attch.Type = EMBED_ATTACHMENT) Then
attch.ExtractFile(sPathToSave & attch.Name)
End If
Next
End If
End If
nDoc1 = nDoc
nDoc = View.GetNextDocument(nDoc)
'удаление письма
If Not (nDoc1 Is Nothing) Then
Call nDoc1.PutInFolder("Loaded", False) ' помещение письма в папку Loaded
nDoc1.RemoveFromFolder("($Inbox)") ' удаление письма из папки Входящие
End If
End While
End Sub
Т.е. продублировала строку
nDoc = View.GetFirstDocument
While Not (nDoc Is Nothing)
nDoc = View.GetFirstDocument
И все, проблема решилась, модуль разбирает все входящие письма.
-
Спасибо за описание решения!
-
ИМХО может не всегда работать, лучше как на интертастовском форуме:
Set DocNext = dc.GetFirstDocument
While Not(docnext Is Nothing)
Set doc = docNext ' получаем ссылку на doc, который нам уже не нужен,
Set docnext = dc.GetNextDocument(doc) ' т.к. следующий у нас уже есть ))
'...
Call doc.PutInFolder("Loaded", False) 'делаем с doc что угодно, да хоть Delete doc (у нас в "буфере" docnext)
Call doc.RemoveFromFolder("($Inbox)")
'... а документик то уже тю-тю,нету его больше в коллекции, не счего уже получать GetNextDocument
Wend
Так что никакой мистики нет: удаляете док из коллекции с помощью Call doc.RemoveFromFolder("($Inbox)"), поэтому и не можете на основе его получить следующий документ.