Autor Thema: Dubletten an Daten aus Ansicht löschen  (Gelesen 4812 mal)

Offline DaveW

  • Frischling
  • *
  • Beiträge: 4
Dubletten an Daten aus Ansicht löschen
« am: 15.12.11 - 08:19:01 »
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

Offline Thomas Schulte

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Re: Dubletten an Daten aus Ansicht löschen
« Antwort #1 am: 15.12.11 - 08:46:13 »
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.
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Offline DaveW

  • Frischling
  • *
  • Beiträge: 4
Re: Dubletten an Daten aus Ansicht löschen
« Antwort #2 am: 15.12.11 - 08:52:04 »
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

Offline DaveW

  • Frischling
  • *
  • Beiträge: 4
Re: Dubletten an Daten aus Ansicht löschen
« Antwort #3 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 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

Offline Thomas Schulte

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
Re: Dubletten an Daten aus Ansicht löschen
« Antwort #4 am: 15.12.11 - 10:34:16 »
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.

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")
   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
                        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
Thomas Schulte

Collaborative Project Portfolio and Project Management Software

"Aber wo wir jetzt einmal soweit gekommen sind, möchte ich noch nicht aufgeben. Versteh mich recht, aufgeben liegt mir irgendwie nicht."

J.R.R.Tolkien Herr der Ringe, Der Schicksalsberg

OpenNTF Project: !!HELP!! !!SYSTEM!!  !!DRIVER!!

Skype: thomasschulte-kulmbach

Offline DaveW

  • Frischling
  • *
  • Beiträge: 4
Re: Dubletten an Daten aus Ansicht löschen
« Antwort #5 am: 15.12.11 - 10:45:02 »
Stimmt, super, ja bei großen Datenmengen macht sich das bestimmt bemerkbar ob man die daten nur einmal oder zweimal durchgeht....

Danke an dieser Stelle.
Klappt alles  ^-^

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Dubletten an Daten aus Ansicht löschen
« Antwort #6 am: 15.12.11 - 11:44:10 »
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.

Code
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
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz