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
-
Da hänge ich mich mal rein. Sowas möchte ich auch machen für Auftragsnummern die sich am Jahresanfang wieder auf "0001" reseten.
-
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...
-
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
-
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).
-
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 :)
-
Sorry, hatte vergessen, dass Bilderlinks hier nicht funktionieren:
-
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.
-
Korrektur: styled(iRechnungsnr, FarbeHG[, FarbeVG, Icon])
-
... Du hast ein Feld mit AKT angelegt , mein AKT ist aber nur eine Konstante/Variable im Skript, also kein Feld...
-
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.
-
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...
-
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.
-
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.
-
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
-
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. ;)
-
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
-
hatte vergessen das abzuschicken
-
Hm, Bernd, sieht irgendwie deckungsgleich aus, wie Dein vorheriger Post...sogar mit dem Fehler bei "DS Ergebnis" ;-)
-
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
-
let AKT := year(Auftragsdatum);
max((select Auftrag where year(Auftragsdatum) = AKT).'LaNu') + 1
ok, habe das jahr vergessen...
-
Danke Dir... Probiere ich nachher dann gleich mal aus.
-
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?
-
das Auftragsdatum mal einfach zurück setzen
-
Oder den Mac Kalender vor :-)
-
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")
Content aside
- vor 6 JahrenZuletzt aktiv
- 26Antworten
- 5670Ansichten