Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: MrMagoo am 11.06.03 - 08:44:23
-
Hallo,
ich versuche gerade einen Agenten zu programmieren, der eine Ansicht nach doppelten Dokumenten durchsucht. Z.B. alle Dokumente löscht, die den gleichen Titel haben (Id geht leider nicht, da es sich um Kopien handelt.) Also ich schaffe es bis jetzt bestimmte Dokumente zu löschen. Wie bekomme ich den Vergleich von Titel1 zu Titlel2 und zu allen anderen Titeln hin?
Danke und Gruß
-
... mal so ins unreine gedacht:
erstes doc in der ansicht greifen, titel in einen string schieben. dann in einer inneren schleife den rest der docs lesen und bei = löschen. viewrefresh nicht vergessen. jetzt das nächste doc lesen und wieder die innere schleifen laufen lassen. :-\
-
Hallo Magoo,
ich habe hier eine Funktion die auf DOC_ID überprüft.
Überall wo DOC_ID steht mußt Du deinen Titel
einsetzen. Teste das doch mal.
Ciao
Don Pasquale
Function DoesDOC_IDexists(Byval DOC_ID As String) As Integer
Dim VIEW_BY_DOC_ID As String
VIEW_BY_DOC_ID = "DOC_ID"
Dim Anzahl As Integer
Dim session As New NotesSession
Set db = session.CurrentDatabase
Set view = db.GetView(VIEW_BY_DOC_ID)
Dim dc As notesdocumentcollection
Set dc = view.GetAllDocumentsByKey(DOC_ID, False)
Print DOC_ID
ANZAHL = dc.Count
If ANZAHL = 0 Then
DoesDOC_IDexists = 0
Else
DoesDOC_IDexists = 1
End If
End Function
-
@Don Pasquale
habe ich versucht, der macht aber irgendwie nix. Was passiert genau, sollte da ne Ausgabe oder so kommen?
Gruss
-
... nö, das teil von donpasquale setzt nur ein feld auf 0 oder 1, je nachdem ob die doc_id mehrmals vorkommt oder nicht...
-
Hi,
nochmal ins Blaue gedacht...
Versuch's mal mit der Search-Methode aus der NotesDatabase-Klasse.
...
strTitel = "Überschrift nach der gesucht werden soll"
strSearch = "Titel = '" & strTitel & "'"
Set collection = db.Search(sSearch, Nothing, 0 )
If collection.Count > 1 Then
Messagebox "Mehrere Dokumente vorhanden"
End If
...
Axel
-
@Don Pasquale
irgendwie stehe ich wohl auf dem Schlauch, der Agent macht nix bei mir, ändert auch keine Feld
@Axel
ich will nicht nach einer bestimmte Überschrift suchen, sonder alle miteinander vergleichen und bei denen, die doppelt sind, den ältesten Eintrag rausschmeißen ??? ??? ???
-
@MrMagoo,
ignorierst du meine antworten ???. ich habe doch geschrieben, dass das teil von donpasquale nur das feld DoesDOC_IDexit
nur auf 0 bzw auf 1 setzt... das war auch nur als anregung gedacht...
lass dir meine idee mal durch den kopf gehen... ::)
-
Hi,
daß ist ja auch nur die Suche ob es weitere Dokumente mit diesem Titel gibt. a gehört noch weitere Logik außenrum.
So zum Beispiel:
...
Set entrycollection = view.AllEntries
Set entry = vc.GetFirstEntry()
While Not (entry Is Nothing)
Set doc = entry.Document
strTitel = doc.Titel(0)
strSearch = "Titel = '" & strTitel & "'"
Set collection = db.Search(sSearch, Nothing, 0 )
If collection.Count > 1 Then
Messagebox "Mehrere Dokumente vorhanden"
'Löschen der älteren Dokumente
End If
Set entry = vc.GetNextEntry(entry)
Wend
...
Axel
-
@axel,
in die gleiche richtung zielte meine erste idee. das mit der collection ist natürlich eine gute idee :D
-
Hi,
ich glaube aber auch, dass das nicht ganz unproblematisch ist.
Das Problem dürfte hier liegen:
Set entrycollection = view.AllEntries
Damit hast du alle Dokumente in einer Ansicht. Was passiert aber, wenn doppelte Dokumente gelöscht werden. In entrycollection sind sie aber noch vorhanden. Versucht man dann drauf zuzugreifen, knallts. Das müsste man irgendwie abfangen. Aber dafür fehlt mir im Moment die Idee wie.
Axel
-
@axel,
so gesehen ist mein erster ansatz dann doch nicht so schlecht. dabei fliegt ja nur das doppelte doc raus. das ist zwar zeitaufwendig, aber es klappt.
-
@klaussal
Ja aber,....
Ein Teufel steckt auch hier noch im Detail. Du machst das mit
Set doc = view.GetFirstDocument
While...
Set doc = view.GetNextDocument(doc)
Wend
...
Wenn du dann doc löscht, weil doppelt und älter, fehlt der Bezug für GetNextDocument. Das muss auch irgendwie abgefangen werden.
Axel
-
@axel,
jau, stimmt. :'(
nächster ansatz: eine view seq. durchgehen. für jedes doc eine collection bilden, jedes doc dieser collection anschauen, wenn docid-collection = doc-id-view, nix tun, sonst löschen, next document.
da mrmagoo sich aber ausgeklinkt hat, sollte es jetzt reichen.
-
Wie wäre damit ?
Dim session As NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim RemoveDoc As NotesDocument
Dim LOESCHLISTE List As String*32
Set session = New NotesSession
Set db = session.CurrentDatabase
Set view = db.GetView( "DEINE VIEW" )
Set doc = view.GetFirstDocument
While Not doc Is Nothing
If DOPPELT Then
j = j + 1
LOESCHLISTE(j) = doc.UniversalID
End If
Set doc = view.GetNextDocument(doc)
Wend
Forall x In LOESCHLISTE
Set RemoveDoc = db.GetDocumentByUNID(X)
Call Removedoc.RemoveFromFolder("($Inbox)")
End Forall
-
@Don
Klasse Idee, dass mit einer Liste zu regeln. Damit geht man allem Ärger mit fehlenden Bezügen o. ä. aus dem Weg.
Werd ich mir merken, wenn ich mal so'n Problem hab.
Axel
-
... und wie sieht's da mit der 64k-beschränkung aus ?
-
... und wie sieht's da mit der 64k-beschränkung aus ?
@Klaussal
Du Nörgler, Jetzt bekomme ich einmal ein Lob und
Du findest wieder ein Haar in der Suppe
;)
Ciao
Don Pasquale
-
:'( :'( :'( ... und dabei hab ich noch nicht einmal gefragt, was DOPPELT ist und wo's herkommt.
nein, ganz im ernst, die lösung ist sehr schön :D :D :D :D :D
aber da es sich wohl um eine grössere anzahl von docs handelt (sonst würd ich das ja per hand machen) , sollte man schon die sache im auge behalten.
-
... schau mal hier nach:
http://www-10.lotus.com/ldd/sandbox.nsf/Search?SearchView&Query=agent&SearchOrder=1&SearchMax=1000&SearchWV=FALSE&SearchFuzzy=FALSE&Start=1&Count=10
da gibt's den punkt: DELETE DUPLICATE DOCS.....
-
Danke für Eure Hilfe!!!