Lotus Domino не может перемещать вложенные документы из одного документа в другой? - PullRequest
1 голос
/ 06 октября 2011

Наш разработчик Domino сказал нам, что «технологически невозможно» перемещать вложенные документы между документами.Это правда?

Ранее в этом году он написал для нас систему регистрации курсов со следующей схемой базы данных:

database diagram

Теперь мы спросили его, как переместить список ожиданиярегистрироваться от полных учебных занятий до тех, которые не являются.Он сказал, что это невозможно.Он сказал, что нам нужно повторно ввести (заново создать, скопировать и вставить вручную) записи списка ожидания, поскольку Domino не может перемещать посетителей из одного сеанса в другой.

У нас более 1000 участников в наших списках ожидания.

Он прав?Это по-настоящему?Надеемся на решение.

Ответы [ 4 ]

2 голосов
/ 06 октября 2011

Как это сделать, зависит от того, как связаны документы.Но в любом случае необходимо связать документы, используя код (формула / lotusscript / java).

Помощь дизайнера Lotus содержит много информации о разработке приложений.Другой ресурс - IBM developerWorks

Существует множество связанных с Lotus блогов

Из справки Lotus Designer: MakeResponse: делает один документ ответом другомудокумент.Оба документа должны находиться в одной базе данных.

Dim session As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim docA As NotesDocument
Dim docB As NotesDocument
Set db = session.CurrentDatabase
Set view = db.GetView( "All documents" )
Set docA = view.GetFirstDocument
Set docB = view.GetNextDocument( docA )
Call docB.MakeResponse( docA )
docB.Form = "Response"
Call docB.Save( True, True )
1 голос
/ 06 октября 2011

Существует два способа связать документы: - с помощью ключей, программным способом - иерархически, используя ссылку «документ-ответ» (т.е. parent-child)

Если существует только логическая ссылка, используяключи, вам нужно только адаптировать ключевые поля.Если есть «физическая» ссылка документ-ответ, вы можете легко разорвать и воссоздать эту ссылку.В LotusScript есть метод NotesDocument.MakeResponse для присоединения любого документа к новому родителю.Если используются оба метода, разумеется, избыточные, но практичные, когда вам нужно восстановить некоторые ссылки, вам нужно выполнить оба изменения.Обычно некоторые ключевые поля повторяются от родительского к дочернему

. Просто для целей тестирования вы можете попробовать это: - выбрать документ ответа, который вы хотите повесить в другом месте - Ctrl-X - выбрать новый родительский документ - Ctrl-V

Сделайте это в тестовой базе данных, поскольку ключевые поля не будут обновляться автоматически.Кстати: код может быть написан для восстановления ключей после вставки такого ответного документа.

0 голосов
/ 07 октября 2011

Есть в основном два способа связать эти данные в модели данных, которую вы описываете.Если данные связаны через иерархии ответных документов, они будут немного отличаться от ключевых структур документов.

Покажите это своему разработчику, и он должен буквально иметь возможность подключить код, чтобы включить требования «переместить участников», о которых вы говорите.

Несколько вещей, на которые следует обратить внимание.

  • Я предполагаю, что все данные, которыми вы должны манипулировать, находятся в одной базе данных.
  • Я беру вашу диаграмму, которую вы предоставили буквально.
  • Для структур документов на основе ключей вам необходимо проверить используемые представления и значения ключей, чтобы найти документы участников.В частности, проверьте эти 2 строки в подразделе «MoveAttendeesKeyBased»:

    Set vwAttendeesByCourseID = db.GetView ("(LkupAllAttendeesByCourseID)")

    Set dcAttendees = vwysedeDourDourDourCoursetDourCoursetDourCourseDD0CourseFD0CourseFD (0BC)), True)

  • Код предназначен для просмотра поля с именами «CourseID», «Status» и значения «Wait Listed» для значения статуса участников, которые необходимо переместить.

  • На написание обеих версий этой функции потребовалось около 20 минут.

Для структур документов на основе ответов

Sub MoveAttendeesResponseBased(docCourseFrom As notesDocument, docCourseTo As NotesDocument)
%REM
    A simple move attendees function if the relationship between courses and attendees is based on
    response document hierarchies
%END REM
    On Error Goto errHandle
    Dim dcAttendees As notesDocumentCollection
    Dim docAttendee As notesDocument
    Dim iAvailablePlaces As Integer
    Dim bMoved As Boolean

    If Not (docCourseFrom Is Nothing Or docCourseTo Is Nothing) Then        
        iAvailablePlaces = docCourseTo.availablePlaces(0)
        If 0 < iAvailablePlaces Then
            bMoved = False
            Set dcAttendees = docCourseFrom.Responses
            Set docAttendee = dcAttendees.GetFirstDocument
            While Not docAttendee Is Nothing And 0 < iAvailablePlaces
                If Ucase(Trim(docAttendee.Status(0)))= "WAIT LISTED" Then
                    Call docAttendee.MakeResponse(docCourseTo)
                    If docAttendee.Save(True,True) Then
                        iAvailablePlaces = iAvailablePlaces - 1
                        bMoved = True
                    End If
                End If
                Set docAttendee = dcAttendees.GetNextDocument(docAttendee)
            Wend
            If bMoved Then
                docCourseTo.availablePlaces = iAvailablePlaces
                Call docCourseTo.Save(True,False)
            End If
        End If
    End If  
    Exit Sub
errHandle:
    Messagebox Lsi_info(2) + " - " + Str(Err) + " : " + Error(Err) + ", at line " + Str(Erl)
    Exit Sub
End Sub

Для структур документов на основе ключей

Sub MoveAttendeesKeyBased(docCourseFrom As notesDocument, docCourseTo As notesDocument)
%REM
    A simple move attendees function if the relationship between courses and attendees uses 
    (non-response) key based documents
%END REM
    On Error Goto errHandle
    Dim session As New notesSession
    Dim dcAttendees As notesDocumentCollection
    Dim docAttendee As notesDocument
    Dim iAvailablePlaces As Integer
    Dim bMoved As Boolean
    ' a view that lists attendees by Course ID
    Dim vwAttendeesByCourseID As notesView
    Dim db As notesDatabase

    If Not (docCourseFrom Is Nothing Or docCourseTo Is Nothing) Then        
        iAvailablePlaces = docCourseTo.availablePlaces(0)
        If 0 < iAvailablePlaces Then
            Set db = session.CurrentDatabase
            ' do a lookup of all attendees based on the CourseFrom document course id
            Set vwAttendeesByCourseID = db.GetView("(LkupAllAttendeesByCourseID)")
            ' this is the collection of all attendees under the CourseFrom document
            Set dcAttendees = vwAttendeesbyCourseID.GetAllDocumentsByKey(docCourseFrom.CourseID(0), True)
            bMoved = False
            Set docAttendee = dcAttendees.GetFirstDocument
            ' While there are attendee documents to process and there are available places to goto
            While Not docAttendee Is Nothing And 0 < iAvailablePlaces
                ' if the attendee's status is "Wait Listed" then move them
                If Ucase(Trim(docAttendee.Status(0)))= "WAIT LISTED" Then
                    ' Update the course ID for the Attendee
                    docAttendee.CourseID = docCourseTo.CourseID(0)
                    If docAttendee.Save(True,True) Then
                        ' decrement the available places
                        iAvailablePlaces = iAvailablePlaces - 1
                        bMoved = True
                    End If
                End If
                Set docAttendee = dcAttendees.GetNextDocument(docAttendee)
            Wend
            If bMoved Then
                ' available places may be >= 0. Just update the available places so you don't over book the course
                docCourseTo.availablePlaces = iAvailablePlaces
                Call docCourseTo.Save(True,False)
            End If
        End If
    End If  
    Exit Sub
errHandle:
    Messagebox Lsi_info(2) + " - " + Str(Err) + " : " + Error(Err) + ", at line " + Str(Erl)
    Exit Sub
End Sub

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

0 голосов
/ 06 октября 2011

Если вы хотите сохранить существующие документы, вы можете программно скопировать / продублировать их. Это довольно легко с помощью метода copyAllItems.

Смотрите справку Domino (с примером) здесь

Вы можете перебирать документы с помощью объекта notesView (методы getFirstDocument () / getNextDocument ()), перебирать ответы по методу notesdocument.responses ...

Поверьте нам, это возможно, Domino является гибким: -)

...