Notesuiview.documents Порядок

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 585
271
#1
как часто вы оказываетесь в ситуации, когда вот так...
и вам нужен порядок как во вьюшке а не по порядку добавления доков в БД (вышеозначенная ф-ция выдаст именно в нем)
небольшой ПОК(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">
Код:
%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
суть сего экзерциза - получить "правильный" порядок следования и с родителем (рассматривается вариант родителя и чайлдов), т.е. - как видим
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 585
271
#2
у меня есть нек. подозрения, что поиск в навигаторе осущ. перебором, но вот детали надо снифать
отседова возможен вариант с явным хэшированием по unid
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 585
271
#3
<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">
Код:
	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">
Код:
	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 я не могу
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 585
271
#4
т.о. из снифа можно заключить, что перебор осущ. серверной частью - что +
т.е. мы избавляемся от цикла перебора для поиска соответствия дока коллекции навигатора