Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: DatenDuck am 20.12.05 - 14:21:01
-
Hallo Forum,
mit folgendem Code möchte ich Anhänge von einem Dokument löschen
varAttachmentArray = Evaluate("@AttachmentNames", extDoc.NotesDocument)
' Prüfung ob varAttachmentArray leer
Forall att In varAttachmentArray
' Get embedded object
Set objAtt = extDoc.NotesDocument.GetAttachment(att)
' Only if Type = EMBED_ATTACHMENT proceed
If objAtt.Type = EMBED_ATTACHMENT Then
Call objAtt.remove
End If
End Forall
' Loop ran
If extDoc.NotesDocument.Save(True, False, True) = True Then
RemoveAttachments = True
' Speichern funktioniert...
Else
'Leaving function in FALSE state
RemoveAttachments = False
End If
Nachdem dieses Script gelaufen ist, sind die Anhänge (in diesem Fall nur ein Word.doc) angeblich gelöscht.
Wenn ich das NotesDoc jedoch im Client öffne, sehe ich den Anhang noch.
Sobald ich drauf klicke, erhalte ich die folgende Meldung:
---------------------------
Lotus Notes
---------------------------
Server Error: This database cannot be read due to an invalid on disk structure
---------------------------
OK
---------------------------
Dieser Fehler tritt mit einem 5.0.13er und einem 6.5.4er Client auf.
Der fixup überspringt die DB wenn ich in der Konsole einfach nur load fixup absetze. Erst wenn ich explizit load fixup <pfad> abschicke, wird die DB angefasst, aber nicht repariert..
Was kann ich tun um den Fehler zu verhindern?
Vielen Dank für die Hilfe!
Bis dann,
-Moritz
PS:
Anhang vorher
Beschreibung des Anhangs
Datei: Word.doc
Länge: 42 KB
Geändert: 20.12.2005 14:18:37
Kodierung: base64
Anhang nachher
Beschreibung des Anhangs
Datei: Word.doc
Länge: 0 Byte
Geändert: 20.12.2005 14:13:17
Kodierung: base64
-
Ich würde es so machen:
dim rtitem as NotesRichTextItem
Dim object As NotesEmbeddedObject
Set rtitem = extDoc.GetFirstItem( "Body" ) 'HIER DEN NAMEN DES RICH TEXT FELDES !!!
varAttachmentArray = Evaluate("@AttachmentNames", extDoc.NotesDocument)
' Prüfung ob varAttachmentArray leer
Forall att In varAttachmentArray
' Get embedded object
Set object = rtitem.GetEmbeddedObject( cstr(att) )
if not (object is nothing) then
Call object.Remove
end if
End Forall
' Loop ran
If extDoc.NotesDocument.Save(True, False, True) = True Then
RemoveAttachments = True
' Speichern funktioniert...
Else
'Leaving function in FALSE state
RemoveAttachments = False
End If
Dem GetAttachment traue ich nicht so ganz.
Andreas
-
Wenn ich den Namen des RTItems brauche ist der Code aber nicht mehr so flexibel.
Mit dem Evaluate("@AttachmentNames",....) kommt man ja relativ leicht an eine Liste von Anhängen.
Gibts da noch einne andere Möglichkeit, an die Anhänge zu kommen, ohne die RT Feldnamen zu wissen?
*** Nachtrag: Was mir noch aufgefallen ist: Die Büroklammer in der Ansicht der Dokumente ist nach dem Scriptlauf weg ***
-
Hallo nochmal,
ich habe das Identifizieren der RT Attachments jetzt auf folgende Methode umgestellt:
Set docCurr = dcProcessedDocs.GetFirstDocument
Do Until docCurr Is Nothing
Stop
Forall item In docCurr.Items
If ( item.Type = RICHTEXT ) Then
emObArr = item.EmbeddedObjects
If Isarray(emObArr) Then
Forall o In item.EmbeddedObjects
If ( o.Type = EMBED_ATTACHMENT ) Then
Call o.Remove
flag = True
End If
End Forall
If flag = True Then
If docCurr.Save(True, False) = True Then
' msgbox "ois klar"
End If
End If
End If
End If
End Forall
Set docCurr = dcProcessedDocs.GetNextDocument(docCurr)
Loop
Wenn dieses Script läuft seh ich im Debugger schön, wie es durch die Items des Docs läuft, den Item Typen identifiziert, die Objekte des gefundenen RT Items nach Typ identifiziert und die Attachments entfernt.
Sofern etwas entfernt wurde, wird anschliessend auch gespeichert.
Der Fehler ist nun jedoch, dass die Anhänge noch an dem Dokument sind, nur ausserhalb des Bodyfelds unter einem schwarzen Strich dargestellt werden. Sie lassen sich auch nachwievor anzeigen usw. Es ist also nur der Bezug zum RT Item verloren gegangen.
Der Witz:
Wenn ich das script aus der Designerhilfe wie folgend verwende, läuft das Löschen des Anhangs perfekt...
Dim rtitem As Variant
Dim object As NotesEmbeddedObject
'...set value of doc...
Set rtitem = docCurr.GetFirstItem( "Body" )
If ( rtitem.Type = RICHTEXT ) Then
Set object = rtitem.GetEmbeddedObject( "Anfrage.doc" )
Call object.Remove
Call docCurr.Save( True, True )
End If
Ich bin ratlos...
>:( :(??? :-: :- :-[ :-\ :'(
-
Noch 'ne Nachfrage. Sind denn Probleme bekannt mit zu vielen Loops und IF Schleifen?
Die 2. Methode die Attachments zu finden steckt ja in einer ganz schönen Schachtel... Stolpert Notes bei sowas ?!