Hallo zusammen,
also ich habe hier ein Problem. Ich versuche gerade eine Dublettenprüfung zu realisieren, aber im Moment ärgert mich Notes. Ich habe eine NotesDocumentCollection zusammen gestellt in der einfach alle Dokumente enthalten sind.
Dann lasse ich ein FTSearch auf die Collection los. hier ein kurzer Programmschnipsel
If colSearch.Count <> 0 Then
searchField = "company"
searchValue =docCol.GetItemValue(searchField)(0)
Call colSearch.FTSearch(searchValue,0)
End If
Im Wert für searchValue ist ein ordentlicher String er findet das passende Dokument auch und schmeisst alle anderen Dokumente aus der Collection raus. Wenn ich aber die Firma doppelt in der DB habe , gibt er mir kein Dokument zurück obwohl die Strings identisch sind, weil ich die Daten einfach kopiert habe.
Desweiteren ist interessant, dass wenn ich (komische Satzkonstruktion) zuerst auf PLZ prüfen lasse
If colSearch.Count <> 0 Then
searchField = "zip"
searchValue = docCol.GetItemValue(searchField)(0)
Call colSearch.FTSearch(searchValue,0)
End If
Er mir die 4 passenden Dokumente liefert.
-------------------------------------------------------------------------------------------------------------------------
Damit wäre das erste Mysterium erklärt und ich hoffe es wird auch verstanden.
Wenn nicht bitte melden
Die zweite Sache ist halt die, dass ich bei dem 2. Durchlauf mit FTSearch immer nichts zurück bekomme obwohl die Daten eindeutig vorhanden sind. Darf man keine 2 Ftsearch hintereinander auf eine Collection durchführen ? in der Hilfe steht es so zumindest nicht drin.
Bitte helft mir ich bin am verzweifeln.
Gruss Robert
Es geht ja darum die Suche immer wieder zu verfeinern.
Quasi das Sandkastenprinzip. Man siebt so lange bis man die den feinsten Sand hat.
Wenn ich gleich am Anfang alle Daten berücksichtige schreibe ich vllt dennoch häufig doppelte Datensätze in die Datenbank
Ich schreibe euch nochmal den gesamten Code. Vielleicht ist ja doch noch irgendwo der Wurm drin
Dim session As NotesSession ' Die Session zum Arbeiten
Dim dbthis As NotesDatabase ' Die göffnete DB "preDocHouse"
Dim collection As NotesDocumentCollection ' Die NotesDocumentCollection aus dieser DB
Dim docCol As NotesDocument ' Die Dokumente aus der "preDocHouse"-DB
Dim dbDocHouse As NotesDatabase ' Die "DocHouse"-Db
Dim isOpenFlag As Boolean ' Diese Flag zeigt an ob die DB geöfnet wurde
Dim i As Integer ' Der Zähler für die For-Schleife
Dim colSearch As NotesDocumentCollection ' Die NotesDocumentCollection für die Suche in der "DocHouse"DB
Dim docSearch As NotesDocument ' ein Dokument aus der colSearch
Dim strFieldname As String ' Feldname aus der DocHouseDB das untersucht werden soll
Dim strErgebnis As String ' String in dem die Suchergebnisse dargestellt werden
Dim searchField As String ' Das Feld in dem gesucht werden soll
Dim searchValue As String ' Der Suchtext für das zuvor deklarierte Feld
Dim colCount As Integer ' Beinhaltet die Azahl der Dokumente in der colSearch
Set session = New NotesSession ' Eröffnen der Session
Set dbthis = session.CurrentDatabase ' Initalisieren der aktuell geöffnetten DB
Set collection = dbthis.UnprocessedDocuments ' Einsammeln der bis jetzt unbearbeiteten Dokumente
Set dbDocHouse = session.GetDatabase("","DocHouse") ' Initalisieren der DocHouse DB
If Not dbthis.IsOpen Then ' Prüfen ob die DB geöffnet wurde
Msgbox "Die Datenbank konnte nicht geöffnet werden ! "
End If
If Not dbDocHouse.IsOpen Then ' Prüfen ob die DocHouse DB geöffnet werden konnte
Msgbox "Die Datenbank (DocHouse) konnte nicht geöffnet werden ! "
End If
Call dbDocHouse.UpdateFTIndex(True) ' aktualisieren des Indexes
Set colSearch = dbDocHouse.AllDocuments Aufstellen der Collection in der gesucht werden soll
Call colSearch.FTSearch("form",0) ' erstes Filtern der Daten
colCount = collection.Count
For i = 1 To colCount
If i = 1 Then
Set docCol = collection.GetFirstDocument
Else
Set docCol = collection.GetNextDocument(docCol)
End If
If colSearch.Count <> 0 Then
searchField = "company"
searchValue =docCol.GetItemValue(searchField)(0)
Call colSearch.FTSearch(searchValue,0)
End If
If colSearch.Count <> 0 Then
searchField = "city"
searchValue =docCol.GetItemValue(searchField)(0)
Call colSearch.FTSearch(searchValue,0)
End If
If colSearch.Count <> 0 Then
searchField = "street"
searchValue = docCol.GetItemValue(searchField)(0)
Call colSearch.FTSearch(searchValue,0)
End If
If colSearch.Count <> 0 Then
searchField = "street"
searchValue = docCol.GetItemValue(searchField)(0)
Call colSearch.FTSearch(searchValue,0)
End If
If colSearch.count =0 Then
' kein Datensatz in der Form vorhanden
Call docCol.ReplaceItemValue("status","1")
Call docCol.Save(True,False)
Elseif colSearch.count = 1Then
' ein Datensatz in der Form vorhanden
Call docCol.ReplaceItemValue("status","2")
Call docCol.Save(True,False)
Elseif colSearch.count <1 Then
' mehere Datensätze in der Form vorhanden
Call colSearch.StampAll("status","3")
End If
Next
If colSearch.count =0 Then
' kein Datensatz in der Form vorhanden
Call docCol.ReplaceItemValue("status","1")
Call docCol.Save(True,False)
Elseif colSearch.count = 1Then
' ein Datensatz in der Form vorhanden
Call docCol.ReplaceItemValue("status","2")
Call docCol.Save(True,False)
Elseif colSearch.count <1 Then
' mehere Datensätze in der Form vorhanden
Call colSearch.StampAll("status","3")
End If
Das letzte Elseif solltst Du nochmals überdenken......
So habe mich der Sache nochmal selber angenommen und diese verdammte suche neu aufgebaut, wenn jetzt nur noch ein Dokument in der Collection vorhanden ist, wird es in den Einzelzugriff genommen und Feldweise untersucht. Das ganze sieht dann wie folgt aus :
' 1. Suche
If colSearch.Count <> 0 Then
searchField = docProfile.GetItemValue("firstkey")(0)
searchValue =docCol.GetItemValue(searchField)(0)
Call colSearch.FTSearch(searchValue,0)
End If
' 2. Suche
If colSearch.Count < 1 Then
searchField = docProfile.GetItemValue("secondkey")(0)
searchValue =docCol.GetItemValue(searchField)(0)
Call colSearch.FTSearch(searchValue,0)
Elseif colSearch.Count = 1 Then
score = 3
Set docSearch = colSearch.GetFirstDocument
key = "secondkey"
If Not docProfile.getitemvalue(key)(0) = "" Then
searchField = docProfile.getitemvalue(key)(0)
If docCol.GetItemValue(searchField)(0) = docSearch.GetItemValue(searchField)(0) Then
score = score + 2
End If
End If
key = "thirdkey"
If Not docProfile.GetItemValue(key)(0) = "" Then
searchField = docProfile.GetItemValue(key)(0)
If docCol.GetItemValue(searchField)(0) = docSearch.GetItemValue(searchField)(0) Then
score = score + 1.5
End If
End If
key = "fourthkey"
If Not docProfile.GetItemValue(key)(0) = "" Then
searchField = docProfile.GetItemValue(key)(0)
If docCol.GetItemValue(searchField)(0) = docSearch.GetItemValue(searchField)(0) Then
score = score + 1
End If
End If
key = "fithtkey"
If Not docProfile.GetItemValue(key)(0) = "" Then
searchField = docProfile.GetItemValue(key)(0)
If docCol.GetItemValue(searchField)(0) = docSearch.GetItemValue(searchField)(0) Then
score = score + 1
End If
End If
key = "sixtkey"
If Not docProfile.GetItemValue(key)(0) = "" Then
searchField = docProfile.GetItemValue(key)(0)
If docCol.GetItemValue(searchField)(0) = docSearch.GetItemValue(searchField)(0) Then
score = score + 1
End If
End If
runFlag = True
End If