0

Verschiedene Nummerierungen erzeugen und kombinieren

Hallo!

Vielleicht kann mir jemand auf die Sprünge helfen.

A.) Ich benötige eine ganz normale Zählung von Datensätzen, die 2-stellig (also 00, 01, 02 ... 99) Zahlen erzeugt, die einmalig für einen Datensatz vergeben werden und nicht mehr änderbar sind. Die Datensätze werden auch nie wieder gelöscht, also ist der letzte auch der mit der höchsten Nummer - immer.

B1.) Ich benötige eine Zählung von Datensätzen auf ein Jahr bezogen (aus einem Datumsfeld heraus), beginnend bei 01 für das Jahr bis 99 für dieses vorgegebene Jahr. Auch das soll einmal festgelegt werden und darf nicht mehr änderbar sein. Ein anderes Jahr fängt dann auch wieder bei 01 an.

B2.) Wie bekomme ich aus dem vorgegebenen Jahr die beiden letzten Stellen (also für 2022 nur die 22) herausgezogen? Ich vermisse (oder habe es noch nicht gefunden) die Möglichkeit, eine Zahl in Text umzuwandeln, um dann die beiden letzten Stellen zu extrahieren.

Punkte B: Am besten wäre es, glaube ich, wenn diese Zahlenwerte mit einem Klick auf einen Button (z.B. "Jetzt Wert berechnen" oder so) erzeugt werden. Und dann nicht mehr geändert werden können. Es wird nur das Datum eingetragen, der Rest muss dann aus diesem Datum erzeugt werden.

Je nach Aufwand für diese Hilfe bin ich bei einer praktikablen Lösung gerne bereit eine angemessene Zahlung (vorher vereinbart) gegen Rechnung zu leisten. Könnte ja vielleicht doch bisschen Zeit in Anspruch nehmen ;-)

Gerne mit persönlicher Kontaktaufnahme.

37 Antworten

null
    • ZitronenKiller
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Bez. des "Select" Kommandos weiter oben:

    max gibt den höchsten Wert (nicht den Datensatz mit dem höchsten Wert) zurück, der durch das select Kommando erreicht wird. Dabei muss es sich um eine Zahl oder Zeit handeln, Text geht nicht. Du musst also ggf. Text in Zahl umwandeln bzw umgekehrt. 

    siehe Doku Funktionen text() und number()

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Bernhard Schulze 

      LfdNrYYn wurde in der Zeile davor mit number() in eine Zahl umgewandelt, substr() funktioniert aber nur mit Textfeldern bzw. -variablen.

      • Bernhard_Schulze
      • vor 1 Jahr
      • Gemeldet - anzeigen

      planox. pro Habs befürchtet :-(

      Brauch ich das mit dem substr dann überhaupt an der Stelle und kann ich nicht einfach die Zahl selbst verwenden?

    • Ninox-Professional
    • planoxpro
    • vor 1 Jahr
    • Gemeldet - anzeigen
    Bernhard Schulze said:
    Der fängt immer wieder bei 01 an.

    Sind 'JahrYY' und 'LfdNrYY' Textfelder? Gibt es in der Tabelle '01.1 Aufträge' Datensätze, bei denen die ersten beiden Stellen von 'LfdNrYY' (z.B. "2206") mit 'myJJ' (z. B. "06") übereinstimmen?

    • Ninox-Professional
    • planoxpro
    • vor 1 Jahr
    • Gemeldet - anzeigen
    Bernhard Schulze said:
    Brauch ich das mit dem substr dann überhaupt an der Stelle

    Die Nummer ist ja in einem Textfeld gespeichert und besteht aus zwei Teilen: Jahr und laufender Nummer innerhalb eines Jahres. Man muss also mit der where-Bedingung erst auf das betreffende Jahr filtern ("substr(XYNUMMER, 0, 2)"), dann aus den betreffenden Datensätzen die höchste laufende Nummer ermitteln ("substr(XYNUMMER, 2, 2)").

    • Bernhard_Schulze
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hallo!

    planox. pro said:
    Sind 'JahrYY' und 'LfdNrYY' Textfelder?

    JahrYY: format(Auftragsdatum, "YY") (ist das Ergebis ein Text, dann ja)

    LfdNrYY: Textfeld (hier stehen nur die Nummerierungen (bis jetzt) ab 01, 02 ... drin)

    Also die erzeugten Nummern sehen letztendlich aus wie folgt:

    "X-" + '01 Kunden'.KdNr + "-" + LfdNrYY + "-" + JahrYY + MonatMM
    

    Das klappt alles, bis auf die automatische Zählung von LfdNrYY, die ich im Moment noch händisch eintrage. (X = Platzhalter für festgelegte Kennungen: Auftrag, Auftragsbestätigung, Rechnung, Gutschrift etc.). LfdNrYY ist die fortlaufende Nummerierung für JahrYY, beginnend mit 01. Für jede Kennung separat, die in jeweiligen Tabellen generiert werden und mit der Kundentabelle verknüpft sind, teilweise auch untereinander (z.B. Rechnungen in den Aufträgen, da es zu einem Auftrag auch mehrere Rechnungen und Gutschriften geben kann).

    Die ganze Datenbank funktioniert mittlerweile genau so, wie ich mir das vorstelle. Nur diese !?$%&? automatischen Nummerierungen nicht :-(

    Naja, nach 5 Programmier-Tagen ist wohl eh noch kein Meister vom Himmel gefallen :-)

    • Ninox-Professional
    • planoxpro
    • vor 1 Jahr
    • Gemeldet - anzeigen
    Bernhard Schulze said:
    LfdNrYY: Textfeld (hier stehen nur die Nummerierungen (bis jetzt) ab 01, 02 ... drin)

    Okay, dann kann es natürlich nicht funktionieren. Das Script geht wie gesagt davon aus, dass die Nummern vierstellig vorliegen, also "2201", "2202" usw. Wenn das Jahr aber fehlt, kann man auch nicht darauf abfragen und das "substr(FELD, 2, 2)" gibt nichts Verwertbares zurück, weil die Zeichenkette ja nur 2 Stellen umfasst (beim substr() beginnt die Zählung der Zeichen bei 0, die 2 steht also für das dritte Zeichen).

    Die zweistellige Nummer im Feld 'LfdNrYY' ohne Berücksichtigung eines Jahres hochzuzählen, ist noch einfacher:

    let myLast := max((select '01.1. Aufträge').LfdNrYY);
    LfdNrYY := format(number(myLast) + 1, "00")
    

    ich glaube, jetzt haben wir alle Konstellationen durch.

    Wenn diese zweistellige Nummerierung auf vierstellige mit Jahreszahl umgestellt werden soll, müssten auch die vorhandenen Nummern zunächst in das vierstellige Format gebracht werden. Den Code dazu hatte ich weiter oben schon mal gepostet. 

      • Bernhard_Schulze
      • vor 1 Jahr
      • Gemeldet - anzeigen

      planox. pro Nochmals vielen Dank für die Hilfe und die Tipps zu diesem Thema. Auf Anhieb habe ich noch nicht alles verstanden, aber es ist nun eine Grundlage, auf der ich weiter aufbauen und Ninox lernen kann.

      Abschließend zu den Nummern nochmal: Es gibt ein Jahr (aus einem eingetragenen Datum), zu welchem die laufende Nummer beginnend bei 01 hochgezählt werden soll. Es gibt jedoch keine Kombination aus Jahreszahl und laufender Nummer. Nur eine Kombination aus Jahr und Monat. Das wird alles NACH den Eintragungen (bzw. Berechnungen) der Einzelteile zu einem Gesamtstring zusammengefügt.

      Also z.B. der erste Eintrag könnte am 02.01.2023 erfolgen, dann wäre die laufende Nummer dazu auch einfach 01. Der nächste am - z.B. 25.01.2023 - hat dann die laufende Nummer 02 - usw. Im Jahr 2024 erhält der erste eingetragene Datensatz eingetragen am - von mir aus - 10.01.2024 einfach wiederum die laufende Nummer 01 usw.

      Ich bekomme daher ganz einfach einen schnellen Überblick über den Kunden (KdNr), wann wurde der Auftrag erteilt, wann eine Rechnung geschrieben (zu einem Auftrag kann es mehrere Rechnungen geben - also Auftragsnummer ist nicht gleich Rechnungsnummer) und habe dabei auch die vorgeschriebene fortlaufende Nummerierung der Rechnungen. Kann anhand der Jahreszahl schnell einen Filter auf dem Feld JahrYY generieren (ohne extra 01.01.20xx bis 31.12.20xx eintragen zu müssen) und damit unkompliziert Ansichten erstellen.

      Ich werde mir die bereit gestellten Scripte nun einmal im Zusammenhang von Handbuch und Funktionsbeschreibungen genauer ansehen und hoffe, dass ich dabei künftig auf eigene Lösungen kommen werde.

      Nochmals danke Euch beiden! Hat mir viel geholfen.

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Bernhard Schulze 

      Ach so, die Nummerierung soll jahresweise erfolgen, das Jahr selbst in der Nummer aber nicht erscheinen? Die Nummer soll zweistellig mit führender 0 sein und in jedem neuen Jahr wieder bei "01" beginnen? Grundlage für die Ermittlung des Jahres ist ein Feld namens 'JahrYY'?

      Okay, dann würde ich es so versuchen:

      let myJJ := JahrYY;
      let myLast := max((select TABELLE where JahrYY = myJJ).XYNUMMER);
      XYNUMMER := format(number(myLast) + 1, "00")
      
      • Bernhard_Schulze
      • vor 1 Jahr
      • Gemeldet - anzeigen

      planox. pro Hi! Ok, das hätte ich natürlich gleich am Anfang so formulieren müssen. Mein Fehler. Danke für die Neuauslegung meiner doch wohl etwas unklaren Anleitungen ;-)

      Ich gebe Bescheid, wenn ich die o.g. Formel erfolgreich implementiert habe.

      Noch eine Grundsatzfrage: Ein Formelfeld ist doch immer dynamisch, oder? Da wird nichts drin gespeichert? Wie bekomme ich es dann so fixiert, dass es nicht immer neu kalkuliert wird? Geht das? Oder in ein Text- bzw. Zahlenfeld übertragen einmalig?

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Bernhard Schulze Ja, Formelfelder werden bei jedem Aufruf (als Tabellenspalte oder im Formular) neu berechnet. Das kann bei komplexen Formeln/Scripten und vielen Datensätzen zu Performance-Problemen führen.

      Alternative ist in der Tat das Speichern des Ergebniswertes in einem Datenfeld. Das kann bspw. im Rahmen eines Scriptes oder über einen Trigger gemacht werden.

      Allerdings muss man Formeln nicht generell vermeiden. Sie sind grundsätzlich ja ein sehr nützliches Element. Man sollte eben nur aufpassen, dass man die Performance damit nicht in Knie zwingt (insbesondere bei Tabellenansichten) und ggf. schauen, ob einmalige Berechnung und Speichern des Ergebnisses in einem Datenfeld nicht die bessere Alternative ist.

      Bei manchen Daten wie z. B. Rechnungen sollte man generell darauf verzichten, nur über  Formelfelder auf Informationen aus anderen Tabellen zu referenzieren. Sonst steht in einer bereits versendeten Rechnung plötzlich eine andere Adresse, weil der Kunde umgezogen ist, oder ein falscher Betrag, weil sich zwischenzeitlich der Preis des Artikels geändert hat.

    • Bernhard_Schulze
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Hallo!

    planox. pro said:
    Bei manchen Daten wie z. B. Rechnungen sollte man generell darauf verzichten, nur über  Formelfelder auf Informationen aus anderen Tabellen zu referenzieren. Sonst steht in einer bereits versendeten Rechnung plötzlich eine andere Adresse, weil der Kunde umgezogen ist, oder ein falscher Betrag, weil sich zwischenzeitlich der Preis des Artikels geändert hat.

    Genau das ist meine Befürchtung. Falsche Referenzen auf Grund einer ungewollten Neuberechnung einer Formel. Oder auf einmal die Änderung einer Nummer, die schon publiziert ist (z.B. Rechnungsnummer u.ä.). Das mit dem Speichern in ein Feld muss ich mir nochmal konzeptionell für meinen Fall ansehen.

      • Ninox-Professional
      • planoxpro
      • vor 1 Jahr
      • Gemeldet - anzeigen

      Bernhard Schulze 

      Manchmal ist es ja erwünscht, dass stets aktuelle Daten angezeigt werden. Wenn ich bspw. Adressen in einer Extra-Tabelle speichere, dann möchte ich in den Kunden-Stammdaten ja immer dessen aktuelle Adresse sehen, nicht die von vor drei Jahren. Da könnte man also durchaus referenzieren und sich dynamisch den jeweils aktuellen Eintrag anzeigen lassen.

      In einer Rechnung hingegen darf sich die Adresse auf keinen Fall ändern, deshalb sollte sie immer in eigenen Datenfeldern der Rechnungstabelle gespeichert werden.

      Das muss man in jedem Einzelfall entscheiden. Im Zweifel kann man aber ruhig erst mal das Formelfeld nehmen, wenn das einfacher ist. Optimieren lässt sich bei Bedarf auch später noch. Das ist ja das Gute an Ninox.

Content aside

  • vor 1 JahrZuletzt aktiv
  • 37Antworten
  • 257Ansichten
  • 3 Folge bereits