0

Nummernkreis bei Jahreswechsel zurücksetzen

Hallo zusammen,

 

erstmal riesen Lob an die Entwickler dieser Software. Macht echt Spaß damit zu arbeiten und es geht schnell und unkompliziert. Hatte mal Filemaker versucht, allerdings aufgrund Zeitmangels nie richtig einsteigen können. Super Alternative.

Mein Problem:

Ich erstelle in der Firma regelmäßig Nummern für Angebote, Rechnungen und Projekte, diese werden über das Jahr hinweg fortlaufend vergeben und sollen zum Jahreswechsel resettet, also wieder von 0001 beginnen. Aktuell sieht meine Formel so aus:

Im Beispiel einer Projekt ID

'Projekt ID' := "PN" + -(2000 - year(today())) + format(cnt(select Projekte), " 0000")

ergibt dann die Form:

PN18 0001

dann wird fleißig hochgezählt und ab 2019 hätte ich gerne wieder diese Form:

PN19 0001

Während natürlich alle Nummern mit PN18 entsprechend dem Erstellungsdatum erhalten bleiben.

Was muss ich noch tun?

Vielen Dank, Reinhard

26 Antworten

null
    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Da hänge ich mich mal rein. Sowas möchte ich auch machen für Auftragsnummern die sich am Jahresanfang wieder auf "0001" reseten.

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    let AKT := year('Projektdatum')

    'Projekt ID' := "PN" + -(2000 - year(today())) + format(cnt(select Projekte year('Projektdatum') = AKT), " 0000")

     

    Damit soltest Du nur die Datensätze im aktuellen Projektjahr zählen...

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    mir ist oben beim kopieren etwas abhanden gekommen 🤭🤭🤭, jetzt ist es richtig

     

    let AKT := year('Projektdatum')

    'Projekt ID' := "PN" + -(2000 - year(today())) + format(cnt(select Projekte where year('Projektdatum') = AKT), " 0000")

     

    Damit soltest Du nur die Datensätze im aktuellen Projektjahr zählen...

    where year('Projektdatum') = AKT zählt nur die Datensätze im altuellem Jahr. Für Projektdatum natürlich Dein eigenes Datumsfeld einsetzen

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

    Wobei die Nummern idealerweise statisch in einem Textfeld des betreffenden Datensatzes gespeichert werden sollten. Dann können sie sich auch nicht im Nachhinein verändern, wenn man aus irgendwelchen Gründen mal die Formel anpasst, sich der kalendarische Bezug oder vielleicht auch die Ninox-Syntax ändert.

     

    Insbesondere bei Rechnungen könnte allein die theoretische Möglichkeit, dass sich systembedingt im Nachhinein die Nummern ändern könnten, zu Problemen mit dem Finanzamt führen.

     

    Um zu verhindern, dass die Nummer in besagtem Textfeld versehentlich durch den Benutzer geändert wird, könnte man sie "verstecken" und in einem weiteren Funktionsfeld anzeigen lassen (welches sich bspw. auch per styled() formatieren ließe).

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Ihr seit echt gut. Ich habe es nun hinbekommen. Das erste Projekt nach Jahreswechsel fängt wieder bei 0 an. Verändern lässt sich die Nummer nun auch nicht mehr. Wohl mehr aus Zufall habe ich die Schutzfunktion so gebaut:

    [img]https://up.picr.de/34117745ic.png[/img]

    [img]https://up.picr.de/34117746ih.png[/img]

    [img]https://up.picr.de/34117747sj.png[/img]

    Da das Datumsfeld eigentlich nie leer ist, kann ein Zustand in dem man die Nummer verändern könnte eigentlich nicht auftreten. Aber Copytexter hat schon recht, dass man die einmal ermittelte Nummer irgendwo frei von Funktionen und Formeln autark speichern sollte. Wenn ich sie aber in einem weiteren Funktionfeld anzeige muss ich sie ja auch irgendwie "schützen".... Ich brauche leider immer Codebeispiele um das zu begreifen.

    Grundsätzlich aber von meiner Seite aus schon mal Danke. Die Funktion fliesst heute noch in meine Anwendung rein :)

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Sorry, hatte vergessen, dass Bilderlinks hier nicht funktionieren:

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

    Beispiel: Textfeld "iRechnungsnr" und Funktionsfeld "Rechnungsnr". In den Tabellen-Optionen unter "Bei neuem Datensatz folgendes Script auführen" (oder per Schaltfläche):

     

    iRechnungsnr := Formel_zum_Generieren_der_Nummer

     

    Dieses Feld kann man ausblenden ("false" bei "Feld nur anzeigen, wenn:"). Und im Funktionsfeld "Rechnungsnr" steht als Formel nur:

     

    iRechnungsnr

     

    Oder mit Formatierung:

    styled(iRechnungsnummer, FarbeHG[, FarbeVG, Icon])

     

    Angezeigt wird dann nur das nicht direkt änderbare Funktionsfeld mit der Nummer.

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

    Korrektur: styled(iRechnungsnr, FarbeHG[, FarbeVG, Icon])

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    ... Du hast ein Feld mit AKT angelegt 🤔, mein AKT ist aber nur eine Konstante/Variable im Skript, also kein Feld...

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Und ich habe grad das Problem entdeckt, wenn man einen Datensatz löscht, dann wird die dort vergebene Auftragsnummer bei einem neuen Datensatz noch einmal neu verwendet. Das darf ja auch nicht sein.

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    das kommt dirch die Funktion cnt - Datensätze zählen.

    besser ist (mache ich gundsätzlich), ein eigenes Feld mit einer laufenden Nummer: z.B. LaNu

    dann

    let AKT := year('Projektdatum')

    'Projekt ID' := "PN" + -(2000 - year(today())) + format(max(select Projekte where year('Projektdatum') = AKT).'LaNu' + 1, " 0000")

     

    sollte funktionieren...

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Bekomme ich nicht hin. Das Kommando "max" will er gar nicht, färbt sich auch nicht ein. Und das Feld LaNu interessiert ihn auch nicht.

    Das hier geht wie gesagt so nun:

    let AKT := year(AUFTRAGDATUM);
    AUFTRAGNR := "AUFTR" + -(2000 - year(today())) + format(cnt(select AUFTRAG where year(AUFTRAGDATUM) = AKT), " 10000")

    Ich benutze die Felder:

    (Text) AUFTRAGNR und (Datum) AUFTRAGDATUM und (Text) AKT und (Berechnung) LaNu

    Wobei sich LaNu die Zahl aus Ninox eigenem, unveränderbarem Nr. Feld holt.

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    ok, LaNu ist nur ein Beispielbezeichnung. Du mußt das Feld natürlich anlegen.

    Dann würde ich der Fehlerquellen halber ein extra Berechnungsfeld nur für die Nummer erstellen, mit dem entsprechenden Skript.

    die funktion max gibt es.

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    let AKT := Auftragsdatum;

    max((select Auftrag where year(Auftragsdatum) = AKT).'LaNu') + 1

     

    Damit hast Du eine laufende Nummer und kannst auch mal einen Datensatz löschen. Ds Ergebnis dann in das eigentliche Format umwandeln... ist einfacher

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

    So könnte es auch ohne Zusatzfeld gehen ("Bei neuem Datensatz folgendes Script ausführen"):

     

    let Jahr := substr(text(year(AUFTRAGSDATUM)), 2, 2);
    let Nummer := substr(last(select AUFTRAG where substr(AUFTRAGNR, 2, 2) = Jahr).AUFTRAGNR, 4, 4);
    AUFTRAGNR := "PN" + Jahr + format(number(Nummer) + 1, "0000")

     

    Wie immer ohne Gewähr. ;)

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    let AKT := Auftragsdatum;

    max((select Auftrag where year(Auftragsdatum) = AKT).'LaNu') + 1

     

    Damit hast Du eine laufende Nummer und kannst auch mal einen Datensatz löschen. Ds Ergebnis dann in das eigentliche Format umwandeln... ist einfacher

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    hatte vergessen das abzuschicken 🙄🙄🙄

    • Tacho
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hm, Bernd, sieht irgendwie deckungsgleich aus, wie Dein vorheriger Post...sogar mit dem Fehler bei "DS Ergebnis" ;-)

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    nein, ist es nicht, "DS" sehe ich zwar nicht aber, die Zeile hbe ich aus meinem Buchungsprogramm kopiert...

    lege mal ein Berechnungsfeld an und teste es - werde ich auch machen - zum Test

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    let AKT := year(Auftragsdatum);

    max((select Auftrag where year(Auftragsdatum) = AKT).'LaNu') + 1

     

    ok, habe das jahr vergessen...

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Danke Dir... Probiere ich nachher dann gleich mal aus.

    • Reinhard
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Wow, sehr lebhaftes Forum hier, auch das ist super. Hat wunderbar geklappt, besten Dank Euch!

     

    Interessieren würde mich nun nur noch, wie ich den Jahreswechsel vorab testen kann?

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    das Auftragsdatum mal einfach zurück setzen 

    • Pyromixer.1
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Oder den Mac Kalender vor :-)

    • Reinhard
    • vor 6 Jahren
    • Gemeldet - anzeigen

    hat geklappt, super!

    Ich habs einfach mal in den "nach Änderung folgendes Skript ausführen" kopiert.

    Meine Formel sieht jetzt aktuell so aus und funktioniert wie gewünscht:

    let y := year(Datum);
    let c := max(select Rechnungen where year(Datum) = y);
    'Index fortlaufend' := max((select Rechnungen where year(Datum) = y).'Index fortlaufend') + 1;
    Rechnungsnummer := "RN " + format(Datum, "YYMM") + " " + -(2009 - year(Datum)) + format(max((select Rechnungen where year(Datum) = y).'Index fortlaufend'), "000")