Domino 9 und frühere Versionen > ND8: Entwicklung
Dubletten an Daten aus Ansicht löschen
DaveW:
Guten Morgen,
ich habe gestern das Forum entdeckt und gleiche eine Frage. :P
Was notes angeht bin ich völlig frisch und unbeleckt.
Ich habe habe mir eine kleine Musikdatenbank gebaut und komme an einem Punkt nicht weiter.
Vielleicht kann man mir hier helfen?
Also, ich habe eine Ansicht von Dokumenten, in denen ich alle Titel und Komponisten anzeige.
Jetzt möchte ich aber aus dieser Ansicht alle löschen was doppel ist. (also die Dokumente löschen).
Die Ansicht "ALLETRACKS" zeigt mir alle Titel. Spalten: titel, komponist
Für jeden Titel gibt es ein Dokument mit diversen angaben zu Komponist, Jahr,....
Nun hatten aber einige CDs mehrere Titel von diversen Komponisten und somit habe ich nun einige Titel doppelt.
Diese möchte ich entfernen.
Mit dem Code unten hatte ich es versucht aber ich bekomme immer einen Fehler: "Function Requires a valid ADT argument"
Hatte schon versucht statt mit getnthdocument mit getnextdocument zu arbeiten und dann das doc temporär zwischen zu speichern wegen dem löschen... aber dann sagte notes er kann nicht im index finden.
Wenn also einer helfen mag, schon mal danke im vorraus.
Dave
--- Code: ---Sub Initialize
Print "Start DeleteDouble"
Dim s As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim tempDocCol As NotesDocumentCollection
Dim tempDoc As NotesDocument
ReDim aSearch(1) As variant
Set db = s.Currentdatabase
Set view = db.Getview("ALLETRACKS")
Call view.Refresh()
Set doc = view.Getfirstdocument()
Dim Index As long
While Not doc Is Nothing
aSearch(0) = doc.getitemvalue("titel")(0)
aSearch(1) = doc.getitemvalue("komponist")(0)
Set tempDocCol = view.Getalldocumentsbykey(aSearch, true)
If tempDocCol.Count > 1 Then
Index = 1
Set tempDoc = tempDocCol.Getnthdocument(Index)
While Not tempDoc Is Nothing
Call tempDoc.Remove(True)
Set tempDoc = tempDocCol.Getnthdocument(Index)
Index = Index+1
Wend
End If
Set doc = view.Getnextdocument(doc)
Wend
Print "Ende DeleteDouble"
End Sub
--- Ende Code ---
Thomas Schulte:
Hallo Dave.
erst mal herzlich willkommen im Forum.
Und ja, kann man.
Als erstes solltest du in der Online Hilfe nachlesen was man mit LIST so anfangen kann.
Dann solltest du wissen, das das Löschen von Dokumenten während man durch eine Ansicht geht dumme Folgen haben kann. Was für Folgen das sind kann man unter anderem hier im Forum nachlesen.
Dann solltest du dich mit NotesDocumentCollection und der Frage, wie man eine leere Collection erzeugt, neue immer noch undokumentierte Variante, nicht die alte mit dbSearch und blödsinnigen Parametern, beschäftigen.
Danach ist der Ablauf ganz einfach.
Hol dir deine Ansicht.
Lese die Dokumente in der Ansicht mit Getfirst und getnextdocument.
Bei jedem Dokument prüfst du anhand deines List Schlüssels, den du aus Titel und Komponist zusammensetzt, ob ein Dokument mit diesem Schlüssel schon in der Liste vorhanden ist.
Wenn nicht wird es hinzugefügt.
Wenn ja kommt es in die vorher erzeugte Collection.
Wenn du am Ende der Verarbeitung angekommen bist löscht du die komplette Collection auf einen Schlag mit Col.removeall
Damit sparst du dir die dauernden Searches auf der Datenbank und läufst das Ganze nur einmal durch.
DaveW:
Hi Thomas,
danke für die Begrüßung und die Hilfe.
Ich werde mich mal dran versuchen.
Sollte ich nochmal Hilfe brauchen, schrei ich einfach^^
Natürlich melde ich mich auch wenn ich erfolg hatte.
Dave
DaveW:
ok, habe es glaub ich....
--- Code: ---Sub Initialize
Print "Start DeleteDouble"
Dim s As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim tracklist List As String
Dim dellist List As String
Dim delCol As NotesDocumentCollection
Dim index As Long
Dim aSearch(1) As Variant
Set db = s.Currentdatabase
Set view = db.Getview("ALLETRACKS")
Call view.Refresh()
index = 0
Set doc = view.Getfirstdocument()
While Not doc Is Nothing
aSearch(0) = doc.getitemvalue("titel")(0)
aSearch(1) = doc.getitemvalue("komponist")(0)
If IsElement(tracklist(aSearch(0) + "-" + aSearch(1))) = false then
tracklist(aSearch(0) + "-" + aSearch(1)) = doc.Universalid
Else
dellist(index) = doc.Universalid
index = index+1
End If
Set doc = view.Getnextdocument(doc)
Wend
Set delCol = db.CreatedocumentCollection()
ForAll elem In dellist
Call delCol.AddDocument(db.Getdocumentbyunid(elem))
End ForAll
Call delCol.Removeall(true)
Call view.Refresh()
Print "Ende DeleteDouble"
End Sub
--- Ende Code ---
Thomas Schulte:
Ja, das sieht gut aus. Wobei du die Dokumente die schon in der Liste sind gleich in die Collection verschieben kannst. Spart noch ein wenig Zeit beim durchlaufen.
--- Zitat von: DaveW am 15.12.11 - 09:54:38 ---ok, habe es glaub ich....
--- Code: ---Sub Initialize
Print "Start DeleteDouble"
Dim s As New NotesSession
Dim db As NotesDatabase
Dim view As NotesView
Dim doc As NotesDocument
Dim tracklist List As String
Dim delCol As NotesDocumentCollection
Dim aSearch(1) As Variant
Set db = s.Currentdatabase
Set view = db.Getview("ALLETRACKS")
--- Ende Code ---
Set delCol = db.CreatedocumentCollection()
--- Code: ---
Call view.Refresh()
index = 0
Set doc = view.Getfirstdocument()
While Not doc Is Nothing
aSearch(0) = doc.getitemvalue("titel")(0)
aSearch(1) = doc.getitemvalue("komponist")(0)
If IsElement(tracklist(aSearch(0) + "-" + aSearch(1))) = false then
tracklist(aSearch(0) + "-" + aSearch(1)) = doc.Universalid
Else
--- Ende Code ---
Call delCol.AddDocument(doc)
--- Code: --- End If
Set doc = view.Getnextdocument(doc)
Wend
Call delCol.Removeall(true)
Call view.Refresh()
Print "Ende DeleteDouble"
End Sub
--- Ende Code ---
--- Ende Zitat ---
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln