0 / 0 / 0
Регистрация: 14.05.2009
Сообщений: 21
|
|
1 | |
Attachments, Очень нужна помощь!17.05.2009, 15:04. Показов 80878. Ответов 55
Метки нет (Все метки)
Всем-всем доброго времени суток!
Уважаемые, очень нужна помощь в таком вопросе: необходимо скопировать embedded object из поля Rich text item одного Notes документа DB1 в другое поле Rich text item другого документа DB2. Если конкретнее говорить, то имеется база данных шаблонов документов и база данных проектов. в бд проектов необходимо реализовать возможность копировать размещенное в бд шаблонов вложение. причем вид в представлении д.б следующим: - Проект 1 >файл1 >файл2... - Проект 2 > файл3.... В курсе, что можно предварительно необходимый шаблон сохранить на диске, а потом его уже загружать в необходимый Notes документ. а какой скрипт для этого использовать????? Подскажите, кто знает. Заранее, огромное спасибо!
0
|
17.05.2009, 15:04 | |
Ответы с готовыми решениями:
55
нужна очень ваша помощь. Нужна помощь Нужна помощь Нужна помощь! |
0 / 0 / 1
Регистрация: 30.06.2007
Сообщений: 2,153
|
|
17.05.2009, 15:40 | 2 |
Ну для работы с RT годятся такие методы:
CopyItemToDocument AppendRTItem
0
|
0 / 0 / 0
Регистрация: 14.05.2009
Сообщений: 21
|
|
17.05.2009, 17:18 | 3 |
А КАК их можно использовать в моем случае? подскажите, плз!!!
0
|
0 / 0 / 1
Регистрация: 30.06.2007
Сообщений: 2,153
|
|
18.05.2009, 10:37 | 4 |
А чём проблема-то?
0
|
Tyo
|
|
18.05.2009, 13:04 | 5 |
Сообщение от OlyaZ
Есть решение, не требующее сохранения. Код
Dim ws As New NotesUIWorkspace Dim db As NotesDatabase Dim doc As NotesDocument, forward As NotesDocument Dim uidoc As NotesUIDocument Dim sourcebody As NotesRichTextItem Dim resultbody As NotesRichTextItem Dim resultbody1 As NotesRichTextItem Set uidoc = ws.CurrentDocument Set doc = uidoc.Document Set db = doc.ParentDatabase Set db = New NotesDatabase("", "") call db.OpenMail Обновление RichText из интерфейса в back-end If uidoc.EditMode Then Call uidoc.Refresh(True) Set sourcebody = doc.getfyrstytem ( "Body" ) Set forward = New Notesdocument ( db ) Set resultbody1 = sourcebody.copyitemtodocument ( forward, "TMP" ) Set resultbody = New NotesRichTextItem ( forward, "Body1" ) Call resultbody.addnewline (1) Call resultbody.appendtext ( "----- Start Forward -----") Call resultbody.addnewline (1) Call resultbody.appendrtitem ( resultbody1 ) Call resultbody1.remove Это необходимо, чтобы показать RichText без сохранения Call resultbody.CopyItemToDocument( forward,"Body") Call resultbody.remove forward.Form = "Memo" forward.Subject = doc.Subject ( 0) Call ws.editdocument ( True, forward ) |
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
|
|
18.05.2009, 15:14 | 6 |
Сообщение от TIA
знаю о баге когда объект NotesDocument пропадает в памяти, если выходит за рамки области видимости объекта БД из которой он был получен (часто ошибка вылазит при использовании функций, кот возвращают док из какой-то БД, которая открывается в той же функции) но твое утверждение я не понял, не встречался, видать... не похоже на то о чем я написал выше?.. хотя, возможно суть в том же...
0
|
0 / 0 / 0
Регистрация: 14.05.2009
Сообщений: 21
|
|
18.05.2009, 18:46 | 7 |
Сообщение от TIA
0
|
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
|
|
18.05.2009, 19:28 | 8 |
OlyaZ, я бы предложил тебе почитать справку по классам
NotesSession, NotesDatabase, NotesDocument, NotesItem, NotesRichTextItem в твоем случае код сводится приблизительно к такому: есть две БД: БД1 (db1.nsf), БД2 (db2.nsf) в БД1 есть документ srcDoc с некоторым заведомо известным нам унидом, например (srcDocUnid) нужно создать в БД2 документ dstDoc по форме "Form2" с вложениями из поля "Body" документа srcDoc для этого надо: - открыть обе БД (NotesSession.GetDatabase(...)) - найти srcDoc (NotesDatabase.GetDocumentByUnid(...)) - создать новый документ (dstDoc) в БД2 (NotesDatabase.CreateDocument) - достать итем Body, хранищий вложения (NotesDocument.GetItem) - скопировать итем в dstDoc (NotesItem.CopyItemToDocument) - сохранить новый документ в БД (NotesDocument.Save(...)) пример кода: Код
On Error 4091 Resume Next чтобы перехватить исключение метода NotesDatabase.GetDocumentByUNID, если унид неверный Dim s As NotesSession Dim srcDb As NotesDatabase Dim dstDb As NotesDatabase Dim srcDoc As NotesDocument Dim dstDoc As NotesDocument Dim bodyItem As NotesItem Dim srcDocUnid As String Set s = New NotesSession() Set srcDb = s.GetDatabase("ServerName", "db1.nsf", False) пытаемся открыть БД1 Set dstDb = s.GetDatabase("ServerName", "db2.nsf", False) пытаемся открыть БД2 проверяем открылись ли БД, если нет, то заканчиваем работу If Not(srcDb.IsOpen) Then Msgbox "Source Db not open" Exit Sub End If If Not(dstDb.IsOpen) Then Msgbox "Dest Db not open" Exit Sub End If начинаем работать устанавливаем унид и пытаемся достать документ из базы srcDocUnid = "%SourceDocUnid%" Set srcDoc = srcDb.GetDocumentByUNID(srcDocUnid) If Not(srcDoc Is Nothyng) Then документ получен достаем итем Set bodyItem = srcDoc.GetFirstItem("Body") If Not(bodyItem Is Nothyng) Then итем получен, можем создавать документ-приемник Set dstDoc = dstDb.CreateDocument() станавливаем форму документа Call dstDoc.ReplaceItemValue("Form", "Form2") копируем итем в документ Call bodyItem.CopyItemToDocument(dstDoc, "Body") сохраняем документ Call dstDoc.Save(True, False, False) End If End If
0
|
Tyo
|
|
18.05.2009, 21:04 | 9 |
Сообщение от Akupaka
Теперь вполне срабатывает вариант простого копирования RT-поля в новый документ. И закрытие БД-источника не приводит к ошибкам. Т.е. нижеследующий код корректен. Код
Dim ws As New NotesUIWorkspace Dim db As NotesDatabase Dim doc As NotesDocument, forward As NotesDocument Dim uidoc As NotesUIDocument Dim sourcebody As NotesRichTextItem Set uidoc = ws.CurrentDocument Set doc = uidoc.Document Set db = New NotesDatabase("", "") Call db.OpenMail Обновление RichText из интерфейса в back-end If uidoc.EditMode Then Call uidoc.Refresh(True) Set sourcebody = doc.getfyrstytem ( "Body" ) Set forward = db.CreateDocument if IsValidItem(sourcebody) then Call sourcebody.copyitemtodocument( forward, "Body" ) forward.Form = "Memo" forward.Subject = doc.Subject ( 0) Call ws.editdocument ( True, forward ) Многие знают, что физически вложения не хранятся в самой ноте. Нота имеет лишь ссылку (в виде RRV) на системную ноту (object), в которой и располагаются вложения. При копировании вложений, нотес не выполняет сразу перенос вложения (зачастую весьма объёмного), а как-бы запоминает ссылку на источник. За счёт чего сама операция копирования (например CopyItemToDocument) выполняется быстро. Ссылки бывают на файловую систему, на другую ноту другой или текущей БД, на буфер обмена (точнее тоже на ноту в локальной спец-БД, в файле вида C:\Temp\notesD80BDD\~editclp.ncf). При сохранении ноты с новым вложением, нотес по ссылке получает источник вложения и копирует его в новую внутреннюю ноту для вложения. При закрытии хэндла БД, закрываются и полученные через него хэндлы нот. Т.е. описанная Akupaka ситуация с пропаданием NotesDocument. Так вот, если ссылка была на ноту-источник из другой БД, и эта БД закрыта, то ссылка не может разрешиться, т.к. нота-источник теперь тоже закрыта. Думаю, что исправление баги заключалось в том, что раньше ссылка на ноту-источник была в виде хэндла, а теперь, наверно, в виде RRV. RRV -- это что-то типа NoteId.
Сообщение от OlyaZ
Сколько Notes-документов в вашем примере создано в БД проекты - 2? По какому принципу определяется, какое вложение в какой документ-проект должно попасть? Или всё совсем не так? |
0 / 0 / 0
Регистрация: 14.05.2009
Сообщений: 21
|
|
18.05.2009, 22:23 | 10 |
Сообщение от TIA
А суть моей задачи такая: Решается проблема документационной поддержки процесса ИТ-аудита. для этого создана бд1 - ХРАНИЛИЩЕ ШАБЛОНОВ, в которой хранятся шаблоны-"образцы" используемых документов; и бд2 - собственно проектов ИТ-аудита. проблема возникла, когда стало необходимым реализовать возможность прикрепления к проекту ИТ-аудита файла шаблона для последующей правки в соответствии с конкретным проектом. в бд1 есть форма для шаблонов, в которой аттачится файл шаблона. необходимо, работая в бд2, аттачить файл шаблона из первой базы на форме добавления документа к проекту и работать с ним дальше. на этой форме (бд2) могу пока тока выбрать название нужного шаблона (выводится окно выбора из представления бд1 нужного названия шаблона), а сам файл необходимо предварительно сохранять на диске, что крайне нежелательно.
0
|
Tyo
|
|
19.05.2009, 11:47 | 11 |
Сообщение от OlyaZ
|
0 / 0 / 0
Регистрация: 15.12.2006
Сообщений: 641
|
|
19.05.2009, 13:22 | 12 |
А почему крайне нежелательно сохранять на диске вложение? Папка доступная пользователю на запись есть всегда (локальная папка Data, либо виндозный темп), записать, потом удалить файл из кода нет никаких проблем. Есть конечно особые траблы в висте, но это все решаемо.
0
|
0 / 0 / 0
Регистрация: 15.05.2009
Сообщений: 1,454
|
|
19.05.2009, 13:48 | 13 |
А не лень уточнить кратенько, что в висте за траблы появились: с доступом к файловой системе, там что-то в секьюрити поменяли?
На моей памяти от клиентов пробегали 1-2 случайные, привязанные, похоже, именно к настройкам ОС на конкретных паре рабочих мест ошибки, которые у нас не повторяются. Вроде в итоге админы на местах разрулили всё
0
|
0 / 0 / 0
Регистрация: 21.01.2008
Сообщений: 240
|
|
19.05.2009, 17:59 | 14 |
Я что-то не пойму.Так как лучше всего делать копирование? С помощью Copyitem,или все таки выкладывать на диск а потом цеплять?
В моем случае были проблемы как раз с Copyitem и append. А когда стала выкладывать файл на диск, все вроде работает.
0
|
0 / 0 / 1
Регистрация: 30.06.2007
Сообщений: 2,153
|
|
19.05.2009, 18:37 | 15 |
Я бы делал Item.CopyItemToDocument.
Траблов не помню.
0
|
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
|
|
19.05.2009, 19:05 | 16 |
Сообщение от kilcher
0
|
0 / 0 / 0
Регистрация: 21.01.2008
Сообщений: 240
|
|
20.05.2009, 10:10 | 17 |
Вот здесь мы обсуждали
Так вот,изменила там Copyitem на "выкладывание и прикрепление" и больше пока проблем не возникало. Только вот еще вопрос как удалить временный файл мимо корзины?
0
|
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
|
|
20.05.2009, 10:38 | 18 |
Сообщение от kilcher
Сообщение от kilcher
Kill fileName в корзину удаляет?.. DeleteFile Function (win api)? http://msdn.microsoft.com/en-us/library/aa363915(VS.85).aspx либо java-решение поищи...
0
|
0 / 0 / 0
Регистрация: 14.05.2009
Сообщений: 21
|
|
26.05.2009, 12:41 | 19 |
Сообщение от Akupaka
Люди, разложите, плз, все по полочкам мне-чайнику!!!сама что-т никак не втыкну, что почем и куда.... что значит "заведомо известным нам унидом"? как он будет известен,м? вот можно ли так сделать, чтоб: нажал кнопку -> открылась форма для выбора шаблона документа для загрузки -> на ней поля всякие, не относящиеся к сути вопроса, и кнопочка к примеру или поле какое, кот откроет вьюху из бд шаблонов для выбора нужного дока -> выбрал док, а он и крепится тут же в форму документа проекта, а дальше уж с ним работай как хошь. Подскажите, вразумите плз!!!!
0
|
0 / 0 / 0
Регистрация: 04.10.2007
Сообщений: 2,977
|
|
26.05.2009, 13:35 | 20 |
Сообщение от OlyaZ
Сообщение от OlyaZ
смотри NotesUIWorkSpace.PickListCollection, NotesCollection.GetFirstDocument щас пример кода напишу... чего я такой добрый сегодня? ))
0
|
26.05.2009, 13:35 | |
26.05.2009, 13:35 | |
Помогаю со студенческими работами здесь
20
Нужна помощь! Нужна помощь Нужна помощь! Нужна помощь ! Нужна помощь Нужна помощь Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |