Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: bikerboy am 12.01.07 - 10:33:20

Titel: Dublettenprüfung - Wie , Womit
Beitrag von: bikerboy am 12.01.07 - 10:33:20
Hallo ich arbeite nun seit Wochen an einer Dublettenprüfung, aber ich komme nicht vorwärts.

In den meisten Fällen sind meine Ideen einfach zu Laufzeitlastig. Jetzt wollte ich euch Fragen ob ihr mit sowas schon Erfahrung gemacht habt , vielleicht selber eine geschrieben habt und so also alles was euch zusammen zu dem Thema einfällt.

Ich bedanke mich schon im Vorraus für die Anregungen.
Titel: Re: Dublettenprüfung - Wie , Womit
Beitrag von: m3 am 12.01.07 - 10:37:13
Ich kenn nur eine Bulletenprüfung.  ;D

Etwas mehr Details, was Du beispielsweise unter "Laufzeitlastig" verstehst und was Du gerne verbessert hättest, wären durchaus hilfreich.
Titel: Re: Dublettenprüfung - Wie , Womit
Beitrag von: Glombi am 12.01.07 - 10:44:41
Mir fällt dazu GetDocumentByKey und UniversalID ein.

Titel: Re: Dublettenprüfung - Wie , Womit
Beitrag von: eknori am 12.01.07 - 10:47:27
hmm, so etwas  (http://www.falsepositives.com/index.php/2007/01/04/sntt-test-for-unique-values-in-a-lotus-notes-form-field/) ?
Titel: Re: Dublettenprüfung - Wie , Womit
Beitrag von: bikerboy am 12.01.07 - 14:33:34
So liebe Gemeinde,

ich habe etwas vollbracht. es läuft. Ist wer an dem Code interessiert. Dann würde ich euch damit überfluten. Es sind insgesamt 6 Module. Also wenn interesse dann bitte melden. Ich will ja nicht unnötig , dass Forum zu posten
Titel: Re: Dublettenprüfung - Wie , Womit
Beitrag von: eknori am 12.01.07 - 14:37:02
na, dan mal her damit
Titel: Re: Dublettenprüfung - Wie , Womit
Beitrag von: Glombi am 12.01.07 - 14:38:50
Wenn Du kritikfähig bist, kannst Du es gerne posten.  ;)

Also, nur Mut und her damit.

Andreas
Titel: Re: Dublettenprüfung - Wie , Womit
Beitrag von: bikerboy am 12.01.07 - 15:06:48
Ach wie schnell das Wetter umschlagen kann , spätestens jetzt hättet ihr alles bekommen. Gerade lief es noch so wie es sollte und nun , wieder nur Kappes.

Gut fangen wir an :

Decleration :

Code
Dim session As NotesSession								' Die Session zum Arbeiten
Dim dbthis As NotesDatabase								' Die göffnete DB "preDocHouse"
Dim dbDocHouse As NotesDatabase					' Die "DocHouse"-Db
Dim docProfile As NotesDocument						' Beinhaltet das Profile-Dokument

Dim collection As NotesDocumentCollection		' Die NotesDocumentCollection aus dieser DB
Dim docCol As NotesDocument							' Die Dokumente aus der "preDocHouse"-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

Dim score As Double											' Beinhaltet den Scorewert
Dim key As String												' Beinhaltet das aktuelle Schlüsselfeld
Dim runFlag As Boolean										' Entscheidet darüber ob eine Prüfung läuft oder nicht
Dim forCollection As NotesDocumentCollection	

Dim char As String
Dim char2 As String
Dim newString As String
Dim convChar As String



Initalize :

Code
Sub Initialize
	Dim server As String
	Dim database As String
	
	
	
	Set session = New NotesSession						' Eröffnen der Session
	Set dbthis = session.CurrentDatabase					' Initalisieren der aktuell geöffnetten DB	
	
	Set docProfile = dbthis.GetProfileDocument("Profile-Document")
	
	server = Cstr(docProfile.GetItemValue("server")(0))
	database = Cstr(docProfile.GetItemValue("database")(0))
	Set dbDocHouse = session.GetDatabase(server,database)
	
	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
	
	If Not dbDocHouse.IsFTIndexed Then
		Call dbDocHouse.UpdateFTIndex(True)
	End If
	
	Call checker
	
End Sub

checker :

Code
Sub checker
	Dim searchFormula As String
	Dim searchFormula2 As String
	
	searchFormula = {Form = "form"}		
	searchFormula2 = {status = 0}
	
	Set collection = dbthis.search(searchFormula2, Nothing, 0)
	Set colSearch  = dbDocHouse.Search(searchFormula,Nothing, 0)
	
	If colSearch.count = 0 Then	
		Call CopyAgent
		Exit Sub
	End If
	If colSearch.count = 0 Then
		Msgbox "Fehler"
		Exit Sub
	End If
	colCount = collection.Count
	
	For i = 1 To  colCount
		runflag = False
		If i = 1 Then
			Set docCol = collection.GetFirstDocument
		Else
			Set docCol = collection.GetNextDocument(docCol)
		End If
		
		If colSearch.Count  <> 0 Then
			searchField = docProfile.GetItemValue("firstkey")(0)
			searchValue =docCol.GetItemValue(searchField)(0)
			Call colSearch.FTSearch(searchValue,0)
		End If
		
		If Not runflag = True Then
			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
				Set docSearch = colSearch.GetFirstDocument						
				Call detailchecker
			Elseif colSearch.Count = 0 Then
				runflag = True
				Call docCol.CopyToDatabase(dbDocHouse)
			End If
		End If
		
		If Not runflag = True Then
			If colSearch.Count > 1 Then
				searchField = docProfile.GetItemValue("thirdkey")(0)
				searchValue = docCol.GetItemValue(searchField)(0)
				Call colSearch.FTSearch(searchValue,0)
			Elseif colSearch.count = 1 Then
				Set docSearch = colSearch.GetFirstDocument			
				Call detailchecker
			Elseif colSearch.Count = 0 Then
				If Not runflag = True Then
					Call docCol.CopyToDatabase(dbDocHouse)
					runflag = True
				End If
			End If
		End If
		
		If Not runflag = True Then
			If colSearch.Count  > 1 Then
				searchField = docProfile.GetItemValue("fourthkey")(0)
				searchValue = docCol.GetItemValue(searchField)(0)
				Call colSearch.FTSearch(searchValue,0)
			Elseif colSearch.count = 1 Then
				Set docSearch = colSearch.GetFirstDocument						
				Call detailchecker
			Elseif colSearch.Count = 0 Then
				If Not runflag = True Then
					Call docCol.CopyToDatabase(dbDocHouse)
					runflag = True
				End If
			End If
		End If		
		If Not runflag = True Then		
			If colSearch.Count  > 1  Then
				searchField = docProfile.GetItemValue("fithtkey")(0)
				searchValue = docCol.GetItemValue(searchField)(0)
				Call colSearch.FTSearch(searchValue,0)
			Elseif colSearch.count = 1 Then
				Set docSearch = colSearch.GetFirstDocument						
				Call detailchecker
			Elseif colSearch.Count = 0 Then
				If Not runflag = True Then
					Call docCol.CopyToDatabase(dbDocHouse)
					runflag = True
				End If
			End If
		End If
		
		If Not runflag = True Then
			If colSearch.Count  > 1 Then
				searchField = docProfile.GetItemValue("sixtkey")(0)
				searchValue = docCol.GetItemValue(searchField)(0)
				Call colSearch.FTSearch(searchValue,0)
			Elseif colSearch.count = 1 Then
				Set docSearch = colSearch.GetFirstDocument						
				Call detailchecker
			Elseif colSearch.Count = 0 Then
				If Not runflag = True Then
					Call docCol.CopyToDatabase(dbDocHouse)
					runflag = True
				End If
			End If
		End If
		
	Next
	
End Sub


detailchecker:

Code
Sub detailchecker
	
	key = "secondkey"
	If Not docProfile.getitemvalue(key)(0) = "" Then
		searchField = docProfile.getitemvalue(key)(0)
		If Not Isnumeric(docCol.GetItemValue(searchField)(0)) Then
			If Roundex (Cstr(docCol.GetItemValue(searchField)(0))) = Roundex (Cstr(docSearch.GetItemValue(searchField)(0))) Then
				score = score + 2
			End If
		Else
			If Cstr(docCol.GetItemValue(searchField)(0)) = Cstr(docSearch.GetItemValue(searchField)(0)) Then
				score = score + 2
			End If
		End If
		
	End If
	
	key = "thirdkey"
	If Not docProfile.GetItemValue(key)(0) = "" Then	
		searchField = docProfile.GetItemValue(key)(0)
		If Not Isnumeric(docCol.GetItemValue(searchField)(0)) Then
			If Roundex (Cstr(docCol.GetItemValue(searchField)(0))) = Roundex (Cstr(docSearch.GetItemValue(searchField)(0))) Then
				score = score + 1.5
			End If
		Else
			If Cstr(docCol.GetItemValue(searchField)(0)) = Cstr(docSearch.GetItemValue(searchField)(0)) Then
				score = score + 1.5
			End If
		End If
	End If
	
	key = "fourthkey"
	If Not docProfile.GetItemValue(key)(0) = "" Then
		searchField = docProfile.GetItemValue(key)(0)
		If Not Isnumeric(docCol.GetItemValue(searchField)(0)) Then
			If Roundex (Cstr(docCol.GetItemValue(searchField)(0))) = Roundex (Cstr(docSearch.GetItemValue(searchField)(0))) Then
				score = score + 1
			End If
		Else
			If Cstr(docCol.GetItemValue(searchField)(0)) = Cstr(docSearch.GetItemValue(searchField)(0)) Then
				score = score + 1
			End If
		End If
	End If
	
	key = "fithtkey"
	If Not docProfile.GetItemValue(key)(0) = "" Then
		searchField = docProfile.GetItemValue(key)(0)
		If Not Isnumeric(docCol.GetItemValue(searchField)(0)) Then
			If Roundex (Cstr(docCol.GetItemValue(searchField)(0))) = Roundex (Cstr(docSearch.GetItemValue(searchField)(0))) Then
				score = score + 1
			End If
		Else
			If Cstr(docCol.GetItemValue(searchField)(0)) = Cstr(docSearch.GetItemValue(searchField)(0)) Then
				score = score + 1
			End If
		End If
	End If
	
	key = "sixtkey"
	If Not docProfile.GetItemValue(key)(0) = "" Then	
		searchField = docProfile.GetItemValue(key)(0)
		If Not Isnumeric(docCol.GetItemValue(searchField)(0)) Then
			If Roundex (Cstr(docCol.GetItemValue(searchField)(0))) = Roundex (Cstr(docSearch.GetItemValue(searchField)(0))) Then
				score = score + 1
			End If
		Else
			If Cstr(docCol.GetItemValue(searchField)(0)) = Cstr(docSearch.GetItemValue(searchField)(0)) Then
				score = score + 1
			End If
		End If
	End If
	
	If score <= Cdbl(docProfile.GetItemValue("uncritical")(0)) Then
		Call docCol.CopyToDatabase(dbDocHouse)
	Elseif score <= Cdbl(docProfile.GetItemValue("critical")(0)) Then
		Call docCol.ReplaceItemValue("score",score)		
		Call docCol.ReplaceItemValue("status","2")
		Call docCol.Save(True, True)
	Elseif score > Cdbl(docProfile.GetItemValue("verycritical")(0)) Then
		Call docCol.ReplaceItemValue("score",score)		
		Call docCol.ReplaceItemValue("status","3")
		Call docCol.Save(True,True)
	End If
	runflag = True
	
End Sub
Roundex:

Code
Sub detailchecker
	
	key = "secondkey"
	If Not docProfile.getitemvalue(key)(0) = "" Then
		searchField = docProfile.getitemvalue(key)(0)
		If Not Isnumeric(docCol.GetItemValue(searchField)(0)) Then
			If Roundex (Cstr(docCol.GetItemValue(searchField)(0))) = Roundex (Cstr(docSearch.GetItemValue(searchField)(0))) Then
				score = score + 2
			End If
		Else
			If Cstr(docCol.GetItemValue(searchField)(0)) = Cstr(docSearch.GetItemValue(searchField)(0)) Then
				score = score + 2
			End If
		End If
		
	End If
	
	key = "thirdkey"
	If Not docProfile.GetItemValue(key)(0) = "" Then	
		searchField = docProfile.GetItemValue(key)(0)
		If Not Isnumeric(docCol.GetItemValue(searchField)(0)) Then
			If Roundex (Cstr(docCol.GetItemValue(searchField)(0))) = Roundex (Cstr(docSearch.GetItemValue(searchField)(0))) Then
				score = score + 1.5
			End If
		Else
			If Cstr(docCol.GetItemValue(searchField)(0)) = Cstr(docSearch.GetItemValue(searchField)(0)) Then
				score = score + 1.5
			End If
		End If
	End If
	
	key = "fourthkey"
	If Not docProfile.GetItemValue(key)(0) = "" Then
		searchField = docProfile.GetItemValue(key)(0)
		If Not Isnumeric(docCol.GetItemValue(searchField)(0)) Then
			If Roundex (Cstr(docCol.GetItemValue(searchField)(0))) = Roundex (Cstr(docSearch.GetItemValue(searchField)(0))) Then
				score = score + 1
			End If
		Else
			If Cstr(docCol.GetItemValue(searchField)(0)) = Cstr(docSearch.GetItemValue(searchField)(0)) Then
				score = score + 1
			End If
		End If
	End If
	
	key = "fithtkey"
	If Not docProfile.GetItemValue(key)(0) = "" Then
		searchField = docProfile.GetItemValue(key)(0)
		If Not Isnumeric(docCol.GetItemValue(searchField)(0)) Then
			If Roundex (Cstr(docCol.GetItemValue(searchField)(0))) = Roundex (Cstr(docSearch.GetItemValue(searchField)(0))) Then
				score = score + 1
			End If
		Else
			If Cstr(docCol.GetItemValue(searchField)(0)) = Cstr(docSearch.GetItemValue(searchField)(0)) Then
				score = score + 1
			End If
		End If
	End If
	
	key = "sixtkey"
	If Not docProfile.GetItemValue(key)(0) = "" Then	
		searchField = docProfile.GetItemValue(key)(0)
		If Not Isnumeric(docCol.GetItemValue(searchField)(0)) Then
			If Roundex (Cstr(docCol.GetItemValue(searchField)(0))) = Roundex (Cstr(docSearch.GetItemValue(searchField)(0))) Then
				score = score + 1
			End If
		Else
			If Cstr(docCol.GetItemValue(searchField)(0)) = Cstr(docSearch.GetItemValue(searchField)(0)) Then
				score = score + 1
			End If
		End If
	End If
	
	If score <= Cdbl(docProfile.GetItemValue("uncritical")(0)) Then
		Call docCol.CopyToDatabase(dbDocHouse)
	Elseif score <= Cdbl(docProfile.GetItemValue("critical")(0)) Then
		Call docCol.ReplaceItemValue("score",score)		
		Call docCol.ReplaceItemValue("status","2")
		Call docCol.Save(True, True)
	Elseif score > Cdbl(docProfile.GetItemValue("verycritical")(0)) Then
		Call docCol.ReplaceItemValue("score",score)		
		Call docCol.ReplaceItemValue("status","3")
		Call docCol.Save(True,True)
	End If
	runflag = True
	
End Sub


copyagent :

Code
Sub CopyAgent
	For i = 1 To collection.Count
		If i = 1 Then
			Set docCol = collection.GetFirstDocument
		Else 
			Set docCol = collection.GetNextDocument(docCol)
		End If
		
		Call docCol.CopyToDatabase(dBDocHouse)
	Next
End Sub
Titel: Re: Dublettenprüfung - Wie , Womit
Beitrag von: bikerboy am 15.01.07 - 17:15:08
Habe den Fehler gefunden warum es bei einzelnen Suche funzt und sonst nicht.


Ich muss die Collection immer wieder naeuaufbauen und das habe ich nicht gemacht , er hat ja immer in der alten gesucht und ist klar dass er da nicht zu einem Ergebnis gekommen ist.