Нужен совет!

  • Автор темы Автор темы kilcher
  • Дата начала Дата начала
Это как? Объясню подробней задачу:из первой коллекции(которую создает пользователь),необходимо взять номер шаблона документа. Когда знаем номер,то подтягиваем(создаем еще одну коллекцию) поддокументы которые всегда должны быть при выборе этого шаблона.

ну так правильно. создай вид (можно даже в другой базе... потом просто вызовешь его) с обязательными шаблонами и скатегоризуй их по номеру шаблона документа ( ну или как там у тебя идентификация происходит ).
а потом когда пользователь выберет что ему нужно - получи из этого вида коллекцию GetAllDocumentsByKey где key - твой номер шаблона... или что там у тебя... и все
 
На прямую в ряд ли.
Можно использовать Folder.. Коллекция -> Folder -> Коллекция -> Folder -> Коллекция :(
 
set doc = c1.getfirstdocument
while not doc is nothing
call c2.addDocument(doc)
set doc = c1.getnextdocument(doc)
wend

так можно
:wacko: Я так пробовала уже. Почему то выдает ошибку,что данные документы находятся в другой базе и не могут быть добавлены.
Я вот думаю проблема в том,что я вторую коллекцию(которую нужно добавить)получаю из результатов первой.Т.е.
set doc = c1.getfirstdocument
while not doc is nothing
skServ= doc.GetItemValue("k1")(0)
Set c2= view.GetAllDocumentsByKey(skServ, False)
'''''Обработка документов из с1
set doc = c1.getnextdocument(doc)
wend
Вот так
 
хе... конечно.... если они действительно в другой базе

а какие сложности если просто держать две переменных коллекции?


т.е. ты получаешь 2 коллекции из одной и той же базы или из двух разных?

я правда не пробовал клеять коллекции... обхожусь вложенными циклами... но проблем с коллекцией из другой базы небыло. да и работать так проще.
Думаю ты все равно будешь писать условия для определения чего-то там...


ОООО. Попробуй клеять в новую пустую коллекцию
Например объяви ее как
Код:
Dim MyCol as New NotesDocumentCollection
 
хе... конечно.... если они действительно в другой базе

а какие сложности если просто держать две переменных коллекции?
После создания коллекции из этих доков беруться определенные данные и создаются на их основе новые доки уже в этой базе.
Распишу подробнее:
Первой коллекцией мы выбираем документы (шаблоны процессов и их подпроцессы).
В каждом таком шаблоне есть подпроцессы,которые следует обязательно выбрать пользователю(даже если он не выбрал принудительно добавить их в коллекцию первую).
После того как пользователь выбрал нужные доки,из каждого берем его номер и ищем обязательные его подпроцессы(составляем коллекцию 2).
После этого создаем новые доки в текущей базе на основе отобранных.
Надеюсь не очень сумбурно объяснила.
Так вот проблема в том,что если в одном шаблоне выбрано несколько подпроцессов,то вторая коллекция дублируется столько раз сколько этих подпроцессов(с одним номером шаблона)выбрано.
 
ааа.... надеюсь я правильно понял... Процессы и подпроцессы - это определенные действия над документом?
У нас подобное... но все процессы и подпроцессы в одной базе.

Так вот... мы используем номера процессов... точнее говоря UniversalID... это номер у процесса не меняется а подпроцессы ссылаются на него по $REF
А в документ прописывается номер нужного процесса. Затем серверный агент берет документ... ищет его процесс и делает то что надо из процесса и подпроцессов... в конце прописывает номер следующего процесса. и все.

у тебя в коде есть такая строка
Код:
Set c2= view.GetAllDocumentsByKey(skServ, False)
Я может и не прав, но мне кажется что False надо поменять на True. Сейчас у тебя отбираются любые документы которые начинаются со значения в skServ
Думаю это решит проблему дублирования
 
Dim reviewCol As NotesDocumentCollection
Dim reviewDoc As NotesDocument
Dim ws As New NotesUIWorkspace
Dim reviewdb As NotesDatabase, db As NotesDatabase
Set reviewdb = ws.currentDatabase.Database
Dim doc As NotesDocument,docB As NotesDocument
Dim i As Long
Dim uidoc As NotesUIDocument
Dim revvid() As String
Set db = ws.CurrentDatabase.Database
Dim note As NotesDocument, docs As NotesDocument
Dim rtitem As Variant,rtitem1 As Variant
'Dim docs As NotesDocumentCollection
Dim skServ As String,skServ1 As String
Dim skServint As Variant
Set reviewDoc = ws.CurrentDocument.Document
Set uidoc= ws.CurrentDocument
Set note = uidoc.Document
Set reviewCol= ws.PickListCollection(PICKLIST_CUSTOM, True, "RB/Rb/RU","intra-design\Procedure.nsf " , "stru2", "Выбор процедуры", "Выберите нужные процедуры" )
Dim db1 As New NotesDatabase( "RB/Rb/RU", "intra-design\Procedure.nsf " )
Dim collection As NotesDocumentCollection
Dim item As NotesItem
Dim view As NotesView
Dim skServs() As Variant
Dim dateTime As New NotesDateTime( "" )
'''''''''''''''''рассматриваем первую коллекцию
If reviewCol.count = 0 Then Exit Sub
reviewDoc.tasks= ""
Redim revvid(max)
revvid(0)=""
For i = 1 To reviewCol.count

Set doc = reviewCol.GetNthDocument(i)

skServ= doc.GetItemValue("k1")(0) '''''''берем значение номера шаблона

Set view=db1.GetView("(All1)")

Set collection= view.GetAllDocumentsByKey(skServ, False)
'''''рассматриваем вторую коллекцию и создаем новые доки в текущей базе
Set docs = collection .GetFirstDocument()
While Not(docs Is Nothing)
' Call reviewCol.addDocument(docs)

Set docB = New NotesDocument( db )

Call docB.AppendItemValue( "Form", "works" )
Call docB.AppendItemValue( "order_id", reviewDoc.order_id(0) )
Call docB.AppendItemValue( "member_name", reviewDoc.member_name )

Call docs.CopyAllItems(docB, False)
If docs.HasItem("Body") Then
Set rtitem = docs.GetFirstItem("Body")
docB.RemoveItem("Body")
Call rtitem.CopyItemToDocument(docB, "Body")
Set rtitem1= New NotesRichTextItem( docB, "Body1" )
Call rtitem1.AppendDocLink( docs, db.Title)

Else
docs.CopyBody = True
End If



Call docB.Save(True,True,True)

Set docs = collection.GetNextDocument(docs)


Wend
'''''''далее обрабатываем первую коллекцию

If max >0 Or revvid(0) <> "" Then
max = max +1
Redim Preserve revvid (max)

End If


If Not doc.HasItem("ProcName") Then
revvid (max) = "нет процедуры"
Elseif doc.ProcName(0) ="" Then
revvid (max) = "нет процедуры"
Else
revvid (max) = doc.ProcName(0)
End If

'''''по ней так же создаем документы
Set docB = New NotesDocument( db )

Call docB.AppendItemValue( "Form", "works" )
Call docB.AppendItemValue( "order_id", reviewDoc.order_id(0) )
Call docB.AppendItemValue( "member_name", reviewDoc.member_name)

Call doc.CopyAllItems(docB, False)
If doc.HasItem("Body") Then
Set rtitem = doc.GetFirstItem("Body")
docB.RemoveItem("Body")
Call rtitem.CopyItemToDocument(docB, "Body")
Set rtitem1= New NotesRichTextItem( docB, "Body1" )
Call rtitem1.AppendDocLink( doc, db.Title)

Else
doc.CopyBody = True
End If
Call docB.Save(True,True,True)

Next

reviewDoc.tasks= revvid

Set doc = reviewCol.GetNextDocument( doc )

Exit Sub


Эта одна из вариаций кода.Пробавала вместо создания новых документов в рассмотрении второй коллекции запихнуть документы из нее в первую.

Уже совсем перестала петрить в чем тут заковырка. :wacko:
 
прости, но это изврат... как по мне... особенно создание документов. если конечно нет необходимости менять занчение полей.
Если нужен идентичный документ - просто скопируй!

у документа есть метод CopyToDatabase
Код:
Copies a document into the specified database.
Defined in
NotesDocument
Syntax
Set newNotesDocument = notesDocument.CopyToDatabase( notesDatabase )
а относительно копий.... это в начале цикла
Код:
Set doc = reviewCol.GetNthDocument(i)
или это в конце
Код:
Set doc = reviewCol.GetNextDocument( doc )
определись... надо пльзовать что-то одно.

ну и как я уже писал про параметр False. Мне кажется надо True
Код:
Set c2= view.GetAllDocumentsByKey(skServ, False)
это работать не будет для документов из другой базы
Код:
' Call reviewCol.addDocument(docs)
И еще... совет... не пиши больше так... разграничивай... разделяй логические блоки... читать код невозможно
пробелы и знаки табуляции никто не отменял
 
Спасибо. Извиняюсь,если замучала . Буду исправляться! И искать в чем проблема. True не помогло :(
 
Кое-что понятнее стало. Хотя код надо бы причесать.
Решил много не писать.
Код:
Set reviewCol= ws.PickListCollection(PICKLIST_CUSTOM, True, "RB/Rb/RU","intra-design\Procedure.nsf " , "stru2", "Выбор процедуры", "Выберите нужные процедуры" )
Этой строчкой ты выбираешь как шаблоны процессов, так и шаблоны подпроцессов?
Если так, то потом ты выбираешь обязательные подпроцессы как для шаблонов процессов, так и для шаблонов подпроцессов:
Код:
Set collection= view.GetAllDocumentsByKey(skServ, False)
Это неправильно. Нужно выбрать только для шаблонов процессов.
Т.е. добавь проверку:
Код:
If doc - шаблон процесса Then
Set collection= view.GetAllDocumentsByKey(skServ, False)
' и так далее. Создаем обязательные подпроцессы.
Else
' создаем выбранные подпроцессы.
End if
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!