B
blackswanny
хочу экспортировать и импортировать обратно документы с помщью dxl Exporter и dxl Importer. Экспорт проходит нормально, для связи документов в их XML-именах указываю самого документа и UNID его родителя , при этом прохожу по дереву документа рекурсивно вверх, если у текущего документа есть еще родитель, и так пока не упираюсь в верхний уровень документов, создаю их, а потом в обратном направлении их потомков. При обратном механизме для каждой XML пытаюсь сначала опять пройти по пути вверх, чтобы создать сначала документы самого верхнего уровня, потом их потомков, потом потомков их потомков и т.д. Я так сделал, чтобы избежать ошибки при попытке Импортером создать документ, у которого еще нет родителя. А вообще я не знаю толком , как работает этот DXL Importer, документация у меня плохая, иногда не содержит всех полей и методов, которые у него есть. В общем в итоге при попытке создания документа 3 уровня мой скрипт ищет документ 2 уровня, потом 1 уровня, и найдя его , пытается его импортировать, зная имя входного файла, однако выскакивает ошибка DXL Importer operation failed, описание которой не нашел. Сделал скрин лога, также прикрепляю пример XML-файлов, код ниже
Код:
Sub Initialize
Const XML_INIT_DIR = "E:\Lotus\"
Dim Sess As New NotesSession
Dim Stream As NotesStream
Dim Importer As NotesDXLImporter
Dim ThisDb As NotesDatabase
Dim DocArray As Variant
Dim workspace As New NotesUIWorkspace
Dim NoteIDArray() As String
Dim IDSize As Long
On Error Goto ErrorReturn
Set ThisDb = Sess.CurrentDatabase
Set Importer = Sess.CreateDxlImporter
Set Stream = Sess.CreateStream
Call Importer.SetOutput (ThisDb)
Importer.ACLImportOption = DXLIMPORTOPTION_IGNORE
Importer.DocumentImportOption = DXLIMPORTOPTION_CREATE
Importer.ReplaceDBProperties = False
Importer.ReplicaRequiredForReplaceOrUpdate = False
DocArray = workspace.OpenFileDialog(True , "Выберите файлы для восстановления","xml", XML_INIT_DIR)
If Not (Isempty(DocArray)) Then
IDSize = 0
Forall OneDoc In DocArray
Call ImportFileFromXML(Cstr(OneDoc),ThisDb, Stream, Importer,NoteIDArray, IDSize)
End Forall
Else
Msgbox "Файлы не выбраны"
End If
Exit Sub
ErrorReturn:
Msgbox "Произошла ошибка: " & Error$
Exit Sub
End Sub
Код:
Sub ImportFileFromXML(OneDoc As String,ThisDb As NotesDatabase, Stream As NotesStream, Importer As NotesDXLImporter, NoteIDArray() As String, IDSize As Long)
Dim FileString As Variant
Dim FileString1 As Variant
Dim DirPath As String
Dim FileName As String
Dim NoteID As String
Dim FlagID As Boolean
On Error Goto ErrorReturn
FileString = Split(OneDoc,"_")
If (FileString(3)<>FileString(4)) And (FileString(4)<>"") Then
FlagID=False
Forall IDn In NoteIDArray
If IDn = FileString(4) Then
FlagID=True
End If
End Forall
If Not FlagID Then
DirPath = Strleftback(OneDoc,"\")+"\*.*"
FileName = Strleftback(DirPath,"\")+"\"+Dir(DirPath)
Do While FileName <>""
If FileName<> OneDoc Then
FileString1 = Split(FileName,"_")
If Ubound(FileString1)=5 Then
If FileString1(3) = FileString(4) Then
Msgbox "Файл " +OneDoc+ " ссылается на " +FileName
Call ImportFileFromXML(FileName,ThisDb, Stream , Importer,NoteIDArray, IDSize)
End If
End If
End If
FileName = Strleftback(DirPath,"\")+"\"+Dir()
Loop
End If
End If
Msgbox "Creating "+OneDoc
If Not Stream.Open(OneDoc) Then
Messagebox "Cannot open file",, OneDoc
Exit Sub
End If
Call Importer.SetInput (Stream)
' Call Importer.Process
Call Importer.Import(Stream, Thisdb)
Call Stream.Close
IDSize = IDSize+1
Redim Preserve NoteIDArray(IDSize)
NoteIDArray(IDSize-1) = FileString(3)
Exit Sub
ErrorReturn:
Msgbox "Произошла ошибка: " + Importer.Log
Msgbox "Произошла ошибка: " + Error$
Exit Sub
End Sub
Вложения
-
1.JPG72,2 КБ · Просмотры: 664
-
XML_C22576FB003A26D0_Note_06AD4E1D3ABCC4DCC22576FA0036D8E2_BA7CDB64A9AF5D27C22576FA0036CEEB_.xml1,7 КБ · Просмотры: 364
-
XML_C22576FB003A26D0_Note_BA7CDB64A9AF5D27C22576FA0036CEEB_82544FE3E88A6467C22576F9004A19AC_.xml3,4 КБ · Просмотры: 354
-
XML_C22576FB003A26D0_Note_82544FE3E88A6467C22576F9004A19AC__.xml14,7 КБ · Просмотры: 346