Neues Feld in Maske mit Zähler

  • Hallo Forum,
    komme leider nicht weiter mit meinem Problem.


    Ich habe ein neues Feld in eine Maske eingefügt.
    Ist ein berechnetes Feld.
    Das Feld soll mit einer fortlaufenden Nummer gefüllt werden.
    Ich brauche das nur einmalig für meine ca. 1500 bereits vorhandenen Dokumente die das betrifft.


    Für neu angelegte Dokumente hab ich dann eine Lösung.



    Ich habe es schon so versucht.
    In der Ansicht einfach eine aktion eingefügt. @command(toolsrefreshselecteddocs)


    Und das betroffene zahlenfeld berechnet mit dieser Formel:
    _cntFAQ := 0;
    _cntFAQ:= _cntFAQ + 1;
    _cntFAQ;



    Das refreshen der ausgewählten Dokumente funktioniert wunderbar.
    Jedoch wird das Feld bei jedem Dokument mit 1 gefüllt.


    Wird vielleicht die Variable _cntFAQ nach jedem aktualisierten Doc wieder verworfen und neu gesetzt?

  • Habe ich mir gedacht.
    Script ist zwar (noch) nicht meine Spezialität.
    Aber ich habe inzwischen ein script gefunden und es entsprechend anpassen können für mein Problem.


    Funktioniert so einwandfrei.


    Danke


    ###################
    Sub Initialize
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Dim collection As NotesDocumentCollection
    Dim doc As NotesDocument
    Dim searchFormula As String
    Dim item As NotesItem
    Dim i As Integer
    searchFormula = "Form= ""FAQ"""
    i = 0
    Set db = session.CurrentDatabase
    Set collection = db.Search( searchformula, nothing, 0 )
    Set doc = collection.GetFirstDocument



    While Not (doc Is Nothing)
    i = i + 1
    Call doc.ComputeWithForm(True,False)
    Call doc.replaceitemvalue("cntFAQ",i)
    Call doc.Save(True,False)
    Set doc = collection.GetNextDocument(doc)
    Wend
    End Sub

  • Obacht! Dein Vorgehen ist - zumindest wenn Du es nicht wirklich nur ein allereinziges Mal verwendest - der sicherste Weg, doppelte Nummern zu erzeugen: db.Search ist eine Abfrage, die auf dem Datenbankindex beruht... der nicht zeitnah aktualisiert wird.


    Du kannst einen View mit den existierenden Nummern erstellen - erste sortierte Spalte die Nummer - und per view.getDocumentByKey(searchkey$, true) oder per Formel abfragen; dann jeweils eine Nummer hochzählen.
    Wenn Du mehrere Repliken Deiner Datenbank hast, wirst Du allerdings auch damit doppelte Nummern kriegen.


    Ich habe das Problem in einer Umgebung mit 12 internationalen Servern so gelöst, dass ich eine "Nummern-Datenbank" auf unserem Masterserver habe, in der die laufenden Dokumentnummern abgelegt und aufgerufen werden.
    Das funktioniert hinreichend sicher.

  • Zu jo@chim's Antwort noch zwei Anmerkungen:

    • getDocumentByKey wird da nicht gehen, denn dazu brauchst du die letzte Nummer. Besser wäre dann eine Ansicht absteigend sortiert nach Nummer und per GetFirstEntry den ersten Eintrag holen. Dann die Nummer um eines hochzählen.
    • Bei mehreren Servern würde ich persönlich empfehlen, die Nummer im Hintergrund zu vergeben, dann kannst du dafür einen Agenten nehmen, der genau auf einem Server läuft. So wird es auch nicht zu Doppelungen kommen
  • getDocumentByKey wird da nicht gehen, denn dazu brauchst du die letzte Nummer. Besser wäre dann eine Ansicht absteigend sortiert nach Nummer und per GetFirstEntry den ersten Eintrag holen. Dann die Nummer um eines hochzählen.

    Ja klar, sorry. war da zu sehr bei meinem eigenen Skript :-)Ich vergebe Nummern in der Form Jahr-Doknr (... 16-000123...) und hole aus dem - natürlich absteigend - sortierten Nummernkreis das letzte Dokument des akt. Jahres per

    Code
    Set doc=view.GetDocumentByKey( actyear$ , True )


    anschliessend zähle ich hoch:


    Code
    n%=CInt(Right(doc.lfdNr(0),5))+1
    projektid$=actyear$+"-"+Format(CStr(n%),"00000")

    Agent, der nur auf der Master-Replik läuft, anstatt eigene Nummern-DB geht natürlich auch.

  • Danke euch.


    Wie bereits gesagt. Ich brauche das Script nur einmalig um vorhandene Dokumente zu nummerieren.
    Alle neu angelegten Dokumente ziehen die Nummerierung aus dem Profildokument
    getProfileField.


    bei speichern des dokumentes wird das profildokument um eines hochgezählt und wieder ins Profil gespeichert.
    Speichern kann man nur durch eine speichern Aktion.
    esc und speichern habe ich verhindert.


    Wird ein Dokument gelöscht dann geht auch die Nummer verloren. Spielt aber keine Rolle für meine DB.

  • Profildokument ist aber eine sehr ungünstige Idee dafür, wenn mit der DB mehr als ein Benutzer arbeitet.


    Denn ein Profildokument wird je User auf dem Client gecacht.


    D.h. legen am gleichen Tag zwei Benutzer ein Dokument an und haben den Client beide geöffnet bevor ein Dokument angelegt wurde, dann werden beide die gleiche Nummer vergeben, da sie beide vom gleichen Stand des Profildokumentes ausgehen.


    Wenn dann entweder per Ansichtslookup oder in einem normalen Dokument speichern