Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: Gerhard am 20.06.12 - 13:12:21

Titel: Bilder aus Notes DB exportieren
Beitrag von: Gerhard am 20.06.12 - 13:12:21
Hallo zusammen!

Habe eine Notes-DB mit 1317 Dokumenten in denen jeweils ein Bild angehängt ist. Ich muss nun diese Bilder wieder lösen und soll die in einem Ordner am Filesystem zur Verfügung stellen.
Das Ganze wäre naürlich gut über einen Agenten und für alle Dokumente auf einmal.
Habe Notes6.5,
danke für einen eventuelle Hilfe,
Gerhard.
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: m3 am 20.06.12 - 13:18:05
ja? Welche Frage hast Du Konkret?
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: Gerhard am 20.06.12 - 13:19:53
Wie muss ein Script ausschauen oder mit welchem Freeware Tool kann ich diese 1317 Bilder auf das Filesystem automatisch abspeichern?
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: DerAndre am 20.06.12 - 13:30:53
Hi.

Schau Dir mal die ExtractFile Methode in der Designerhilfe an.
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: ascabg am 20.06.12 - 13:32:26
Hallo,

Das Script gibt es doch schon - wenn auch nur in den Grundzuegen - fertig in der Designer-Hilfe.

siehe NotesEmbeddedObject und hier ExtractFile.


Andreas
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: Gerhard am 20.06.12 - 13:38:42
Hi,
habe nun lt. Designer Hilfe dieses Script verwendet, bekomme aber immer in der Zeile
Set rtitem = doc.GetFirstItem("Body") die Fehlermeldung Object Variable not set.
Was kann ich tun ? Bin leider nicht so fit in Lotus Script.

Dim doc As NotesDocument
Dim rtitem As Variant
Dim fileCount As Integer
Const MAX = 100
fileCount = 0   
'...set value of doc...
Set rtitem = doc.GetFirstItem( "Body" )
If ( rtitem.Type = RICHTEXT ) Then
  Forall o In rtitem.EmbeddedObjects
    If ( o.Type = EMBED_ATTACHMENT ) _
    And ( o.FileSize > MAX ) Then
      fileCount = fileCount + 1
      Call o.ExtractFile _
      ( "c:\reports\newfile" & Cstr(fileCount) )
      Call doc.Save( True, True )
    End If
  End Forall
End If
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: klaussal am 20.06.12 - 13:44:41
Heißt das Feld mit dem Bild denn auch "Body" ?
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: Gerhard am 20.06.12 - 13:46:00
Nein, natürlich nicht, sorry, das werd ich gleich mal ändern *die Hitze ist schuld*.
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: Gerhard am 20.06.12 - 13:55:32
Im Feld $FILE steht u.a.:

Objekttyp: Datei
Objekt-ID: 0000220A
Objektlänge: 239617
Dateiname: 0032.jpg
Flags: SIGNED
Host: MSDOS/OS2

Das wäre das Bild das ich herauslösen bzw. auch woanders als jpg eben abspeichern will.
Was muss ich im Code ändern damit es funktioniert ? Statt Body dann $FILE einfügen bringt diesselbe Fehlermeldung.
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: DerAndre am 20.06.12 - 14:07:32
Hi.

Wie heisst den das Feld, wo das Bild drin steckt?

Ist das Bild als Bild oder als Datei in dem Feld?
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: Gerhard am 20.06.12 - 14:19:06
Das Feld heisst Bild_A4, hier ist tatsächlich das Bild als jpg reingehängt, bei den Feldeigenschaften steht aber
Feldname: Bild_A4
Datentyp: Rich Text
Datenlänge: 2632 Byte
Seq.-Num.: 3
Doppeleintrags-ID: 0
Feld-Flags:

Und mich wundert warum hier nicht steht wie gross das Attachment ist, dies steht nur im Feld $FILE.
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: klaussal am 20.06.12 - 14:21:48
Also nimmst Du das Feld "Bild_A4" für das Script.

Und die Abfrage mit der FileSize ist wohl überflüssig.
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: Gerhard am 20.06.12 - 14:30:03
Die Filesize hab ich schon rausgetan, beim Feld hab ich Bild_A4 reingeschrieben, das Script sieht nun so aus und funktioniert noch immer nicht....

Sub Initialize
   Dim doc As NotesDocument
   Dim rtitem As Variant
   Dim fileCount As Integer
   fileCount = 0   
'...set value of doc...
   Set rtitem = doc.GetFirstItem( "Bild_A4" )
   If ( rtitem.Type = RICHTEXT ) Then
      Forall o In rtitem.EmbeddedObjects
         If ( o.Type = EMBED_ATTACHMENT ) Then
            fileCount = fileCount + 1
            Call o.ExtractFile _
            ( "c:\reports\newfile" & Cstr(fileCount) )
            Call doc.Save( True, True )
         End If
      End Forall
   End If   
End Sub
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: Driri am 20.06.12 - 14:36:11
Wenn das das komplette Script ist, kann das so auch nicht funktionieren, denn doc ist gar nicht definiert. Da fehlt noch eine Schleife, um durch alle Dokumente zu laufen.

Das würde dann so aussehen, wobei da noch einiges an Errorhandling verbessert werden könnte :

Code
Sub Initialize
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim dc As NotesDocumentCollection
   Dim doc As NotesDocument
   Dim rtitem As Variant
   Dim fileCount As Integer
   fileCount = 0   

   Set db = session.CurrentDatabase
   Set dc = db.AllDocuments
   
   If dc.Count > 0 Then
   	Set doc = dc.GetFirstDocument
   	While Not (doc Is Nothing)
	   	Set rtitem = doc.GetFirstItem( "Bild_A4" )
	   	If ( rtitem.Type = RICHTEXT ) Then
		   	ForAll o In rtitem.EmbeddedObjects
			   	If ( o.Type = EMBED_ATTACHMENT ) Then
				   	fileCount = fileCount + 1
				   	Call o.ExtractFile _
				   	( "c:\reports\newfile" & CStr(fileCount) )
				   	Call doc.Save( True, True )
			   	End If
		   	End ForAll
	   	End If   
	   	Set doc = dc.GetNextDocument(doc)
   	Wend
  End If
End Sub


Edit : Achso, das Call doc.Save würde ich persönlich auch weglassen. Du brauchst die Dokumente nach zu speichern, nur weil das Attachment auf die Platte gelöst wird.
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: klaussal am 20.06.12 - 14:37:40
Zitat
das Script sieht nun so aus und funktioniert noch immer nicht....

Diese Aussage ist ja nicht gerade hilfreich....
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: Gerhard am 20.06.12 - 14:41:25
Danke Ingo.

Funktioniert nun super, er schreibt nun newfile und den Counter.

Wie krieg ich das noch hin das der Dateiname dann der Name des Attachments ist ?
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: klaussal am 20.06.12 - 14:46:30
o.Name
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: Axel am 20.06.12 - 14:47:06
Ändere die Zeile

Call o.ExtractFile( "c:\reports\newfile" & CStr(fileCount) )

in

Call o.ExtractFile ( "c:\reports\" & o.name)

ab.

Axel


Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: Gerhard am 20.06.12 - 15:00:16
Super, danke bestens, funktioniert.

Und nun hoffentlich ein Letztes: Welche Abfrage brauche ich damit ich keinen Fehler bekomme wenn das Feld Bild_A4 kein Attachment beinhaltet bzw. nicht vorhanden ist ?
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: klaussal am 20.06.12 - 15:09:22
If doc.HasItem("Bild...) then
  Set....
.
.
.
.
     end if
  end if
set doc = dc.....
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: Peter Klett am 20.06.12 - 15:17:22
Ne, Gerhard meint, wenn kein Bild angehängt ist.

If Isarray (rtitem.EmbeddedObjects) Then
   ...

Wenn kein Dateianhang vorhanden ist, ist EmbeddedObjects kein Array.
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: klaussal am 20.06.12 - 15:19:34
Zitat
bzw. nicht vorhanden ist

Hatte ich etwas anders verstanden.
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: Peter Klett am 20.06.12 - 15:22:36
Klar, Du hast Recht, das habe ich überlesen.

Also braucht er beide Überprüfungen, ob das Item da ist, und wenn es da ist, ob Anhänge vorhanden sind.
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: Gerhard am 20.06.12 - 15:40:23
DAnke an alle, super, habe das nun eingebaut und es läuft ohne Fehler durch. DA ich nun zu viele Bilder habe nehme ich an dass er alle Dokumente aus der DB genommen hat. Ich möchte das aber auf eine View einschränken, es dürften eben nur die erwähnten 1317 sein. Wie kann ich nun noch eine Vorselektion mittels einer View hier einbauen ?

Sub Initialize
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim dc As NotesDocumentCollection
   Dim doc As NotesDocument
   Dim rtitem As Variant
   Dim fileCount As Integer
   fileCount = 0   
   
   Set db = session.CurrentDatabase
   Set dc = db.AllDocuments
   
   If dc.Count > 0 Then
      Set doc = dc.GetFirstDocument
      While Not (doc Is Nothing)
         If doc.HasItem("Bild_A4") Then            
            Set rtitem = doc.GetFirstItem( "Bild_A4" )
            If Isarray (rtitem.EmbeddedObjects) Then
               If ( rtitem.Type = RICHTEXT ) Then
                  Forall o In rtitem.EmbeddedObjects
                     If ( o.Type = EMBED_ATTACHMENT ) Then
                        fileCount = fileCount + 1
                        Call o.ExtractFile ( "h:\dekor_attachments\" & o.name)
                        Call doc.Save( True, True )
                     End If
                  End Forall
               End If   
            End If
         End If
         Set doc = dc.GetNextDocument(doc)
      Wend
   End If
End Sub
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: klaussal am 20.06.12 - 15:45:08
dim view as Notesview

set view = db.getview("deineansicht")


Set doc = view.Getfirstdocument

bzw

set doc = view.getnextdocument

Alles, was mit dc zu tun hat, auskommentieren oder löschen.
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: Peter Klett am 20.06.12 - 18:39:42
oder Du stellst den Agenten um auf markierte Dokumente und änderst nur diese Zeile

Set dc = db.AllDocuments

in

Set dc = db.UnprocessedDocuments

Dann exportierst Du die Bilder aller markierten Dokumente (z.B. mit Strg+A in Deiner Ansicht)

Noch eine kleine Anmerkung:

            If Isarray (rtitem.EmbeddedObjects) Then
               If ( rtitem.Type = RICHTEXT ) Then
 
Diese beiden Bedingungen würde ich tauschen, wenn das item kein Richtext ist, kann es keine EmbeddedObjects haben.
Titel: Re: Bilder aus Notes DB exportieren
Beitrag von: Gerhard am 21.06.12 - 07:35:31
Ich danke allen die mir bei dieser Aufgabenstellung geholfen haben, wie immer, auch in der Vergangenheit, perfekt und vorbildlich. Kann man nur weiterempfehlen.
Einen möglichst stressfreien Tag für alle,
Gerhard.