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
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
ok, habe es glaub ich....
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
Zur Ergänzung:
Wenn die Ansicht nach Titel + Komponist sortiert ist (oder du dafür eine erstellst), kannst du auch 2 aufeinanderfolgende Dokumente vergleichen, ob diese den gleichen Titel + Komponist haben.
Dim key$, keyAlt$, toDelete as NotesDocument
keyAlt = ""
While Not doc Is Nothing
key = doc.getitemvalue("titel")(0) + "-" + doc.getitemvalue("komponist")(0)
set toDelete = doc
Set doc = view.Getnextdocument(doc) ' erst weitergehen
if key = keyAlt then call toDelete.remove(True) ' dann ggf löschen
keyAlt = key
Wend
Gruß
Roland