Войти
 
 
   
 
  
Новости Notes.ру Библиотека Биржа труда Вопрос - ответ Форум Регистрация Поиск О проекте
Разделы
О Notes
Советы
Шаблоны и примеры
Литература
Презентации
 
Всё о задаче AdminP. Часть вторая   Во второй части мы завершаем рассмотрение AdminP. В ней рассмотрены запросы междоменного администрирования и способы управления функциями AdminP с помощью настроек документа сервера, команд консоли сервера, файла Notes.ini и интервалов очистки базы данных. В этой статье предполагается, что вы опытный администратор Domino и прочитали первую часть
О Notes Читать статью
 
Всё о задаче AdminP. Proxy-действия в R5 и Domino 6   Приложение к статье об административном процессе
О Notes Читать статью
 
Всё о задаче AdminP. Часть первая   Перевод классической статьи 2003-его года о задаче административного процесса (AdminP). Очень полезна для понимания работы механизма этой задачи. В первой части статьи описаны компоненты задачи AdminP, как они работают, и как их использование помогает сделать работу администратора Domino проще. Задача AdminP (сакращённо от Administration Process, Административный процесс) работает с базой административных запросов (Administration Requests, admin4.nsf)
О Notes Читать статью
 


Шаблоны и примеры

Главная   Библиотека   Шаблоны и примеры

Класс SortCollection

Андрей Черепанов, Красноярск
В Lotus Notes можно различными способами получить коллекцию документов (класс notesDocumentCollection), но часто расположение документов в полученной коллекции не удовлетворяет критериям обработки, а стандартные методы получения отсортированной коллекции слишком слабы для того, чтобы отвечать всем потребностям. Предлагаемый класс призван расширить возможности обработки документов. Он позволяет сортировать коллекцию документов по нескольким заданным критериям. В качестве критерия может выступать либо поле в документе, либо @-формула (Прим.: первый способ несколько быстрее).

Сортировка производится методом Шелла, за основу взят код с сайта MSDN (Прим.: в оригинале кода была орфографическая ошибка - отсутствовал пробел).

Код тестировался (и используется автором) для Lotus Notes 5.0.7a.

Определение класса

Option Public

' Библиотека SortCollection
' Класс "SortCollection" - сортировка коллекции документов по полям или @-формулам.
' Автор: Черепанов Андрей (aka DuChan) (duchan@mail.ru), 2004
' Метод New(notesDocumentCollection, FieldsName_Formulas, isFormulas)
' notesDocumentCollection - коллекция, которую необходимо отсортировать
' FieldsName_Formulas - массив строк с именами полей или @-формулами (не более 8)
' isFormulas - True, если в массиве FieldsName_Formulas @-формулы, False, если имена полей
' Свойство Result - отсортированная коллекция (notesDocumentCollection)

'Примечания:
'- Сортировка производится методом Шелла (Shell)
'- Сортировка производится только по возрастанию
'- Новая коллекция (отсортированная) создается из представления в базе данных исходной коллекции
' получаемому по notesDatabase.Views(0) - это необходимо учитывать при использовании...
' Если кто знает более быстрый и корректный способ получить пустую коллекцию – поделитесь.

Option Base 0
Private Type DocVals
' Структура для хранения информации (кэшировании) о документе и значениях
Vals(7) As Variant
vCount As Integer
doc As Variant
End Type

'********** КЛАСС "SORTCOLLECTION" **********************
Class SortCollection
Public Result As notesDocumentCollection
' **************** Private area *******************
Private nDC As notesDocumentCollection
Private FList() As String
Private MaxF As Integer
Private FCode As Variant

Private DC As Integer
Private SortArray() As Integer
Private Docs() As DocVals

'************** Методы класса *************************
' Конструктор!
Public Sub New(Coll As notesDocumentCollection, Formulas() As String, isFormulas As Variant)
' ********** Создаем экземпляр класса ***************
'Инициализируем данные
On Error Resume Next
If Coll Is Nothing Then Exit Sub
If Coll.Count <= 1 Then
Set Me.Result = Coll
Exit Sub
End If
Set nDC = Coll
If Ubound(Formulas)>=7 Then ' наложенное автором ограничение на число параметров сортировки
Redim FList(7)
MaxF=7
Else
MaxF=Ubound(Formulas)
Redim FList(MaxF)
End If
For i%=0 To MaxF
FList(i%)=Formulas(i%)
Next
FCode = isFormulas
DC = Coll.Count-1
Redim SortArray(DC)
Redim Docs(DC)
On Error Goto m1
For i%=0 To DC
Set Docs(i%).doc = Coll.GetNthDocument(i%+1)
If Docs(i%).doc.isValid Then
tmps$=Docs(i%).doc.Form(0)
SortArray(i%)=i%
Docs(i%).vCount=0
Else
m1:' из коллекции убираются все "не"-документы...
i%=i%-1
DC=DC-1
End If
Next
On Error Resume Next
' Сортировка
Call ShellSort()

'Создание новой коллекции документов
Dim vw As notesView
Dim key(0) As String
key(0)="{xxxYYYzzz}"
Set vw = Coll.Parent.Views(0)
Set Me.Result = vw.GetAllDocumentsByKey(key)
'и помещение в нее документов в соответствии с сортировкой
For i%=0 To DC
Call Me.Result.AddDocument(Docs(SortArray(i%)).doc)
Next
End Sub
'-----------------------------------------------------
'Сравнение двух документов
Private Function CompareResult(Indx2 As Integer, Indx1 As Integer) As Variant
Dim v1 As Variant, v2 As Variant
CompareResult = False
For i%=0 To MaxF
If Docs(Indx1).vCount<i%+1 Then
Call BuildVal(Indx1, i%)
End If
If Docs(Indx2).vCount<i%+1 Then
Call BuildVal(Indx2, i%)
End If
If Ubound(Docs(indx1).Vals(i%))=Ubound(Docs(indx2).Vals(i%)) Then
MaxV%=Ubound(Docs(indx1).Vals(i%))
WhoShorter%=0
Elseif Ubound(Docs(indx1).Vals(i%))<Ubound(Docs(indx2).Vals(i%)) Then
MaxV%=Ubound(Docs(indx1).Vals(i%))
WhoShorter%=1
Else
MaxV%=Ubound(Docs(indx2).Vals(i%))
WhoShorter%=2
End If

v1=Docs(indx1).Vals(i%)
v2=Docs(indx2).Vals(i%)
For j%=0 To MaxV%
If v1(j%)<v2(j%) Then
CompareResult=True
Exit Function
End If
If v1(j%)>v2(j%) Then
CompareResult=False
Exit Function
End If
Next
If WhoShorter%<>0 Then
If WhoShorter%=1 Then
CompareResult=True
Exit Function
Else
CompareResult=False
Exit Function
End If
End If
Next
End Function
'-----------------------------------------------------
'Получение значения поля/формулы
Private Sub BuildVal(Indx As Integer, F As Integer)
Dim nulArray(0) As Variant
nulArray(0)=""

If FCode Then
Docs(indx).Vals(F) = Evaluate(Me.FList(F), Docs(Indx).doc)
Else
Docs(indx).Vals(F) = Docs(Indx).doc.GetItemValue(Me.FList(F))
End If
If Not Isarray(Docs(indx).Vals(F) ) Then Docs(indx).Vals(F) =nulArray
Docs(Indx).vCount=F+1
End Sub

'-----------------------------------------------------
' Сортировка методом Шелла (Shell)
' http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnoffpro01/html/abettershellsortparti.asp
Sub ShellSort()
Dim TempVal As Integer
Dim i As Long, GapSize As Long, CurPos As Long
Dim FirstRow As Long, LastRow As Long, NumRows As Long
FirstRow = 0'Lbound
LastRow = DC'Ubound
NumRows = LastRow - FirstRow + 1
Do
GapSize = GapSize * 3 + 1
Loop Until GapSize > NumRows
Do
GapSize = GapSize \ 3
For i = (GapSize + FirstRow) To LastRow
CurPos = i
TempVal = Me.SortArray(i)
Do While CompareResult(Me.SortArray(CurPos - GapSize),TempVal)
Me.SortArray(CurPos) = Me.SortArray(CurPos - GapSize)
CurPos = CurPos - GapSize
If (CurPos - GapSize) < FirstRow Then Exit Do
Loop
Me.SortArray(CurPos) = TempVal
Next
Loop Until GapSize = 1
End Sub
End Class

Скачать текст класса >>>

Вы можете подключать его в проекты, используя директиву %INCLUDE в формате %INCLUDE "<путь\>SortCollection.lss", где указание пути является необязательным при размещении файла в программном каталоге Notes. Можете включить текст из этого файла в библиотеку программ (LotusScript Library) базы данных проекта

Вызов класса. Пример

Код агента
Option Public
%INCLUDE "SortCollection.lss"

Sub Initialize
Dim session As New NotesSession
Dim curdb As NotesDatabase
Dim docs As NotesDocumentCollection
Dim sortDocs As SortCollection
Dim key(0) As String
Dim doc As NotesDocument
Dim nextdoc As NotesDocument

Set curdb = session.CurrentDatabase
Set docs = curdb.AllDocuments
Set doc = docs.GetFirstDocument
Do
If doc Is Nothing Then Exit Do
Set nextdoc = docs.GetNextDocument(doc)
Print doc.GetItemValue("Form")(0)
Delete doc
Set doc = nextdoc
Loop
key(0) = "Form"
Set sortDocs = New SortCollection(docs, key, False)
Set docs = sortDocs.Result
Set doc = docs.GetFirstDocument
Do
If doc Is Nothing Then Exit Do
Set nextdoc = docs.GetNextDocument(doc)
Print doc.GetItemValue("Form")(0)
Delete doc
Set doc = nextdoc
Loop
Stop
End Sub
 
  Опубликовано — 02/21/2004 |    



Добавить комментарий
Имя * :
e-mail
Комментарий * :
Код подтверждения * :


Мероприятия
Пресс-релизы
Биржа труда
Последнее на форуме
 
А так же:
Как удалить профиль?
16.04.2016 00:08:51
Скопировать в буфер поле документа
24.05.2015 08:55:52
Импорт DXL-описания документов в Lotus Domino. Одноимённые поля
16.04.2015 16:49:58
 
© LOGOSPHERE.RU