Domino 9 und frühere Versionen > Entwicklung
Endlosschleife? - Remove Items
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