Einfache Möglichkeit doppelte Einträge zu verhindern?

  • Hi,


    gibt es im LotusScript oder in der Formelsprache eine einfache Möglichkeit, um Doppelte bzw. einmalig vorhandene Einträge zu überprüfen...zb...Seriennummer (die darfs bloss einmal geben) etc...


    Szenario:
    Habe eine Maske (Neues Dokument) in der man die Seriennummer eingeben kann.
    Vor dem endgültigen Abspeichern sollte überprüft werden, ob die Seriennummer schon vorhanden ist. (Ich würde das per LotusScript machen im QuerySave)


    Muss ich da jetzt mit einer while-schleife ran und alle Dokumente in einer bestimmten Ansicht durchsuchen und bei Übereinstimmung Fehler ausgeben?


    Würde das definitiv im LotusScript machen, da ich im QuerySave schon eine Abfrage drin habe, dass bestimmte Felder ausgefüllt sein müssen...dort würde ich dann natürlich auch die andere Abfrage machen.



    Ich bin nur ein Würstchen!

  • Ich glaube, was du willst, ist die GetDocumentByKey-Methode.


    Erstell dir eine View, die in der ersten Spalte die Seriennummer hat. Im QuerySave-Event versuchst du in dieser View den Key zu finden. Ist das Resultat (en NotesDocument) Nothing, dann ist alles gut...


    Ich persönlich würde es aber nicht beim Speichern machen, sondern gleich beim Eintragen der Nummer in das entsprechende Feld.

    Life is not a journey to the grave with the intention of arriving safely in a pretty and well-preserved body, but rather to skid in broadside, thoroughly used up, totally worn out, and loudly proclaiming "Wow, what a ride!!! :evil:
    Beschleunigung ist, wenn die Tränen der Ergriffenheit waagrecht zum Ohr hin abfliessen - Walter Röhrl

  • Ahh subbi das werde ich mal testen! Und nicht im QuerySave, ok, das bedeutet aber er müsste es sofort nach eingabe oder nach einer Aktion automatisch überprüfen...wann ist es sinnvoll zu überprüfen nach welchem event? "Exiting" wäre am sinnvollsten..


    Die View werde ich erstellen und auch versteckt halten ich brauch sie ja nur zur Kontrolle.


    Ich probiers mal ;) :hammer:

  • bau dir doch eine Ansicht in der in der ersten sortierten Spalte die Seriennummer drin steht (mehr brauch auch nicht drin sein in der Ansicht)


    Da die eingabe der Seriennummer nur einmal erfolgen soll, würde ich vielleicht das eigentlich Feld Seriennummer als Berechnetes Feld machen. Davor machst du einen Aktionsbutton.
    In dem machst du dann Deinen ScriptCode rein.


    Dim S As New NotesSession
    dim ws as new notesuiworkspace
    Dim Doc As NotesDocument
    Dim tmpDoc As NotesDocument
    Dim DB As Notesdatabase
    Dim View As Notesview
    dim uidoc as notesuidocument
    Dim flag As Variant
    Set Doc = UiDoc.document

    Flag = Ws.DialogBox("SerienNr",True,True,True,True,False,False,"Seriennummer bitte eintragen ... ",Doc)
    if Flag = true then

    '---------------
    set db = s.currentdatabase
    set view = db.Getview("Seriensuche")
    set tmpdoc = view.getdocumentbykey(Doc.Seriennummer(0),true)
    if tmpdoc is nothing then
    '---------------

    Call gUiDoc.FieldSetText("Seriennummer",Doc.Seriennummer(0)))
    Call gUiDoc.Refresh
    else
    msgbox ("Seriennummer bereits vergeben")
    end if
    end if


    du baust dir eine kleine Maske in der nur die Seriennummer eingegeben werden kann.


    Naja so ungefähr würde ich das machen. Ich hoffe es hilft.

    • Offizieller Beitrag

    ... wird allerdings das gleiche Dokument nocheinmal gespeichert, dann wird in der View ein Eintrag gefunden, das Dokument, das gerade bearbeitet wird. Dann muss noch geprüft werden, ob die Universal-Ids der Dokument identisch sind.


    Nur als Hinweis:
    Es könnte sein, das die DB repliziert wird, dann funktioniert diese Vorgehensweise nicht mehr.

    Rein logisches Denken verschafft uns keine Erkenntnis über die wirkliche Welt.
    Alle Erkenntnis der Wirklichkeit beginnt mit der Erfahrung und endet mit ihr.
    Alle Aussagen, zu denen man auf rein logischen Wegen kommt, sind, was die Realität angeht, vollkommen leer.
    Albert Einstein

    • Offizieller Beitrag

    @simsale
    der Else-Zweig geht in die Hose, weil ein einmal abgespeichertes Dokument nicht wieder gespeichert werden kann, da die SE-Nr schon existiert.


    Gruß
    Dirk

    Rein logisches Denken verschafft uns keine Erkenntnis über die wirkliche Welt.
    Alle Erkenntnis der Wirklichkeit beginnt mit der Erfahrung und endet mit ihr.
    Alle Aussagen, zu denen man auf rein logischen Wegen kommt, sind, was die Realität angeht, vollkommen leer.
    Albert Einstein

  • noe geht sie nicht, denn der Button wird verborgen sobald EINMAL die Seriennummer eingegeben wurde. !!


    Logisch ist das sowas NUR auf dem Server geht. (also ohne lokale repliken).


    soll das auchlokal funktionieren, dann kann man das nur mit einem Agenten machen der auf dem Server läuft und der dann automatisch Seriennummern berechnet.


    Aber das ist ja dann ein anderes Thema. !!


    Ansonsten wenn der Button sichtbar bleiben soll, dann noch bei der oder nach der If bedingung die DocId abfragen, dann sollte es auch gehen.

  • Zitat


    Simsala schrieb:
    Logisch ist das sowas NUR auf dem Server geht. (also ohne lokale repliken).


    soll das auchlokal funktionieren, dann kann man das nur mit einem Agenten machen der auf dem Server läuft und der dann automatisch Seriennummern berechnet.


    Aber das ist ja dann ein anderes Thema. !!


    Da hätte ich aber noch einen Einwand:


    Normalerweise holt man sich ja
    1. aus einer Ansicht den Wert.
    2. Dann erhöht man ihm um 1.
    3. Danach trägt man ihn in das Feld des Dokuments ein.
    4. Schließlich speichert man das Dokument.


    Das beeinhaltet einige Schritte. Kann mir nicht vorstellen, dass das automar ist (sprich der Domino Server das an einem Stück abarbeitet, bevor er den nächsten Client / Agenten versorgt). Ein andere Client kann auf der selben Datenbank zur selben Zeit die gleiche Seriennummer herausbekommen.

  • argh. hab mich falsch ausgedrückt.


    WENN Lokal gearbeitet wird, DANN läuft auf derm SERVER ein Agent der allen Dokumenten die noch keine Seriennummer haben eine verpasst.


    d.h. dokumente werden OHNE Seriennummer erstellt und bekommen dann sozusagen per Nacht und Agent (nachdem sie auf den Server repliziert wurden) eine Seriennummer.

  • Hi Jungens,


    erstmal Danke für die Hinweise, ich habe es jetzt soweit hinbekommen und glaub auch ein bisschen verstanden...


    Der Code wird noch optimiert aber es funktioniert erstmal so wie ich es wollte.




    Aber schon kommen neue Probleme ;)
    Wie fange ich das Problem ab, wenn ich ein schon vorhandenes Dokument habe, dass editiert werden muss. Dieses Dokument hat ja schon eine Seriennummer, dass dann mit dem obigen Script wieder überprüft wird...das will ich wiederrum verhindern.


    Kann ich das Feld irgendwie sperren nachdem man es eingetragen hat und wie könnte ich dem Script den Hinweis geben, dass dieses kein NEUES Dokument ist sondern ein Editiertes?


    Vielen Dank
    Gruss Deny

  • Zitat


    Deny6equj5 schrieb:
    Hi Jungens,



    Kann ich das Feld irgendwie sperren nachdem man es eingetragen hat und wie könnte ich dem Script den Hinweis geben, dass dieses kein NEUES Dokument ist sondern ein Editiertes?


    Schau Dir mal die Eigenschaften der Klasse "NotesUIDocument" an. Da gibt es eine Property "IsNewDoc".
    Die kannst Du abfragen und Deine Seriennummer-Überprüfung davon abhängig machen, ob Uidoc.IsNewDoc wahr ist.



    Gruß


    Ozzy

  • Ok Danke das habe ich verstanden und in der Hilfe ist es auch wie immer gut beschrieben.


    Nur noch ne Frage zum Feld bzw. die Eigenschaft. Sobald ich im Editiermodus bin möchte ich das, dass Feld nicht mehr editierbar ist, aber wenn ein Neues Dokument erstellt wird soll es wieder editierbar sein.


    Die Weiche für diese Abfrage hast du mir ja schon gegeben IsNewDoc etc...


    Nur wie bekommt das Feld jetzt diese Eigenschaft

  • Danke Jungs hat alles super geklappt ;)) zwar sind wieder tausend andere Fragen aber die poste ich extra...


    Aber supi Hinweise, es rockt ;)