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:

  1. Добавить первый категоризированный столбец ResourceName для mView
  2. Добавить второй категоризированный столбец StartDate для mView
  3. Измените свой код на:
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 )

Другие вопросы по тегам