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

Был бы признателен за любую помощь.


person Andre C    schedule 15.07.2014    source источник
comment
Вы сохраняете документ во внутреннем цикле, чтобы он больше не отображался в списке? Если да, получите следующий документ перед сохранением текущего.   -  person Knut Herrmann    schedule 15.07.2014
comment
Нет, я ничего не делаю с самим документом. Все, что я делаю, это экспортирую кучу его полей в файл. Кроме того, он полностью работает для первого внешнего цикла, но как только начинается вторая итерация внешнего цикла, он прерывается ... Я считаю, что это как-то связано с тем, когда я возвращаюсь к первому документу для второго раунда итераций   -  person Andre C    schedule 15.07.2014
comment
Я верю в это, потому что, если бы это было не так, это не было бы выполнено, не так ли? Установите mDoc = mView.GetNextDocument (mDoc)   -  person Andre C    schedule 15.07.2014
comment
Но Set mDoc = mView.GetNextDocument (mDoc) на самом деле успешно выполняется около 80 раз, завершая внутренний цикл. Только на второй итерации внешнего цикла (rDoc) он терпит неудачу.   -  person Andre C    schedule 15.07.2014
comment
rDoc принадлежит rView .. По сути, rView имеет группу комнат, причем каждая rDoc представляет собой одну комнату, а mView - это группа собраний, где mDoc является одной встречей. Я прохожу по каждой комнате и извлекаю собрания в этой конкретной комнате, затем перехожу в следующую комнату. Он отлично работает для первой комнаты (и отлично работает полностью, если я не пытаюсь установить начальный mDoc и просто использую GetFirstDocument), но как только я добираюсь до второй комнаты, он терпит неудачу   -  person Andre C    schedule 15.07.2014
comment
Действительно ли rDoc комнаты и mDoc встречи - это один и тот же документ (= один и тот же уникальный идентификатор)?   -  person Knut Herrmann    schedule 15.07.2014
comment
Нет, для этого я сравниваю имя комнаты в rDoc с полем, в котором имя комнаты хранится в mDoc. И это происходит только тогда, когда я пытаюсь использовать UNID, чтобы начать просмотр с сегодняшних встреч. Если я оставлю эту часть и пройду через все встречи, это сработает ...   -  person Andre C    schedule 15.07.2014
comment
О, я вижу. Вы всегда начинаете с одного и того же документа в mView. Хм, должно получиться так ...   -  person Knut Herrmann    schedule 15.07.2014
comment
Есть ли причина, по которой вы не сортируете свой mView по комнате / дате + времени и не получаете первую встречу с mView.GetDocumentByKey ()?   -  person Knut Herrmann    schedule 15.07.2014
comment
Была - это рабочая БД, у меня нет полномочий вносить такие изменения - но мне удалось найти представление в уже организованной базе данных, и ваш код отлично работал. Спасибо   -  person Andre C    schedule 16.07.2014


Ответы (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
person Knut Herrmann    schedule 15.07.2014

Все очень просто: когда вы получаете документ через его 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 )

person Torsten Link    schedule 15.07.2014