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 на срещата са един и същ документ (= същия UniqueId)?   -  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