Autor Thema: während Eingabe überprüfen, ob Wert bereits in der DB vorhanden ist  (Gelesen 6657 mal)

Offline alexbeer

  • Junior Mitglied
  • **
  • Beiträge: 58
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



Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
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
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline smoki

  • Senior Mitglied
  • ****
  • Beiträge: 325
  • Geschlecht: Männlich
    • Smoki's Lotus Notes
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

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
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
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline MadMetzger

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.052
  • Geschlecht: Männlich
  • f.k.a. Alexis Pyromanis
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 )

Offline HarryB

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 521
  • Geschlecht: Männlich
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
Harald "HarryB" Börger

2 x 7.0.2FP1 auf AIX (Cluster)
1 x 7.0.2FP2 auf AIX
1 x 6.5.5 auf AIX
4 x 7.02.FP2 auf WIN

Clients: 7.0.2

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
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
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline alexbeer

  • Junior Mitglied
  • **
  • Beiträge: 58
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...
« Letzte Änderung: 18.05.06 - 13:52:43 von alexbeer »

Offline alexbeer

  • Junior Mitglied
  • **
  • Beiträge: 58
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

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
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

Offline alexbeer

  • Junior Mitglied
  • **
  • Beiträge: 58
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!

Offline MadMetzger

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.052
  • Geschlecht: Männlich
  • f.k.a. Alexis Pyromanis
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?

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
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


Offline alexbeer

  • Junior Mitglied
  • **
  • Beiträge: 58
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...


Offline Thomas Schulte

  • @Notes Preisträger
  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 4.388
  • Geschlecht: Männlich
  • Ich glaub mich tritt ein Pferd
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);
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 alexbeer

  • Junior Mitglied
  • **
  • Beiträge: 58
DANKE!!

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz