0

Problem mit Fortlaufender Nummer

Hallo Zusammen,

ich habe ein Problem mit einer Fortlaufenden Nummer, diese soll JEDEN TAG also quasi immer ab 00:00 Uhr von vorne anfangen zu zählen. 
Bisher verwende ich folgenden Code:

let lastNum := max((select Testzyklus where date(Datum) = today()).number(substr(Testnummer, 2, 4)));

new.(Testnummer := "1" + "-" + format(lastNum + 1, "0000"));

 

Leider zählt das System ab 00:00 Uhr bei der Nummer weiter, bei der um 23:59 stehen geblieben worden ist. 
Hat jemand einen Lösungsansatz?

15 Antworten

null
    • Ninox-Professional
    • planoxpro
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Patrik, ich bin mir nicht sicher, ob es das Problem löst, und kann es auf die Schnelle auch nicht ausprobieren, aber man könnte es mal mit datetime() versuchen:

    let lastNum := max((select Testzyklus where datetime(Datum, 0) = datetime(today(), 0)).number(substr(Testnummer, 2, 4)));
    Testnummer := "1" + "-" + format(lastNum + 1, "0000")
    
    
    • Patrik_Ronschke
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Vielen Dank, ich probiere das heute Nacht mal entsprechend aus. 

    • Patrik_Ronschke
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Moin, 

    leider funktioniert auch dieser Code nicht :( 

    siehe auch angehängtes Bild. 

    • UweG
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Ich habe es mal nachgebaut und es funktioniert bei mir.
    Du gibts im Script als Nummerierungsvorgabe: 

    Testnummer := "1" + "-" + format(lastNum + 1, "0000")

    an.
    In dem Screenshot werden aber ganz andere Nummern angezeigt 2- und 4- statt 1-
    Bist du sicher, die richtige Formel zu verwenden?

    • mirko3
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Vielleicht bin ich ja am Thema vorbei, aber meine Lösung sieht deutlich komplizierter aus und ist für einen Button oder Trigger:

    let dateFeld := Datum;
    let lastNrAsString := extractx(last(((select Testzyklus) order by number(Nr)).Testnummer), "\d+(?=$)");
    let lastNrAsNumber := number(lastNrAsString);
    let nextNrOnDay := lastNrAsNumber + 1;
    let penultimateNr := max((select Testzyklus).number(Nr)) - 1;
    let penultimateDate := record(Testzyklus,penultimateNr).Datum;
    let nextNr := if last(((select Testzyklus) order by number(Nr)).Datum) > penultimateDate then
            1
        else
            nextNrOnDay
        end;
    Testnummer := "1" + "-" + format(nextNr, "0000")
    
    
    • Patrik_Ronschke
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Uwe, 

    vielen Dank für deine Antwort, die 1, 2, 3, 4, 5, etc. wird je nach einer Rollenvergabe vergeben. Also je nach Benutzeraccount steht eine andere Nummer vor dem Bindestrich. 

    Die eigentliche Nummerierung erfolgt dann erst hinter dem Bindestrich. 

    • rainless
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Patrik,

    bei mir tut es auch. Mich wundert Dein "new" in Zeile 2 und ich frage mich, WO Du das Script untergebracht hast.

    Bei mir sieht es so aus:

    Das Script ist in "Trigger bei neuem Datensatz" untergebracht. Das Script ist bis auf das "new"  das Gleiche wie bei Dir:

    let lastNum := max((select Testzyklus where date(Datum) = today()).number(substr(Testnummer, 2, 4)));
    Testnummer := "1" + "-" + format(lastNum + 1, "0000")
    

    Das kommt heraus:

    Zeile 1-5 erst mal so befüllt, Testnummer hat sich erhöht. Dann habe ich bei allen das Datum auf den Vortag gesetzt und Zeile 6 und 7 erzeugt. Das geht so.

    • Patrik_Ronschke
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Hallo Lars,

    vielen Dank für deine Mühe.

    Ich nutze den Code hinter einen Button in der Tabelle welche ich als Dashboard benutze. Über diesen Button wird dann in der Tabelle "Testzyklus" ein neuer Datensatz erstellt und dieser mit entsprechenden werten schon befüllt (daher das new).

    Hier zum Verständnis einmal der komplette Code:

    let new := (create Testzyklus);
    popupRecord(new, "Registrierung");
    let my := first(select 'Aktuelle Tester');
    new.(Tester := my.'Testung Straße 1');
    let lastNum := max((select Testzyklus where date(Datum) = today()).number(substr(Testnummer, 2, 4)));
    new.(Testnummer := "1" + "-" + format(lastNum + 1, "0000"));
    new.('Teststraße' := 1);
    new.('Unterschrift-check' := true)
    
    • rainless
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Ich weiß nicht, ob ich das ganz verstehe, aber meinst Du so etwas:

    Wenn man auf "Neuer Zyklus" drückt, dann wird ein neuer Datensatz mit neuer Testnummer und Datum von heute angelegt. Alle anderen Felder kann man natürlich auch noch initialisieren (entweder als Vorbefüllung im Datenmodell selbst oder dynamisch über den Button).

    Hinter dem Button liegt das:

    let new := (create Testzyklus);
    new.(Datum := today())
    

    Ansonsten liegt das Hochzählen weiterhin an der oben beschriebenen Stelle.

      • Patrik_Ronschke
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Lars 

      Nicht ganz: 

      - Tabelle Dashboard mit dem Button „neuer Testzyklus“

      - Tabelle Testzyklus

       

      Hinter dem Button „neuer Testzyklus“ befindet sich das oben von mir gepostete Skript.

      Mit diesem wird dann ein Datensatz in der Tabelle Testzyklus erstellt und entsprechend die Testnummer geschrieben.

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

      Patrik Ronschke 

      Es sieht so aus, als wenn beim "select" der Datums-Filter nicht greifen würde, und deshalb immer die höchste Nummer der Tabelle ermittelt wird. Außerdem heißt das Feld "Datum", enthält aber augenscheinlich einen Zeitstempel mit Uhrzeit. Und wo wird es zugewiesen? Ich würde auch mal die Feldtypen überprüfen und ob vielleicht noch irgendwelche anderen Trigger aktiv sind.

      Wobei - wenn die Nummerierung anhand des Datums der Erstellung des Datensatzes erfolgen soll, dann könnte man auch gleich auf das ninox-eigene, nicht manipulierbare Zeitstempel-Feld 'Erstellt am' zugreifen, das neben anderen automatisch beim "create" erzeugt wird. Und bei der Gelegenheit würde ich auch gleich die Reihenfolge der Codezeilen mit den Tabellenzugriffen umstellen.

      Insofern wäre mein Vorschlag, es mal so zu versuchen, bevor man weiter herumrätselt, woran genau es in deiner Konstellation liegen könnte:

      let my := first(select 'Aktuelle Tester');
      let lastNum := max((select Testzyklus where date('Erstellt am') = date(now())).number(substr(Testnummer, 2, 4)));
      let new := (create Testzyklus);
      new.(Tester := my.'Testung Straße 1');
      new.(Testnummer := "1" + "-" + format(lastNum + 1, "0000"));
      new.('Teststraße' := 1);
      new.('Unterschrift-check' := true);
      popupRecord(new, "Registrierung")
      


      Sichtbar machen kann man den Zeitstempel der Erstellung des Datensatzes übrigens mit einem Funktionsfeld mit dem Inhalt

      'Erstellt am'
      • Patrik_Ronschke
      • vor 2 Jahren
      • Gemeldet - anzeigen

      planox. pro 

      Alles ziemlich merkwürdig….

      Ich greife auf ein ausgeblendetes Datumsfeld zu, nur mal nebenbei :)) 

      Ich habe nun auch nochmal eine neue Tabelle mit je nur einen Button erstellt und habe deinen Code dort eingefügt, er spuckt mir weiterhin die bereits laufende Nummer aus und fängt nicht bei 1 an…

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

      Patrik Ronschke Stell die Datenbank doch mal zum Download, damit man mal reinschauen kann. Irgendwas muss da ja anders sein, wenn es nur dort nicht funktioniert.

    • rainless
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Das ändert m. E. überhaupt nichts. Ich habe jetzt einfach ein komplett unabhängiges Modell Dashboard angelegt (und falls man referenziert, hat man Zugriff auf die Daten der Testzyklen, aber das ist eine andere Baustelle). Dem Dashboard habe ich einen Button gegeben mit genau dem gleichen Code. Wenn man den drückt, dann werden neue Testzyklen angelegt - mit fortlaufender Nummer und bei Datumsgrenze ab 0001.

    • Patrik_Ronschke
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Das Problem ist entsprechend durch planox. pro gelöst worden. 

    Es lang ein ein paar Klammern: 

    let myD := date(now());
    let lastNum := max((select Testzyklus)[date(Datum) = myD].number(substr(Testnummer, 2, 4)));
    let newTZ := (create Testzyklus);
    newTZ.(Datum := myD);
    newTZ.(Tester := myTester);
    newTZ.('Teststraße' := number(myUR));
    newTZ.('Unterschrift-check' := true);
    newTZ.(Testnummer := myUR + "-" + format(lastNum + 1, "0000"));
    popupRecord(newTZ)
    

     

    Vielen Dank für die gute Mithilfe.

Content aside

  • Status Answered
  • vor 2 JahrenZuletzt aktiv
  • 15Antworten
  • 113Ansichten
  • 4 Folge bereits