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

dimat

Lotus team
31.07.2008
516
0
#1
Всем привет!

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

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

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

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
17
#2
коректнее будет так как вам удобнее и так чтобы работало
чтобы работало скорее всего придется переносить документы и перепривязывать по всем вашим полям, при копировании UNID Документа меняется, хотя его и можно присвоить насильно как у оригинала
 

vitte

Well-known member
17.11.2011
57
0
#4
Была похожая задача. Вот функция для копирования документа в бд-назначение. Может чем поможет.

<!--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
 

savl

Lotus team
28.10.2011
2 131
102
#5
'Удаляем из базы такой документ
numUID = noteToCopy.UniversalID
Set doc = DBDest.GetDocumentByUNID(numUID )

If Not doc Is Nothing Then
doc.Remove(True)
End If
Я бы не удалял, а копировал бы в него все значения. таким образом экономия времени и действий.

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"). это позволит при неудавшемся переносе или некорректном найти источник и повторить действие. А удалять все помеченные документы агентом.
 

nvyush

Lotus team
22.04.2009
2 317
0
#6
Set noteDest= DBDest.GetDocumentByUNID(numUID )
Если в БД DBDest нет документа с UNID numUID, код вывалится с ошибкой. Нужно свою функцию-обёртку получения дока из БД по UNID писать, чтобы это работало. На форуме были примеры, поищите.
 

savl

Lotus team
28.10.2011
2 131
102
#7
Если в БД DBDest нет документа с UNID numUID, код вывалится с ошибкой. Нужно свою функцию-обёртку получения дока из БД по UNID писать, чтобы это работало. На форуме были примеры, поищите.
использую вот такой маневр, забыл добавить :angry2:

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

Kee_Keekkenen

Well-known member
05.09.2006
639
4
#8
использую вот такой маневр, забыл добавить :)

On error resume next
Set noteDest= DBDest.GetDocumentByUNID(numUID )
on error goto FailLable
конечно, все зависит от реалий..
я так делал перенос/архивация/синхронизация

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