Почему не срабатывает импортёр?

30.05.2006
1 345
11
#1
Дошли руки (нашлась задача) до DXL.
Экспортирую док-т в поток, парсю его SAXParser-ом, пытаюсь импортировать обратно.
Импортёр говорит Ok, но док-т не обновляется :-(

Нет-ли каких подводных камней при импорте док-та их XML?
Да, версия клиента - 6.5.5
 
30.05.2006
1 345
11
#3
м.б. notesDXLImporter.DocumentImportOption ?
Эт я заметил! Попробовал DXLIMPORTOPTION_REPLACE_ELSE_IGNORE и DXLIMPORTOPTION_REPLACE_ELSE_CREATE.
Однохренственно...

А вот всяки свойства "created", "modified" etc импорту не противоречат? Я пробовал кое-что выкусить - не помогает
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 599
277
#4
нужно Serialize делать иначе изменения не отразятся (для DOM)
а SAX - этож в поток, пайплайн делается?

если всё не "налету", то посмотреть - может он новый док создаёт...
ну и там - ошибки (посмотреть их)
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#5
нужно Serialize делать иначе изменения не отразятся
Где, в LS? О.о

Constantin A Chervonenko ,
опробуйте убить из импортируемого дока данные об униде. Права на создание и изменение конкретного документа есть (доступ к базе, к документу)?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 599
277
#6
а что смущает?
Walks the DOM document tree and streams the resulting XML to the DOM parser's output object, provided one was specified.
Defined in
NotesDOMParser
Syntax
Call notesDOMParser.Serialize( )
See Also
Using XML with LotusScript
Добавлено:
опробуйте убить из импортируемого дока данные об униде
это какие - ведь надо обновить док...
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#7
Не могу ответить, не знаю )) просто переспросил.
это какие - ведь надо обновить док
Для проверки сработает ли импорт вообще.
А разве импортер сработал бы без ошибки, если бы ему пустой поток передали бы?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 599
277
#8
я не помню режимов его работы...
куда ошибки пишет - надо хэлп смореть
 
30.05.2006
1 345
11
#9
нужно Serialize делать иначе изменения не отразятся (для DOM)
а SAX - этож в поток, пайплайн делается?
Будет пайп, а пока - для отладки - во временное файлО пишу/читаю
если всё не "налету", то посмотреть - может он новый док создаёт...
ну и там - ошибки (посмотреть их)
Эт понятно. Ошибки в importer.Log смотрю. Пока преобразование не отладил, они там были. Теперь: ошибок нет, но и док-та нет


Добавлено:
опробуйте убить из импортируемого дока данные об униде. Права на создание и изменение конкретного документа есть (доступ к базе, к документу)?
Прав - выше крыши.
UNID - жалко. Док-т надо именно обновить. Для этого (судя по help) требуется совпадение replicaid и unid. Разве только для отладки?
А noteid и sequence я выкусил
 
30.05.2006
1 345
11
#10
Ха! С опцией DXLIMPORTOPTION_REPLACE_ELSE_CREATE оно-таки создаёт новые док-ты - совсем с другим UNID-ом.

For purposes of replacement, two documents match if:
The replica ID of the output database matches the replica ID of the incoming DXL.
The universal IDs of the two documents match.

Разумеется, эти IDы я не трогал. Тем не менее, железяка считает, что оно NOT match :)
М.б. какая-то фигня, типа разделители ( : ) в replicaid-е?
 
13.03.2009
625
1
#11
Ха! С опцией DXLIMPORTOPTION_REPLACE_ELSE_CREATE оно-таки создаёт новые док-ты - совсем с другим UNID-ом.
Может ей мешает док in-memory? Если разбить код на два куска(две кнопки): первый выгружает, изменяет и сохраняет на диск. второй - только импортирует файл.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 599
277
#12
вот какую-то инфу трогать низя в ДХЛ (удалять), может она и пропала?
 

VladSh

начинающий
Lotus team
11.12.2009
1 276
6
#13
У меня было: выгружаю док, потом импортирую его же, - создаётся новый док; выгружаю этот новый док, импортирую, - импортируется, т.е. обновляется! Что за хрень тогда не разобрался, т.к. особо не надо было.. подозреваю, что что-то в обычном доке может быть "лишнее"...
 
30.05.2006
1 345
11
#14
Может ей мешает док in-memory?
Тоже так подумал. Перед импортом делаю delete doc. - те же яйца...


Добавлено:
вот какую-то инфу трогать низя в ДХЛ (удалять), может она и пропала?
Гм...
Задачка-то бытовая: почикать аттачи и картинки из письма.
Т.е. <item name='$FILE'> + из <richtext> выкусить <attachmentref> и просто <picture>. Всё делается на 1-2-3. Кроме импорта.

Если-б знать все folder-ы, где письмо лежит, workaround сделал-бы. Впрочем, и тут засада: как в общем случае найти свежесозданный док-т?
 
13.03.2009
625
1
#15
Если-б знать все folder-ы, где письмо лежит, workaround сделал-бы. Впрочем, и тут засада: как в общем случае найти свежесозданный док-т?
workaround: импортировать в отдельно стоящую пустую БД. сразу после импорта получать этот свежий док, писать (скриптом) поверх исходного и убивать
 

VladSh

начинающий
Lotus team
11.12.2009
1 276
6
#16
Задачка-то бытовая: почикать аттачи и картинки из письма.
Т.е. <item name='$FILE'> + из <richtext> выкусить <attachmentref> и просто <picture>. Всё делается на 1-2-3.
Для этого есть совершенно гениальные методы, которые наконец-то стали работать с 8.5.1...:

notesDXLExporter.OmitRichtextAttachments
notesDXLExporter.OmitRichtextPictures
а также:
notesDXLExporter.OmitMiscFileObjects
notesDXLExporter.OmitOLEObjects
 

alik86

Lotus team
20.11.2008
465
1
#17
Колупался с похожей задачкой. Вроде с DXLIMPORTOPTION_REPLACE_ELSE_IGNORE всё ОК работает:
Код:
Sub Click(Source As Button)
Dim Session As New NotesSession
Dim Wsp As New NotesUIWorkspace
Dim db As NotesDatabase
Dim Stream As NotesStream 
Dim DXLImporter As NotesDXLImporter
filename$ = "D:\Картинки\" + Wsp.Prompt(PROMPT_OKCANCELEDIT,_
"Введите имя файла из которого импортировать DXL",_
"D:\Картинки\", "Picture_надо.xml" )
Set Db = Session.CurrentDatabase
Set Stream = Session.CreateStream 
If Not Stream.Open(filename$) Then
Messagebox "Невозможно открыть файл " & filename$,, "Ошибка"
Exit Sub
End If
Set DXLImporter = Session.CreateDXLImporter(stream, Db)
DXLImporter.DocumentImportOption = DXLIMPORTOPTION_REPLACE_ELSE_IGNORE
DXLImporter.Process
Msgbox "Готово! Документ " & filename$ & " импортирован."
End Sub
В данном примере использован исправленый файл, полученый ранее экспортом дока (Session.CreateDXLExporter(Doc, ...))
P.S. В xml я не силен - я только учусь, так что не ругайте сильно, если чего-то недопонял и не то написал. ;)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 599
277
#18
мобуть с этой опией поиграться setForceNoteFormat(false);
 
30.05.2006
1 345
11
#19
:ya_lamo:

Какие очепятки допускают опытные программеры: в уме DocumentImportOption, а в коде - DesignImportOption

Слава Богу, тут просто было.
Воюю дальше - с кодировками: если пром.Stream-ы на файлах, всё Ok. А если "в уме" - не работает. Импортёр ругается на кодировку

Пайпы с ходу не пошли: импортёру не нравится тип Output-а
 

VladSh

начинающий
Lotus team
11.12.2009
1 276
6
#20
Воюю дальше - с кодировками: если пром.Stream-ы на файлах, всё Ok. А если "в уме" - не работает. Импортёр ругается на кодировку
Да, это они отстойно сделали:
Read-only. Character set used by the external data source.

To get: charset$ = notesStream.Charset

Usage
Specify the character set for a stream with Open.
This property is Unicode for a new NotesStream object.
Натыкался на это, когда надо было передавать данные в реляционку, но пока забросил, т.к. чудесным образом кодировка совпала. Да и есть там возможность перекодировки в LCField и LCStream.

Если что-то получится, черкните пожалуйста пару строк...