Datensätzen eine fortlaufende Nummer zuweisen

  • Hallo,


    ich suche nach einer Lösung für folgendes Problem: Ich erstelle gerade mit dem Domino-Designer eine Datenbank, in die verschiedenste User Datensätze eintragen können. Diese Datensätze sollen dann eine fortlaufende, vom Programm vergebene Nummer bekommen, angefangen von 1 bis unendlich.


    Wie stellt man denn so etwas an? Ich habe wirklich gar keine Idee, wie das zu bewerkstelligen sein könnte ....

  • Erstelle ein Feld (Berechnet beim Anlegen) und füge folgende Formel hinzu:



    TimeNow := @Now;
    YearString := @Right(@Text(@Year(TimeNow)); 2);
    MonthString := @Select(@Month(TimeNow); "01"; "02"; "03"; "04"; "05"; "06";
    "07"; "08"; "09"; "10"; "11"; "12");
    DayNumber := @Day(TimeNow);
    DayString := @Select(DayNumber; "01"; "02"; "03"; "04"; "05"; "06"; "07";
    "08"; "09"; @Text(DayNumber));
    HourNumber := @Hour(TimeNow);
    HourString := @If(HourNumber = 0; "00"; @Select(HourNumber; "01"; "02"; "03";
    "04"; "05"; "06"; "07"; "08"; "09"; @Text(HourNumber)));
    MinuteNumber := @Minute(TimeNow);
    MinuteString := @If(MinuteNumber = 0; "00"; @Select(MinuteNumber; "01"; "02";
    "03"; "04"; "05"; "06"; "07"; "08"; "09"; @Text(MinuteNumber)));
    SecondNumber := @Second(TimeNow);
    SecondString := @If(SecondNumber = 0; "00"; @Select(SecondNumber; "01"; "02";
    "03"; "04"; "05"; "06"; "07"; "08"; "09"; @Text(SecondNumber)));
    (YearString + MonthString + DayString + HourString +
    MinuteString+SecondString)



    oder ein wenig "performanter" :D



    _TimeNow := @Now;
    _YearString := @Right(@Text(@Year(_TimeNow)); 2);


    _MonthNumber :=@Month(_TimeNow);
    _MonthString := @Right("0" + @Text(_MonthNumber); 2);


    _DayNumber := @Day(_TimeNow);
    _DayString := @Right("0" + @Text(_DayNumber); 2);


    _HourNumber := @Hour(_TimeNow);
    _HourString := @Right("0" + @Text(_HourNumber); 2);


    _MinuteNumber := @Minute(_TimeNow);
    _MinuteString := @Right("0" + @Text(_MinuteNumber); 2);


    _SecondNumber := @Second(_TimeNow);
    _SecondString := @Right("0" + @Text(_SecondNumber); 2);


    _YearString + _MonthString + _DayString + _HourString + _MinuteString + _SecondString



    "gefunden" im Internet :D



    Schau auch mal in der offiziellen NOTES FAQ rein, da gibts auch was interessantes zu diesem Thema.


    So, hoffe das hilft dir weiter !?


    ach ja, die Formeln sind ohne Gewähr!

  • Danke für die raschen Antworten! :) Also die Funktionsweise der Formeln ist klar - wenn ich die in einem beim Anlegen berechneten Feld eingebe, dann wird das auf jeden Fall ein einzigartiges Feld.


    Aber mein weiteres Problem: Wie mache ich es dann, dass der erste Datensatz, der von einem User eingegeben wird, mit 1 betitelt wird, der nächste mit 2, der nächste mit 3, und so weiter ...?

  • Hi,
    Du erstellst ein n. editierbares o. verstecktes Feld mit der Nummer und die Passende Ansicht. In der Maske für neue Dokumente müsste dann in QueryOpen etwa folgendes rein:


    FIELD feld := feld;
    feldwert:=@DbColumn("" : "NoCache"; Server: db;"Nach Nummer"; 1);
    feldwertneu:=feldwert+1;
    @Do(
    @SetField("feld"; feldwertneu);
    @Command([ViewRefreshFields]);
    @If(job="";@SetField("feld"; "anfangswert");"")

  • Mögliche problem quellen einen solche aktion...


    1) Zwei benutzer die sich einen neue maske erstellen bekommen das gleiche nummer.


    2) Ein DB column liefert unter umständen nur text zurück, und einen sortierte spalte muß zahlen beinhalten.


    3) Benutzer die ein dokument erstellen, und 2 minuten später das dokument löschen könnten lücken verursachen, oder das nächste dokument könnte das gleiche nummer bekommen (weil der erste ja nicht mehr da ist), welches für den anwender problemen geben kann


    4) Der user der den DB mit nach hause nimmt (repliek) und zuhause arbeitet hat keine zugriff auf der server basierte DB, und damit nicht auf den aktuelle zustand, und kann damit doppelte dokumente erstellen.


    Der einzige weg der ich bis jetzt als 100% sicher erkannt habe ist es mit ein vorläufiges nummer zu machen, und an einen zentralle stelle (server basiert) dieses vorläufige nummer in ein vortlaufenden endgültigen zu ersetzen, also im nachhinein.

  • Hmmm vielleicht so.....


    Mache eine Ansicht in der nach der Dok Nummer sortiert ist.
    Per LS beim speichern des neuen Dokuments das letzte Dokument in der Ansicht ansprechen und die Doknummer auslesen. Danach die Doknummer +1 ins neue Dok eintragen.
    Wenn nicht ausgerechnet zwei absolut gleichzeitig speichern, sollte es keine doppelten Nummern geben. Diese Vorgehensweise funktioniert bei einer DB mit mehreren Repliken natürlich nicht.


    Happy Day
    Michael

  • Die logic die dieses macht muß aber vieles an unfüg abfängen... wie z.B einen fanatischen user der STRG-S mehrmahls hinter ein ander betätigt, oder sich nicht sicher ist und während der bearbeitung des dokuments, das server basierte dokument löscht ('Oops das wollte ich noch nicht'... habe es erlebt, paranoide users), und danach das gelöschte dokument erneut versucht zu speichern . . . . . damit das system, entweder lücken macht, oder anderes tut..
    Das einzige system was ich bis jetzt gesehen habe was 100% funktioniert hat war ein server basiertes NACHTRÄGLICHES vergebene nummer aus ein vergabe Dokument, welches einfach nur die nummer hatte, nichts mehr, bis dahin haben alle dokumente nur temporäre nummer (mit user kurzel) vergeben, welches dann natürlich auch nachträglich verfügbar bleiben sollte...

  • Deine Möglichkeit, das ganze über einen Agenten nachträglich auf dem Server laufen zu lassen, scheint mir die einfachste.
    Obwoh hierbei auch durch Löschungen Lücken entstehen können.
    Ganz sicher ist man nie.