2013-09-24 5 views
0

Я пытаюсь экспортировать все документы и их вложения из базы данных Lotus Notes (с помощью Designer 7.0). Я могу получить данные документа и получить вложение, но только если я буду жестко закодировать имя. Два метода в LotusScript, которые я нашел для получения имени файла программным образом, не работают, как показано в нижних двух блоках кода. В первом случае doc.GetFirstItem («Тело») возвращает Nothing, а во втором - несоответствие типа во время выполнения в строке Forall. Любая помощь по извлечению вложений будет принята с благодарностью! Я не уверен, хранятся ли вложения как «вложения» или OLE, но я подозреваю, что это вложения, поскольку они в основном являются PDF-файлами.Как получить вложения Lotus Notes?

Sub Click(Source As Button) 
Dim session As New NotesSession 
Dim db As NotesDatabase 
Dim query As String 
Dim collection As NotesDocumentCollection 
Dim doc As NotesDocument 
Dim fileCount As Integer 
Dim attachment As NotesEmbeddedObject 
Dim fileName As String 

Set db = session.CurrentDatabase 
' get a document that has an attachment 
Set collection = db.FTSearch("06/25/2013", 10) 

fileNum% = Freefile() 
fileName$ = "c:\kcw\lotusexport.txt" 
Open fileName$ For Output As fileNum% 
Write #fileNum%, "docs found", collection.Count 

Set doc = collection.GetFirstDocument 
' write out document properties 
Forall x In doc.Items 
    Write #fileNum%, x.Name, " = ", x.Text 
End Forall 
'extract document (using hardcoded name) 
Set attachment = doc.GetAttachment("OCSE-FRONT_SCANTODESKTOP_06262013-104822.pdf") 
Call attachment.ExtractFile _ 
("c:\kcw\attachment") 

'Try to get attachment through "Body", but rtitem is Nothing 
Set rtitem = doc.GetFirstItem("Body") 
Write #fileNum%, "rtitem is Nothing", rtitem Is Nothing 
fileCount = 0 
If Not rtitem Is Nothing Then 
    If (rtitem.Type = RICHTEXT) Then 
     Write #fileNum%, "rtitem is RICHTEXT" 
     Forall o In rtitem.EmbeddedObjects 
      Write #fileNum%, "has Embedded Objects" 
      fileCount = fileCount + 1 
      Write #fileNum%,"rtitem num", fileCount 
      Call o.ExtractFile _ 
      ("c:\kcw\newfile" & Cstr(fileCount)) 
     End Forall 
    End If 
End If 

'Fails with "Type mismatch" at Forall loop 
If doc.HasEmbedded Then 
    Write #fileNum%, "doc has embedded"  
    Forall objects In doc.EmbeddedObjects 
     Write #fileNum%, "in for loop" 
     Write #fileNum%, "filename= ", object.Source 
    End Forall 
End If 

Close fileNum% 
End Sub 
+0

Что вы подразумеваете под Dim session..etc.? – zanbri

+0

Поле тела существует в каждом документе? Очень странно, что он ничего не возвращает. –

+0

Вы определенно должны смотреть на методы обработки ошибок в LotusScript. Может возникнуть проблема с документом, обработанным в цикле - в любое время. С самого начала: другая форма (без поля тела), поврежденный документ (.isValid), недопустимое имя файла (имя внутреннего вложения может отличаться от указанного в клиенте) и т. Д. –

ответ

3

, который даст вам список всех вложений в документе

objects = Evaluate("@AttachmentNames", doc) 
0

Я заметил, что вы не процитировать whcih линии вызвал ошибку. Лучший addecrror отлов, чтобы получить информацию о какой строке произошла ошибка:

в верхней части процедуры (? Первая линия) ..

Sub Click(Source As Button) 
On error goto handler 

В нижней части суб ...

fin: 
exit sub 

handler: 
msgbox "Error " & Error$ & " line " & Erl 
resume fin 

End Sub

Помогает решить проблемы.

1

Я вижу несколько проблем с вашим кодом. Прежде всего, как уже говорилось, вам нужно добавить обработку ошибок. Во-вторых, используйте свойство Source класса NotesEmbeddedObject, чтобы получить исходное имя файла вложения. Конечно, вы должны сами писать код для обработки дубликатов.

Вот несколько строк в программе, которую я написал.

Forall i In doc.Items 
    ' *** Locate attachments and detach them 
    If Left$(i.Name,1)<>"$" Or Lcase(i.Name)="$file" Then 
    If i.IsSummary = False Then 
     If Not Isempty(i.EmbeddedObjects) Then 
     If (i.Type = RICHTEXT) Then 
      Forall obj In i.EmbeddedObjects 
      If (obj.Type = EMBED_ATTACHMENT) Then 
       Call obj.ExtractFile(basePath & obj.Source) 
      End If 
      End Forall 
     End If 
     End If 
    End If 
    End If 
End Forall 

Программа будет экспортировать все документы в базе данных как XML, отсоединять любые вложения, экспортировать любые встроенные изображения, а также связать эти отдельные/экспортируются файлы в файлы XML. Вы можете узнать больше об этом здесь: http://www.texasswede.com/websites/texasswede.nsf/Page/Notes%20XML%20Exporter

0

Я новичок в заметках, поэтому благодарим за все входные данные о том, как сделать код лучше и для решений! Я проверил быстрый тест с приведенным ниже кодом и нашел, что он работает по крайней мере на одном документе (TBD на всей базе данных). Я обнаружил, что имя файла хранится в Items, в элементе $ FILE. Этот код получает имя файла, затем извлекает файл:

Dim item As NotesItem 
'assumes first item is $FILE 
Set item = doc.Items(0) 
Dim attachmentName As String 
attachmentName = item.Values(0) 
Write #fileNum%, "attachmentName= ", attachmentName 
Set attachment = doc.GetAttachment(attachmentName) 
Call attachment.ExtractFile _ 
("c:\kcw\" + attachmentName) 
+0

Вы не можете предположить, что $ File является первым элементом. Это не всегда будет правдой. –

Смежные вопросы