Перенос Документов Из Одной Бд В Другую

Тема в разделе "Lotus - Программирование", создана пользователем dimat, 22 ноя 2011.

  1. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Всем привет!

    Есть несколько БД с одинаковой структурой (дизайн обновляется из одного шаблона), задача в следущем:
    Необходимо реализовать функционал переноса группы документов из одной бд в другую.
    Под группой документов понимается наличие главного документа и несколько зависимых, логически связанных определенным значением в полях(то есть не документы-ответы).

    Для себя вижу 2 варианта:
    1. Скопировать документы из бд источника в бд назначения методом NotesDocument.CopyToDatabase и удалить их в бд источнике;
    2. Создать документы по соответствущей форме в бд назначения, скопировать Items (NotesDocument.CopyAllItems) и удалить документы в бд источнике.

    Вопрос: как корректнее реализовать?
     
  2. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    коректнее будет так как вам удобнее и так чтобы работало
    чтобы работало скорее всего придется переносить документы и перепривязывать по всем вашим полям, при копировании UNID Документа меняется, хотя его и можно присвоить насильно как у оригинала
     
  3. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    При этом нужно учитывать, что при присвоении нового unid создаётся новый документ, так что нужно не забыть удалить старый.
     
  4. vitte

    vitte Well-Known Member

    Регистрация:
    17 ноя 2011
    Сообщения:
    55
    Симпатии:
    0
    Была похожая задача. Вот функция для копирования документа в бд-назначение. Может чем поможет.

    <!--shcode--><pre><code class='"<pre><code class="sql'>SELECT AnyThing FROM SomeThing[/CODE]">Function CopyWithSameUNID(noteToCopy As NotesDocument, DbDest As NotesDatabase)
    Dim noteDest As NotesDocument
    Dim doc As NotesDocument
    Dim numUID As Variant

    On Error Goto FailLabel

    'Удаляем из базы такой документ
    numUID = noteToCopy.UniversalID
    Set doc = DBDest.GetDocumentByUNID(numUID )

    If Not doc Is Nothing Then
    doc.Remove(True)
    End If

    Set noteDest = DBDest.CreateDocument
    noteDest.UniversalID = noteToCopy.UniversalID

    Call noteToCopy.CopyAllItems(noteDest)
    Call noteDest.Save(True,True)
    FailLabel:
    Resume Next
    End Function</code></pre>

    Добавлено: Была похожая задача. Вот функция для копирования документа в бд-назначение. Может чем поможет.

    Function CopyWithSameUNID(noteToCopy As NotesDocument, DbDest As NotesDatabase)
    Dim noteDest As NotesDocument
    Dim doc As NotesDocument
    Dim numUID As Variant

    On Error Goto FailLabel

    'Удаляем из базы такой документ
    numUID = noteToCopy.UniversalID
    Set doc = DBDest.GetDocumentByUNID(numUID )

    If Not doc Is Nothing Then
    doc.Remove(True)
    End If

    Set noteDest = DBDest.CreateDocument
    noteDest.UniversalID = noteToCopy.UniversalID

    Call noteToCopy.CopyAllItems(noteDest)
    Call noteDest.Save(True,True)
    FailLabel:
    Resume Next
    End Function
     
  5. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    Я бы не удалял, а копировал бы в него все значения. таким образом экономия времени и действий.

    If Not doc Is Nothing Then
    call noteToCopy.CopyAllItems(doc)
    End If

    И тогда не надо делать:

    Set noteDest = DBDest.CreateDocument
    noteDest.UniversalID = noteToCopy.UniversalID

    Вообще лучше так, на мой взгляд:

    numUID = noteToCopy.UniversalID
    Set noteDest= DBDest.GetDocumentByUNID(numUID )

    If noteDest Is Nothing Then
    Set noteDest= DBDest.CreateDocument
    noteDest.UniversalID = noteToCopy.UniversalID
    End If

    Call noteToCopy.CopyAllItems(noteDest)
    ' Дополнительное изменение полей.
    Call noteDest.Save(True,True)

    и еще, я бы не сразу удалял документ источник. Скажем метить к удалению, какое-нибудь служебное поле (deleted = "1"). это позволит при неудавшемся переносе или некорректном найти источник и повторить действие. А удалять все помеченные документы агентом.
     
  6. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Если в БД DBDest нет документа с UNID numUID, код вывалится с ошибкой. Нужно свою функцию-обёртку получения дока из БД по UNID писать, чтобы это работало. На форуме были примеры, поищите.
     
  7. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.052
    Симпатии:
    146
    использую вот такой маневр, забыл добавить :angry2:

    On error resume next
    Set noteDest= DBDest.GetDocumentByUNID(numUID )
    on error goto FailLable
     
  8. Kee_Keekkenen

    Kee_Keekkenen Well-Known Member

    Регистрация:
    5 сен 2006
    Сообщения:
    616
    Симпатии:
    4
    конечно, все зависит от реалий..
    я так делал перенос/архивация/синхронизация

    если переносимый документ есть в DBDest, то удаляем поля и переносим поля из исходного,
    если документа нет, то создаем новый и переносим поля, при необходимости переписываем юниверсалИД от исходного документа, сохраняем док.. исходный помечаем на удаление..
     
Загрузка...

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