Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: alexbeer am 18.05.06 - 04:53:02

Titel: während Eingabe überprüfen, ob Wert bereits in der DB vorhanden ist
Beitrag von: alexbeer am 18.05.06 - 04:53:02
Hallo,

ich bastel gerade an einer Datenbank, in die Job-Kandidaten aus den großen Jobbörsen im Internet eingefügt werden sollen.
Normalerweise wird dabei der Name im Format "Vorname Nachname" per Copy & Paste aus der Webseite in das Formular eingefügt. In die Datenbank soll möglichst aber jeder Kandidat nur einmal - damit der Recruiter sich nicht diverse Kandidaten mehrfach angucken muss.

Ich habe hierzu schon mehrfach im Forum gesucht und vor einigen Tagen einen Thread bzgl phonetischer Suche gefunden - das geht mir aber alles zuweit. Mir reicht es vollkommen aus, wenn in der DB geschaut wird, ob der String "Vorname Nachname" schon genau so in der DB vorhanden ist.
Mehr als eine Meldung o.ä. soll nicht erfolgen, da dem jenigen, der diesen Kandidaten in die DB eingibt überlassen werden soll, ob er die Eingabe abbricht oder auch nicht. (Grund: manche Kandidaten sind als "Confidential" gekennzeichnet, da greift das Lookup ja dann ja auf jeden Fall).

Im Grunde genommen habe ich es so aufgebaut wie in dem Thread (http://atnotes.de/index.php?topic=24865.0) diskutiert. Allerdings greift dieses Lookup ja beim Klicken auf eine Action.
Ich würde das gerne in das Exit-Event meines Namensfeldes einfügen. Aber da geht ja "nur" LS.
Bin ja schon froh, dass ich nach langer Zeit überhaupt wieder mit den @Functions zurecht komme. Mit LS habe ich leider gar nix am Hut.   ;) Oder gibt es eine andere Möglichkeit, wie der User direkt nach der Eingabe des "Vornamen Nachnamen" eine Systemmeldung erhält, wenn dieser String bereits in der DB vorhanden ist.

P.S.
Bei der Uhrzeit nicht wundern - bin derzeit in den USA - kann daher auch etwas mit dem Antworten dauern


Titel: Re: während Eingabe überprüfen, ob Wert bereits in der DB vorhanden ist
Beitrag von: Axel am 18.05.06 - 08:28:32
Das bei der Eingabe zu prüfen wird schwierig bis unmöglich. Den Exiting - Event würde ich auch nicht empfehlen, da er nicht immer ausgeführt wird.

Eine zuverlässige Prüfung funktioniert erst beim Speichern des Dokumentes. Eine entsprechende Formel zur Prüfung kannst du in der Eingabevalidierung des Feldes oder im QuerySave-Event der Maske einfügen.


Axel
Titel: Re: während Eingabe überprüfen, ob Wert bereits in der DB vorhanden ist
Beitrag von: smoki am 18.05.06 - 08:36:45
Hallo!

Ein Lotus Script für Exit sieht dann ungefähr folgendermaßen aus (ungestestet!):

Dim s as new NotesSession
dim w as new NotesUiWorkspace
dim db as NotesDatabase
dim refdoc as NotesDocument
dim v as NotesView
dim uidoc as NotesUiDocument
set uidoc = w.CurrentDocument
set db = s.CurrentDatabase
set v = db.GetView("(LU Aktien)")
fieldentry = uidoc.FieldGetText("Kundennr")
set refdoc = v.GetDocumentByKey(fieldentry,true)
if (refdoc is nothing) then
    msgbox "Error!"
    exit sub
end if
fieldvalue = doc.GetItemValue(" // your field name // ").text
uidoc.FieldSetText("tmpAktenort",fieldvalue)
...

Das Problem ist, dass ein User trotz dem Exiting das Dokument speichern kann, daher benötigst du diese Sache dann auch im QuerySave.

Die Lösung mit dem Button ist daher ggf. sogar besser!?

Gruss
Chris
Titel: Re: während Eingabe überprüfen, ob Wert bereits in der DB vorhanden ist
Beitrag von: Axel am 18.05.06 - 08:54:23
Die Lösung mit dem Button ist daher ggf. sogar besser!?

Damit lässt sich das Dokument aber auch speichern.

Das Script muss ins QuerySave-Event.

Das Ganze könnte dann beispw. so aussehen:

...
Dim s as new NotesSession
dim w as new NotesUiWorkspace
dim db as NotesDatabase
dim refdoc as NotesDocument
dim v as NotesView
dim uidoc as NotesUiDocument

set uidoc = w.CurrentDocument
set db = s.CurrentDatabase
set v = db.GetView("(LU Aktien)")
fieldentry = uidoc.FieldGetText("Kundennr")
set refdoc = v.GetDocumentByKey(fieldentry,true)
if Not (refdoc is nothing) then
  Msgbox "Name gibt's schon"
  Continue = False
  Exit Sub
End If
...


Axel
Titel: Re: während Eingabe überprüfen, ob Wert bereits in der DB vorhanden ist
Beitrag von: MadMetzger am 18.05.06 - 08:58:06
So wie ich die Frage verstanden habe, soll nur ein Hinweis erfolgen und der Anwender muss dann entscheiden was er tut. Von daher würde sich schon die Eingabevalidierung anbieten, meiner Meinung nach.

Also etwa so:

If ( String schon vorhanden? ;
      @If(Prompt("Irgendwas mit Wahlmöglichkeit");JA_Reaktion;NEIN_Reaktion );
      Success )
Titel: Re: während Eingabe überprüfen, ob Wert bereits in der DB vorhanden ist
Beitrag von: HarryB am 18.05.06 - 10:36:36
Normalerweise wird dabei der Name im Format "Vorname Nachname" per Copy & Paste aus der Webseite in das Formular eingefügt. In die Datenbank soll möglichst aber jeder Kandidat nur einmal - damit der Recruiter sich nicht diverse Kandidaten mehrfach angucken muss.

[...]

Mehr als eine Meldung o.ä. soll nicht erfolgen, da dem jenigen, der diesen Kandidaten in die DB eingibt überlassen werden soll, ob er die Eingabe abbricht oder auch nicht. (Grund: manche Kandidaten sind als "Confidential" gekennzeichnet, da greift das Lookup ja dann ja auf jeden Fall).
Wie willst du den unwahrscheinlichen aber möglichen Fall abhandeln, dass zwei verschiedene Personen tatsächlich denselben Namen haben?

Viele Grüße
Harry
Titel: Re: während Eingabe überprüfen, ob Wert bereits in der DB vorhanden ist
Beitrag von: Axel am 18.05.06 - 10:50:14
Wie willst du den unwahrscheinlichen aber möglichen Fall abhandeln, dass zwei verschiedene Personen tatsächlich denselben Namen haben?

Sehr guter Einwand!! Darauf bin ich noch gar nicht gekommen.  :-\

So unwahrscheinlich ist der Fall gar nicht. Suche mal in Berlin nach Manfred Müller.


Axel
Titel: Re: während Eingabe überprüfen, ob Wert bereits in der DB vorhanden ist
Beitrag von: alexbeer am 18.05.06 - 13:28:50
Hallo,

vielen Dank für die Anregungen!
Ich glaube momentan, dass der Vorschlag von MadMetzger erstmal ein guter Ansatz ist.
Ich möchte nicht, dass meine Abfrage automatisch irgendeine Aktion anstößt, da auf jeden Fall Einträge mit gleichem Namen in der DB auftreten werden.

Beispiel:
Einige Kandidaten in dieser Datenbank (z.B. Monster.com) sind als "Confidential" gekennzeichnet, so dass sie von ihrem aktuellen Arbeitgeber in dieser DB (z.B. Monster.com) nicht gefunden werden können. Anstatt "Vorname Nachname" steht in diesem Feld dann nur "Confidential". Über eine monster.com - eMail Adresse können diese Kandidaten dann kontaktiert werden, ohne dass weitere persönliche Daten bekannt sind.

Dieser Lookup soll halt nur eine Hilfe für den Eingebenden (in der Notes DB) sein, um nicht erst den ganzen Datensatz zu pflegen und dann am Ende zu erfahren "Dieser Datensatz existiert leider schon - er wird gelöscht!" So früh wie möglich soll er halt selbst entscheiden können, ob er die Daten weiter eingeben möchte, oder das ganze Prozedere abbricht. Die "Arbeitserleichterung" bzw, der ersparte Einngabeaufwand ist momentan der Grund gegen die Button-Lösung beim Speichern.
Das das keine 100%ige Lösung ist, ist mir klar.

Werde die anderen Vorschläge aber auch testen, und dann berichten.

Vielen Dank ersteinmal.

Alex

edited:vergessen auf Frage einzugehen:
Zitat
Wie willst du den unwahrscheinlichen aber möglichen Fall abhandeln, dass zwei verschiedene Personen tatsächlich denselben Namen haben?
In diesen Job-Datenbanken, haben sich viele Kandidaten auch mehrfach registriert - deswegen ist das schon ein Problem.
100%ig kann ich nicht ausschließen, dass ein Kandidat 2x in unser Notes DB steht und dann der recruiter diesen kandidaten auch 2x kontaktiert.
Besser 2x kontaktieren - als gar nicht ;-)
Zusätzlich zu der Namensabfrage, werde ich dann noch mit der gleichen Überprüfung die eMail Adresse checken. Da ein Kandidat aber auch mehrere eMail Adressen besitzen kann - ist das auch keine Garantie für einmalige Datensätze.
Wie gesagt, das ganze soll nur eine Hilfe sein, und dem Eingebenden soll die Entscheidung überlassen werden, ob er den Kandidaten trotzdem in die LN-DB einträgt, oder ob  er es lässt.

Offtopic:
Insgesamt ist dieses Prozedere des "Hiring" hier in den USA eh für Deutsche seltsam. Als Kandidat bewirbt man sich NICHT bei einem Unternehmen, sondern registriert sich in diesen Jobboards - und die Unternehmen, die Leute einstellen wollen, zahlen viel Geld um diese Jobboards zu durchsuchen und daraus die Kandidaten zu kontaktieren...
Titel: Re: während Eingabe überprüfen, ob Wert bereits in der DB vorhanden ist
Beitrag von: alexbeer am 19.05.06 - 19:30:57
Hi,

mal ne ganz doofe Frage, grundsaetzlich funktioniert das mit der Input Validation - ABER: das funktioniert bei mir nicht waehrend der Eingabe oder sobald ich das FEld verlasse - ueberprueft wird erst, wenn ich auf speichern klicke. In er Hilfe steht jedoch:
Zitat
An input validation formula checks the data entered in the field against criteria that you specify. This formula executes after the input translation formula.

Muss ich noch irgendetwas einstellen, damit bei der Eingabe die Validierung greift?

Danke

Alex
Titel: Re: während Eingabe überprüfen, ob Wert bereits in der DB vorhanden ist
Beitrag von: koehlerbv am 19.05.06 - 19:49:07
Da gibt es nichts einzustellen: Beide Events greifen erst bei einem Refresh des gesamten Dokuments - oder beim Speichern, wo vorab der Refresh ebenfalls ausgelöst wird.

Bernhard
Titel: Re: während Eingabe überprüfen, ob Wert bereits in der DB vorhanden ist
Beitrag von: alexbeer am 20.05.06 - 00:50:39
Danke für die Aufklärung...
Mit
Code
Sub Exiting(Source As Field)
	Dim workspace As New NotesUIWorkspace
	Dim uidoc As NotesUIDocument
	Set uidoc = workspace.CurrentDocument
	Call uidoc.Refresh
End Sub

habe ich das dann aber auch behoben!
Titel: Re: während Eingabe überprüfen, ob Wert bereits in der DB vorhanden ist
Beitrag von: MadMetzger am 20.05.06 - 12:11:15
Kann man dafür nicht auch eine Maskeneigenschaft setzen, die das grundsätzlich macht? Die hieß doch irgendwie "Felder automatisch aktualisieren bei...", oder täusche ich mich da jetzt?
Titel: Re: während Eingabe überprüfen, ob Wert bereits in der DB vorhanden ist
Beitrag von: koehlerbv am 20.05.06 - 16:32:14
Du täuschst Dich da nicht, Markus, aber diese Property will mit grosser Bedacht eingesetzt werden, da bei vielen Feldern und vor allem, wenn auch noch Lookups oder ähnliches stattfinden, die Performance dramatisch in die Knie gehen kann.

Die bislang geposteten Snippets haben einen Nachteil: Sie schlagen auch zu, wenn man das Unikat nach erneuter Bearbeitung erneut speichern will.

Ich biete mal eine Function aus einer meiner StandardLibs an. ACHTUNG: Die Sub ErrorHandler und die Konstante MSG_INFORM_ADMIN sind selbst zu zu schreiben / zu definieren.

Bernhard


Code
Function IsValueAmbiguous (szLookupViewName As String, docCurrent As NotesDocument, szValue As String, szErrorMessage As String) As Integer
	'==================================================================================================================
	' Purpose:		Checks in the given view if the specified value exists more than one time. Empty strings won't be checked.
	'------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
	' Arguments:
	'					szLokkupViewName - the name of the view to search in
	'					docCurrent - the NotesDocument the value resides in
	'					szValue - the value which isn't allowed to be ambiguous
	'					szErrorMessage - will keep possible error messages (for server based routines calling this function)
	'------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
	' Returns:		True, if the value exists more than one time
	'------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
	' Created by:  	Bernhard Koehler on 01.06.2004            Modified by: Bernhard Koehler on 13.01.2005
	'------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
	' Changes:		BK on 13.01.2005 - There was no setting to False if no ambiguous value was found !
	'==================================================================================================================
	
	Dim session As New NotesSession
	Dim dbCurrent As NotesDatabase
	Dim viewLookup As NotesView
	Dim collFound As NotesDocumentCollection
	Dim docFound As NotesDocument
	
	On Error Goto ErrorRoutine
	
	IsValueAmbiguous = True
	
	'Instantiate the current database and the lookup view:
	Set dbCurrent = session.CurrentDatabase
	Set viewLookup = dbCurrent.GetView (szLookupViewName)
	If viewLookup Is Nothing Then
		szErrorMessage = "Die Ansicht '" & szLookupViewName & "' wurde nicht gefunden !"
		Messagebox szErrorMessage & MSG_INFORM_ADMIN, MB_ICONEXCLAMATION, "Fehler"
		Exit Function
	End If
	
	'Get all documents containing szValue:
	Set collFound = viewLookup.GetAllDocumentsByKey (szValue, True)
	
	If collFound.Count = 0 Then
		IsValueAmbiguous = False			'No document found - no ambiguous documents ...
		Exit Function
	End If
	
	'Loop through all found documents:
	Set docFound = collFound.GetFirstDocument
	
	While Not (docFound Is Nothing)
		If docFound.UniversalID <> docCurrent.UniversalID Then
			IsValueAmbiguous = True		'A found doc but with another UNID - this is not allowed !
			Exit Function
		End If
		
		Set docFound = collFound.GetNextDocument (docFound)
	Wend
	
	'If we come to this position there are no ambiguous values:
	IsValueAmbiguous = False
	
	Exit Function
	
ErrorRoutine:
	Call ErrorHandler ("IsValueAmbiguous")
	szErrorMessage = "Run-time error: " & Error$ & " (No. " & Cstr (Err) & " in line " & Cstr (Erl) & ")"
	Exit Function
End Function

Titel: Re: während Eingabe überprüfen, ob Wert bereits in der DB vorhanden ist
Beitrag von: alexbeer am 22.05.06 - 18:37:07
Eine Frage habe ich noch.

Meine Abfrage habe ich jetzt in die Input Validation eingebaut. Ist nach dem Muster @if(...;@success;@failure("....")) aufgebaut
Funktioniert auch alles - aber wenn der THEN Teil der If-Abfrage zum Tragen kommt, dann kann ich das Dokument ja nicht speichern.
Kann man diesen Schutz irgendwie umgehen. Ich moechte das Dokuement ja trotz InputValidation Speichern koennen - auch wenn die Fehlermeldung kommt.  Also nur die Meldungen erhalten - keine weiteren Einschraenkungen.
Muesste soetwas dann mit in das Exiting Event?
Wenn ja, wie muesste ich mein @if(...;@success;@failure("....")) in LS formulieren.
In LS bin ich leider voellig hilflos...

Titel: Re: während Eingabe überprüfen, ob Wert bereits in der DB vorhanden ist
Beitrag von: Thomas Schulte am 22.05.06 - 19:16:50
Im Exiting Event nützt dir so was gar nichts. Wenn dann müsste das in den Query Save.
Und du könntest es zum Bleistift in der Input Validation so lösen. das der Failure Event nur dann getriggert wird wenn eine andere versteckte Variable nicht mit einem bestimmten Wert gefüllt ist.
Also so ungefähr.

@if(Bedingung;@if(VerstecktesFeld = "0";@do(@setfield(VerstecktesFeld;"1");@failure"DeinText"));@Success);@Success);
Titel: Re: während Eingabe überprüfen, ob Wert bereits in der DB vorhanden ist
Beitrag von: alexbeer am 22.05.06 - 19:42:33
DANKE!!