Domino 9 und frühere Versionen > Entwicklung

Endlosschleife? - Remove Items

(1/5) > >>

TMC:
Hi,

ich habe folgenden Code - fast 1:1 aus der Designerhilfe (remove item) - nur eingeschränkt auf "Set collection = db.UnprocessedDocuments".


--- Zitat ---Sub Initialize
'Löscht alle Items "Untitled" aus ausgewählten Docs in der View (auch wenn Item mehrfach enthalten)..
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim collection As NotesDocumentCollection
   Dim doc As NotesDocument
   Dim item As NotesItem
   Set db = session.CurrentDatabase
   Set collection = db.UnprocessedDocuments
   Set doc = collection.GetFirstDocument
   
   While Not(doc Is Nothing)
      If doc.HasItem("Untitled") Then
         Set item = doc.GetFirstItem("Untitled")
         Call item.Remove
         Call doc.Save(True, True)
         Set doc = collection.GetNextDocument(doc)
      End If
   Wend
   
End Sub
--- Ende Zitat ---

Allerdings wohl eine Endlosschleife, der Mauszeiger zeigt ewig die Sanduhr (mit STRG+Pause aber abbrechbar).

Wo könnte der Fehler liegen?

Im Agenten habe ich unter "Which docs should it act on" "Selected docs" eingestellt. Wenn ich "All docs in view" nehme ist es dasselbe, auch dann hängt er.

Ach ja, was soll das Script machen (Zitat Hilfe, und genau das brauche ich  ;)):

--- Zitat ---This example uses the Remove method of the NotesItem class to remove all the ModifiedBy items in the database. To handle multiple items with the same name, the code removes items in a loop that tests HasItem.
--- Ende Zitat ---

TMC

eknori:
While Not(doc Is Nothing)
      If doc.HasItem("Untitled") Then
         Set item = doc.GetFirstItem("Untitled")
         Call item.Remove
         Call doc.Save(True, True)
         Set doc = collection.GetNextDocument(doc)
      End If
   Wend

sollte eigentlich

While Not(doc Is Nothing)
      If doc.HasItem("Untitled") Then
         Set item = doc.GetFirstItem("Untitled")
         Call item.Remove
         Call doc.Save(True, True)
      End If
      Set doc = collection.GetNextDocument(doc)
Wend

heißen

TMC:
Danke Ulrich!

So funktioniert es auch, aber nun werden nicht alle Items des gleichen Namens gelöscht sondern nur das erste.
Und die Hilfe meinte ja:

--- Zitat ---the code removes items in a loop that tests HasItem.
--- Ende Zitat ---
Nur haben die Help-Ersteller wohl übersehen dass das endlos ist :-\

Wie auch immer, ich hab jetzt einfach einen 2. while/wend reingebaut dann gehts:


--- Zitat ---Sub Initialize
   Dim session As New NotesSession
   Dim db As NotesDatabase
   Dim collection As NotesDocumentCollection
   Dim doc As NotesDocument
   Dim item As NotesItem
   Set db = session.CurrentDatabase
   Set collection = db.UnprocessedDocuments
   Set doc = collection.GetFirstDocument
   
   While Not(doc Is Nothing)
      While (doc.HasItem("test33"))
         Set item = doc.GetFirstItem("test33")
         Call item.Remove
         Call doc.Save(True, True)
      Wend
      Set doc = collection.GetNextDocument(doc)
   Wend
   
End Sub
--- Ende Zitat ---

So speichert das Script zwar 17mal das Doc wenn 17 Items vorhanden, aber mir genügt das trotzdem, lasse ja nicht 100k Docs ändern ;D

Grüße,
TMC

koehlerbv:
Da könnte man auch was machen mit

bChanged = false
ForAll items in NotesDocument
   If item.Name = "xxx"
      Call item.Remove
      BChanged = true
   End If
End ForAll

If bChanged = true then
   Call NotesDocument.Save (True, False, True)
End If

Hilft Dir das? Und sorry, daß es so "aus dem Bauch geschrieben wurde". Sitze gerade über einem Problem, daß aus einer DB alle Attachments auf Platte (und ann -> CD) gelöst werden müssen und dabei an Hand der vielstufigen Kategorien/Subkategorien/... eine übersichtliche Verzeichnisstruktur aufgebaut werden muß ... Glücklicherweise sind jetzt die wesentlichen Probleme (Anlage der Verzeichnisstruktur an Hand der Kategorisierung) gelöst ;-)

Ciao,
Bernhard

eknori:

--- Zitat ---Glücklicherweise sind jetzt die wesentlichen Probleme (Anlage der Verzeichnisstruktur an Hand der Kategorisierung) gelöst ;-)

--- Ende Zitat ---


das hätte ich per API gelöst

Declare Function MakePath Lib "imagehlp.dll" Alias "MakeSureDirectoryPathExists" (ByVal lpPath As String) As Long

Sub Click(Source As Button)
   Msgbox MakePath("C:\Notes\Data\Test\")
End Sub

eknori

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln