Autor Thema: object.remove führt zu invalid on disc structure  (Gelesen 2511 mal)

DatenDuck

  • Gast
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

Glombi

  • Gast
Re: object.remove führt zu invalid on disc structure
« Antwort #1 am: 20.12.05 - 14:41:36 »
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

DatenDuck

  • Gast
Re: object.remove führt zu invalid on disc structure
« Antwort #2 am: 20.12.05 - 14:55:22 »
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 ***
« Letzte Änderung: 20.12.05 - 14:58:32 von DatenDuck »

DatenDuck

  • Gast
Re: object.remove führt zu invalid on disc structure
« Antwort #3 am: 21.12.05 - 15:57:30 »
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...

  >:( :(???  :-: :- :-[ :-\ :'(

DatenDuck

  • Gast
Re: object.remove führt zu invalid on disc structure
« Antwort #4 am: 22.12.05 - 10:18:21 »
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 ?!

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz