Notesuiview.documents Порядок

Тема в разделе "Lotus - Программирование", создана пользователем lmike, 14 авг 2014.

  1. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    и вам нужен порядок как во вьюшке а не по порядку добавления доков в БД (вышеозначенная ф-ция выдаст именно в нем)
    небольшой ПОК(Proof Of Concept)
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"LS"</div></div><div class="sp-body"><div class="sp-content">
    Код (LotusScript):
    %REM
    *--------------------------------------------
    Function EnumDCbyView
    Description: расставляет документы по порядку следования во вью
    у доков находим $REF и по нему группируем
    %END REM

    Function Enum4ParentByView(NDC As NotesDocumentCollection, view As NotesView) As NotesDocumentCollection
    Dim routineName As String
    routineName="EnumDCbyView"
    On Error GoTo ErrH
    'your code here
    Dim res As NotesDocumentCollection:Set res=db.CreateDocumentCollection()
    Dim lstByParent List As Variant, lstNavParent List As NotesViewNavigator
    Dim punid As String, doc As NotesDocument
    Set doc=NDC.Getfirstdocument():punid=doc.Parentdocumentunid
    Do While Not doc Is Nothing
    Dim tmp As String:tmp=doc.Parentdocumentunid
    Dim tmpdoc As NotesDocument, cnt As Long
    Print {unid:} &doc.Universalid &{;parent:} &tmp
    If Len(tmp)<1 Then tmp=doc.Universalid
    Dim entry As NotesViewEntry
    If Not IsElement(lstByParent(tmp)) Then
    Set tmpdoc=db.Getdocumentbyunid(tmp)
    Dim nav As NotesViewNavigator
    Set nav=view.Createviewnav()
    Set entry=nav.GetEntry(tmpdoc)
    Print {Pos:} &entry.Getposition({.})
    'Set tmpdoc=view.Getdocumentbykey(tmpdoc.Getitemvalue(keyfld), true)
    Set lstNavParent(tmp)=view.Createviewnavfromdescendants(entry)
    cnt=lstNavParent(tmp).Count
    'создаем разреженый массив
    Dim arr() As NotesDocument:ReDim arr(cnt) As NotesDocument
    Set arr(0)=entry.Document
    lstByParent(tmp)=arr
    End If
    If Not tmp=doc.Universalid then
    Set entry=lstNavParent(tmp).GetEntry(doc)
    Print {Pos:} &entry.Getposition({.})
    Dim pos As Integer:pos=CInt(StrRight(entry.Getposition({.}),{.}))
    Dim v:v=lstByParent(tmp)
    Set v(pos)=doc
    End If
    Set doc=NDC.Getnextdocument(doc)
    Loop
    ForAll chlds In lstByParent
    ForAll chld In chlds
    If Not chld Is Nothing Then Call res.Adddocument(chld)
    End ForAll
    End ForAll
    Set Enum4ParentByView=res
    Quit:
    Exit Function
    ErrH:
    Error Err, RaiseError
    Resume Quit
    End Function
    суть сего экзерциза - получить "правильный" порядок следования и с родителем (рассматривается вариант родителя и чайлдов), т.е. - как видим
     
  2. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    у меня есть нек. подозрения, что поиск в навигаторе осущ. перебором, но вот детали надо снифать
    отседова возможен вариант с явным хэшированием по unid
     
  3. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"1 код"</div></div><div class="sp-body"><div class="sp-content">
    Код (LotusScript):
        Set doc=NDC.Getfirstdocument():punid=doc.Parentdocumentunid
    Do While Not doc Is Nothing
    Dim tmp As String:tmp=doc.Parentdocumentunid
    Dim tmpdoc As NotesDocument, cnt As Long
    Print {unid:} &doc.Universalid &{;parent:} &tmp
    If Len(tmp)<1 Then tmp=doc.Universalid
    Dim entry As NotesViewEntry
    If Not IsElement(lstByParent(tmp)) Then
    Set tmpdoc=db.Getdocumentbyunid(tmp)
    Dim nav As NotesViewNavigator
    Set nav=view.Createviewnav()
    Set entry=nav.GetEntry(tmpdoc)
    Print {Pos:} &entry.Getposition({.})
    'Set tmpdoc=view.Getdocumentbykey(tmpdoc.Getitemvalue(keyfld), true)
    '           Set lstNavParent(tmp)=view.Createviewnavfromdescendants(entry)
    '           cnt=lstNavParent(tmp).Count
    'создаем разреженый массив
    '           Dim arr() As NotesDocument:ReDim arr(cnt) As NotesDocument
    '           Set arr(0)=entry.Document
    '           lstByParent(tmp)=arr
    End If
    '       If Not tmp=doc.Universalid then
    '           Set entry=lstNavParent(tmp).GetEntry(doc)
    '           Print {Pos:} &entry.Getposition({.})
    '           Dim pos As Integer:pos=CInt(StrRight(entry.Getposition({.}),{.}))
    '           Dim v:v=lstByParent(tmp)
    '           Set v(pos)=doc
    '       End If
    Set doc=NDC.Getnextdocument(doc)
    Loop
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"2 код"</div></div><div class="sp-body"><div class="sp-content">
    Код (LotusScript):
        Set doc=NDC.Getfirstdocument():punid=doc.Parentdocumentunid
    Do While Not doc Is Nothing
    Dim tmp As String:tmp=doc.Parentdocumentunid
    Dim tmpdoc As NotesDocument, cnt As Long
    Print {unid:} &doc.Universalid &{;parent:} &tmp
    If Len(tmp)<1 Then tmp=doc.Universalid
    Dim entry As NotesViewEntry
    If Not IsElement(lstByParent(tmp)) Then
    Set tmpdoc=db.Getdocumentbyunid(tmp)
    Dim nav As NotesViewNavigator
    Set nav=view.Createviewnav()
    '           Set entry=nav.GetEntry(tmpdoc)
    '           Print {Pos:} &entry.Getposition({.})
    'Set tmpdoc=view.Getdocumentbykey(tmpdoc.Getitemvalue(keyfld), true)
    '           Set lstNavParent(tmp)=view.Createviewnavfromdescendants(entry)
    '           cnt=lstNavParent(tmp).Count
    'создаем разреженый массив
    '           Dim arr() As NotesDocument:ReDim arr(cnt) As NotesDocument
    '           Set arr(0)=entry.Document
    '           lstByParent(tmp)=arr
    End If
    '       If Not tmp=doc.Universalid then
    '           Set entry=lstNavParent(tmp).GetEntry(doc)
    '           Print {Pos:} &entry.Getposition({.})
    '           Dim pos As Integer:pos=CInt(StrRight(entry.Getposition({.}),{.}))
    '           Dim v:v=lstByParent(tmp)
    '           Set v(pos)=doc
    '       End If
    Set doc=NDC.Getnextdocument(doc)
    Loop
    ниже результат kdiff
    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"1 сниф"</div></div><div class="sp-body"><div class="sp-content">OPEN_NOTE
    OPEN_NOTE
    READ_OBJECT
    READ_OBJECT
    GET_NOTE_INFO_BY_UNID
    OPEN_NOTE
    DB_REPLINFO_GET
    OPEN_NOTE
    GET_NOTE_INFO_BY_UNID
    OPEN_NOTE
    OPEN_NOTE
    GET_NOTE_INFO_BY_UNID
    OPEN_NOTE
    LOCATE_NOTE
    READ_ENTRIES
    OPEN_NOTE

    GET_OBJECT_SIZE
    WRITE_OBJECT
    WRITE_OBJECT
    UPDATE_COLLECTION
    GET_MODIFIED_NOTES
    READ_ENTRIE<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"2 сниф"</div></div><div class="sp-body"><div class="sp-content">OPEN_NOTE
    OPEN_NOTE
    READ_OBJECT
    READ_OBJECT
    GET_NOTE_INFO_BY_UNID
    OPEN_NOTE
    OPEN_NOTE
    DB_REPLINFO_GET
    OPEN_NOTE
    GET_NOTE_INFO_BY_UNID
    OPEN_NOTE
    OPEN_NOTE
    GET_NOTE_INFO_BY_UNID
    GET_OBJECT_SIZE
    WRITE_OBJECT
    WRITE_OBJECT
    UPDATE_COLLECTION
    GET_MODIFIED_NOTES
    READ_ENTRIES
    объяснить лишнюю OPEN NOTE я не могу
     
  4. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.079
    Симпатии:
    300
    т.о. из снифа можно заключить, что перебор осущ. серверной частью - что +
    т.е. мы избавляемся от цикла перебора для поиска соответствия дока коллекции навигатора
     
  5. Akupaka

    Akupaka А че я?.. О.о

    Регистрация:
    4 окт 2007
    Сообщения:
    3.373
    Симпатии:
    2
    Тихо сам с собою... :(
     
  6. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Akupaka
    Так с умным человеком не грех =)
     
Загрузка...
Похожие Темы - Notesuiview documents Порядок
  1. Amfion
    Ответов:
    0
    Просмотров:
    477
  2. rinsk
    Ответов:
    12
    Просмотров:
    1.863
  3. dimat
    Ответов:
    13
    Просмотров:
    5.615
  4. NickProstoNick
    Ответов:
    7
    Просмотров:
    3.293
  5. dimat
    Ответов:
    5
    Просмотров:
    2.864

Поделиться этой страницей