Domino Designer - документ не отображается <мой взгляд>
У меня есть следующий код, который просматривает документы в TestView1, и для каждого документа в этом представлении циклически просматривает документы в TestView2, выполняя какое-то действие (вывод в файл).
Для того, чтобы циклы были относительно своевременными (есть куча более старых документов, и я хочу, чтобы только те отметили время с сегодняшнего дня или предстоящей даты), я нашел первый документ на текущую дату и сохранил его UNID, чтобы этот документ мог выступать в качестве начальной позиции для внутреннего цикла (документы в MyView2 расположены в хронологическом порядке).
Внутренний цикл работает правильно с первого раза, но при втором цикле я получаю сообщение об ошибке "Документ не виден TestView2". Я добавил, какая строка ломает мой код.
Вот мой код:
Dim sess As New NotesSession
Dim db As NotesDatabase
Dim rDoc As NotesDocument
Dim mDoc As NotesDocument
Dim rView As NotesView
Dim mView As NotesView
Dim unid As String
Dim todayDateTime As New NotesDateTime("Today")
Set db = sess.currentDatabase
Set rView = db.GetView("TestView1")
Set rDoc = rView.GetFirstDocument
Set mView = db.GetView("TestView2")
Set mDoc = mView.GetFirstDocument
Set mDoc = mView.GetFirstDocumentb 'Finds the UNID of the first document of the day
Do While Not (mDoc Is Nothing)
Dim startDate As New NotesDateTime(mDoc.startDate(0))
If startDate.DateOnly = todayDateTime.DateOnly Then
unid$ = mDoc.UniversalID
Exit Do
End If
Set mDoc = mView.GetNextDocument(mDoc)
Loop
While Not (rDoc Is Nothing) 'Outer Loop
If rDoc.Site(0) = "SAMPLE" Then
<CODE>
If Not unid$ = "" Then
Set mDoc = db.Getdocumentbyunid(unid$)
While Not (mDoc Is Nothing) 'Inner Loop
If mDoc.ResourceName(0) = rName$ Then
<PRINT TO FILE CODE>
End If
Set mDoc = mView.GetNextDocument(mDoc) <--- This line here breaks the code**
Wend
End If
End If
Set rDoc = rView.GetNextDocument(rDoc)
Wend
Буду признателен за любую помощь.
2 ответа
Существует более эффективный подход: классифицируйте ваш mView по ResourceName + StartDate и используйте mView.getDocumentByKey(keys, true)
чтобы получить доступ к первому соответствующему документу в mView:
- Добавить первый категоризированный столбец
ResourceName
для mView - Добавить второй категоризированный столбец
StartDate
для mView - Измените свой код на:
Dim sess As New NotesSession
Dim db As NotesDatabase
Dim rDoc As NotesDocument
Dim mDoc As NotesDocument
Dim rView As NotesView
Dim mView As NotesView
Dim rName As String
Dim keys(1) As Variant
Set db = sess.currentDatabase
Set rView = db.GetView("TestView1")
Set rDoc = rView.GetFirstDocument
Set mView = db.GetView("TestView2")
While Not (rDoc Is Nothing)
If rDoc.Site(0) = "SAMPLE" Then
rName = rDoc.ResourceName(0)
' <CODE>
keys(0) = rName
keys(1) = Today
Set mDoc = mView.GetdocumentbyKey(keys, true)
While Not (mDoc Is Nothing)
If mDoc.ResourceName(0) = rName Then
' <Print To FILE CODE>
Set mDoc = mView.GetNextDocument(mDoc)
Else
Set mDoc = Nothing
End if
Wend
End If
Set rDoc = rView.GetNextDocument(rDoc)
Wend
Все довольно просто: когда вы получаете документ через его unid, вы НЕ получаете его из представления. Таким образом, вы не получите "следующий" документ. Вам нужно "получить" документ из представления, чтобы иметь возможность перемещаться.
Попробуй это:
Dim viewNav as NotesViewNavigator
Set viewNav = mView.CreateViewNav
...
Set mDoc = db.Getdocumentbyunid(unid$)
'- now get the same document, but this time from view:
Set mDoc = viewNav.getEntry( mDoc ).Document
Это должно помочь.
Хотя mDoc остается тем же документом, на этот раз он инициализируется из представления и может использоваться в "GetNextDocument"...
Между прочим: использование NotesViewNavigator в моем опыте в большинстве случаев позволяет быстрее переключаться между представлениями, чем использование "нативных" методов NotesView.
РЕДАКТИРОВАТЬ: То же самое может произойти, если у вас есть NotesDocument, который находится в NotesDocumentCollection, но не берется непосредственно оттуда. Тогда вы получите ошибку "документ не из этой коллекции". Есть такой же метод: Set doc=collection.GetDocument( doc )