0

Fortlaufende Nummer

Hallo Leute, wie kann ich eine fortlaufende Nummer erstellen, z.B. Kundennummer: 001,002 oder sogar K001, K002 und F003, K004 damit man noch eine Variable hinzufügen kann.

Vielen Dank

25 Antworten

null
    • Support
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo,

    fortlaufende Nummern kann man mit einem Skript auf Tabellenebene vergeben:

    - Erstellen Sie zunächst ein Textfeld für die "Kundennummer".

    - Öffnen Sie jetzt den Tabelleneditor, auf der linken Seite finden "Skript ausführen bei Erstellen eines neuen Datensatzes"

    - Nutzen Sie folgendes Skript ("Kunden" ist hier der Name der Tabelle mit den Kunden:

     

    Kundennummer:= "K"+format(cnt(select Kunden),"000")

     

    Viele Grüße und schöne Ostern, Alex

    • wosacele
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Alex, und wie kann ich einen Startpunkt definieren? Ich will z.B. bei 001263XX beginnen. Von dort aus soll bei Neuanlage eines Datensatzes in 1er-Schritten hochgezählt werden. Im Augenblick sieht das bei mir so aus:

    Belegnummer := format(cnt(select Dokumente), "000000") + "XX"

    Wenn ich den ersten Datensatz anlege, heißt der 000001XX. Den ändere ich dann händisch ab auf 001263XX. Dann sollte der nächste datensatz mit 001264XX weitergehen. Tut aber nicht. Der heißt dann wieder 000002XX.

    Danke vorab und viele Grüße

    • Ninox-Professional
    • planoxpro
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Ich heiße zwar nicht Alex, aber so ähnlich, deshalb versuche ich es mal (beim Anlegen eines neuen Datensatzes):

     

    let LaufNr := max((select Dokumente).number(Belegnummer)) + 1;
    Belegnummer := format(LaufNr, "00000000")

    • wosacele
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Danke für die Hilfe. Funktioniert aber leider auch nicht. Hab den gleichen effekt?!

    • Ninox-Professional
    • planoxpro
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Man müsste natürlich auch hier einmal die erste Nummer auf den Startwert setzen. Dann sollte es gehen. Bei mir funktioniert es jedenfalls.

    • Ninox-Professional
    • planoxpro
    • vor 5 Jahren
    • Gemeldet - anzeigen

    BelegnummerGenerieren1

    • wosacele
    • vor 5 Jahren
    • Gemeldet - anzeigen

    OK. Bei mir macht wohl das (+ "XX") ein Problem. Hatte das so:

    let LaufNr := max((select Dokumente).number(Belegnummer)) + 1;
    Belegnummer := format(LaufNr, "000000") + "XX"

    Ich habe das mit dem XX jetzt anders geregelt. Jetzt funktioniert das, wie ich es wollte. Danke!!!

    Darf ich noch eine Frage stellen? Ich möchte über eine Schaltfläche in ein Textfeld einen aus verschiedenen Feldern zusammengesetzten Text generieren. Diesen möchte ich dann später kopieren und als Dateinamen verwenden. Folgendes Format stelle ich mir vor:

    20181025_001263BS

    Jetzt habe ich die Schaltfläche folgendermaßen programmiert:

    let txt := "YYYYMMDD" + "_" + 'Beleg Nr.';
    Belegname := txt

    Das umgekehrte Datum YYYYMMDD ist mein Problem. wie bekomme ich da automatisch das aktuelle JahrMonatTag rein?

    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    format(today(),"YYYYMMDD")

    Leo

    • wosacele
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Ihr seid Spitze, danke!!! (bin absoluter Laie, komme aber echt gut zurecht mit dem Programm ;)

    • Ninox-Professional
    • planoxpro
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Ach so, da sollten tatsächlich die Buchstaben "XX" stehen? Ich dachte, das "XX" sei als Platzhalter für die letzten beiden Stellen der fortlaufenden Nummer gedacht.

     

    Mit einer Buchstabenfolge am Ende sähe es so aus:

     

    let LaufNr := number(max((select Dokumente).substr(Belegnummer, 0, 6))) + 1;
    Belegnummer := format(LaufNr, "000000") + "XX"

     

    Das andere Problem mit dem zusammengsetzten Text sollte sich folgendermaßen lösen lassen:

     

    Belegname := format(today(), "YYYYMMDD") + "_" + Belegnummer

     

    Infos zu den "Formatierungsfunktionen" finden sich im Handbuch:
    https://ninoxdb.de/de/manual/berechnung/funktionen

    • Markus_Weise
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Wahrscheinlich eine einfache Frage, aber wenn ich die Buchstabenfolge VOR die LaufNr. setzen will, wie mach ich das?

    Ich habe es mit "XX" + format( probiert, das scheint aber nicht zu funktionieren...Danke schonmal für Antworten.

    • Torsten_Stang.1
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Markus,

     

    wenn das XX vorne steht stimmt die Bestimmung der höchsten Belegnummer nicht, die muss man dann mit anpassen:

     

    let LaufNr := number(max((select Dokumente).substr(Belegnummer, 2, 6))) + 1;
    Belegnummer := "XX"+format(LaufNr, "000000") + "XX"

    • Markus_Weise
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Ah ja, sry da stand ich auf dem Schlauch. Danke dir :)

    • john_eans
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Wie verhält es sich mit der fortlaufenden Nummerierung, wenn in die selct-Abfrage zusätzliche eine bedingung where eingebaut wird?

     

    Ich habe z.B. die Tabelle Rezepte und dazugehörige Schritte. Wenn ich in der Tabelle Rezepte in der Ansicht der Schritte (Feld-Ansicht) auf das Plus klicke, dann wird dem Schritt automatisch das aktuelle Rezept hinzugefügt.

    Bildschirmfoto 2021-12-16 um 09.52.31

    Folgender Code ("bei neuem Datensatz folgendes Script ausführen" in der Tabell Schritte) erhöht aber nicht wie gewünscht das Feld der Rangfolge um +1 sondern liefert immer den Wert 2.

     

    let myR := this.Rezept;
    let myN := cnt(select Schritte where Rezept_uu = myR);
    Rangfolge := myN + 1

     

    Ich gehe davon aus, dass das daran liegt, dass das Script ausgeführt wird, bevor der "Schritt" dem "Rezept" automatisch zugeordnet wurde. Kann man das irgendwie umgehen?

    (Ich nutze die Mac-Version)

    • john_eans
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Richtiger code ist natürlich:

     

    let myR := this.Rezept.Nr;
    let myHN := cnt(select Schritte where Rezept.Nr = myR);
    Rangfolge := myHN

    • john_eans
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Heidenei...

    let myR := this.Rezept.Nr;
    let myN := cnt(select Schritte where Rezept.Nr = myR);
    Rangfolge := myN + 1

    • Torsten_Stang.1
    • vor 2 Jahren
    • Gemeldet - anzeigen

    hm, die Schritte sind mit dem Rezept verknüpft?

     

    let myN := cnt(Rezept.Schritte)
    Rangfolge := myN

    • john_eans
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Wesentlich bessere und einfachere Denkweise! Und ja, die Schritte sind mit dem Rezept verknüpft.

    Aber leider ebenfalls nicht erfolgreich: jetzt wird bei einem neuen Schritt über die integrierte Schaltfläche 0 eingetragen.

    Auch hier scheint es so, als würde erst das Script ausgeführt und dann die automatische Verknüfung erstellt.

    • john_eans
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Ein Button mit folgendem Code macht genau das, was ich mir vom Plus-Symbol wünschen würde.

     

    let myR := this;
    let myN := (create Schritte);
    myN.(
         Rezept := myR;
         Rangfolge := cnt(Rezept.Schritte)
    )

    • Torsten_Stang.1
    • vor 2 Jahren
    • Gemeldet - anzeigen

    dann erstell einen neuen Schritt doch über einen Button:

     

    let my := this;
    let myN := cnt(my.Schritte)+1;
    let mySchritt := (create Schritte);
    mySchritt.(Rezept := my;
       Rangfolge := myN);
    popupRecord(mySchritt)

    • Torsten_Stang.1
    • vor 2 Jahren
    • Gemeldet - anzeigen

    okay, bist selbst drauf gekommen - wenn Du die Verknüpfung in 'Rezept' als ComboBox darstellst und Deinen Button als "+" nebendran setzt, bist Du eigentlich UI-mässig gleich unterwegs.

    • Torsten_Stang.1
    • vor 2 Jahren
    • Gemeldet - anzeigen

    alternativ könntest Du den Code auch in den Änderungstrigger der Tabelle 'Schritte' packen, dann würde die Rangfolge spätestens nach der ersten Eingabe irgendeines Feldes ausgefüllt...

     

    if not Rangfolge then
       let myN := cnt(Rezept.Schritte)
       Rangfolge := myN
    end

    • Torsten_Stang.1
    • vor 2 Jahren
    • Gemeldet - anzeigen

    was mir da gerade einfällt und evtl. mal einen Versuch beim Trigger zum neuen Datensatz wert wäre: 

     

    "Sie können jetzt Ihre Skripte anweisen, auf das Ende einer Synchronisierung zu warten, bevor Sie server-basierte Trigger oder Befehle ausführen. Damit stellen Sie die Verfügbarkeit der Daten auf dem Server sicher, bevor der Trigger aktiv wird.Die neue Funktion waitForSync() sorgt dafür, dass der nächste Synchronisationszyklus vor der Ausführung des restlichen Codes abgeschlossen ist.Syntax: waitForSync() "

     

    Also einfach mal waitForSync() im Code voranstellen.

    • john_eans
    • vor 2 Jahren
    • Gemeldet - anzeigen

    waitForSync() führt dazu, dass bei

     

    waitForSync();

    Rangfolge := cnt(Rezept.Schritte)

     

    garnichts eingetragen wird. Ohne waitForSync() wird 0 eingetragen.

     

    Der Button funktioniert wie gewünscht. Die Darstellung Combo-Box funktioniert leider nur auf der "falschen" Seite der Verknüpfung.

    • Torsten_Stang.1
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Okay, stimmt, sorry. Ich löse es in der Regel so, dass ich "Untertabellen" nicht sichtbar stelle und Ansichten + Button stattdessen verwende...

Content aside

  • vor 2 JahrenZuletzt aktiv
  • 25Antworten
  • 7899Ansichten