0

(Denk-)Fehler bei fortlaufender Rechnungsnummer?

HAllo an Alle,

die RG-Nummer soll wie folgt aussehen: Jahr + viertellige fortlaufenden Nummer, ergo 2020/0001 usw.

Dazu habe ich folgenden Code (habe ich hier im Forum gefunde) in der Tabelle Rechnungen eingegeben:

 

let Datum := today();
let y := year(Datum);
let c := cnt(select Rechnungen where year(Datum) = y);
Rechnungsnummer := format(y, "00") + "/" + format(c, "0000")

 

Soweit so gut funktioniert alles prima.

Nun habe ich folgende Situation: Als ich die RG 2020/0002 dupliziert habe und später dann eine neue Rechnung erstellen wollte, war die RG-Nummer nicht 2020/0003, sondern 2020/0004.

 

Wahrscheinlich macht der Code alles richtig. Aber welcher Code erzeugt die fortlaufende Nummer 2020/0003?

 

Vielen Dank.

Gruß

Kruna

6 Antworten

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

    Hallo Kruna, wenn man einen Datensatz dupliziert, wird ein neuer Datensatz mit demselben Inhalt erstellt. Man hat also einen Datensatz mehr als vorher, in diesem Fall 3 statt 2. Und da in deinem Script mit dem "select" nur vorhandene Datensätze gezählt und daraus die Rechnungsnummern generiert werden, ist sie beim nächsten Datensatz halt 4.

    Wenn man eine eindeutige, laufende Nummer auf diese Weise generieren will, sollte man keine Datensätze löschen oder duplizieren, sonst hat man doppelte bzw. fehlende Nummern.

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ich glaube, dass ich eine Lösung gefunden habe:

     

    Ich habe den Code von Vorlage 'Rechnungen' so angepasst, dass es zu funktionieren scheint.

    Der eigentliche Code aus der Vorlage lautet:

    let myYear := year(today());
    let myRN := max((select Rechnungen where year('Datum der Rechnungsstellung') = myYear).substr('ID-Nr', 8));
    'ID-Nr' := "RE-" + myYear + "-" + format(number(myRN) + 1, "0000");
    'Datum der Rechnungsstellung' := today().

    Könnte mir bitte jemand erklären, was die Zahl 8 im Code bedeutet? Manchmal sehe ich auch 4, 4 oä. Ich habe irgendwie nie verstanden, was diese Zahlen zu bedeuten haben. Hat es irgendetwas mit der Ziffernfolge zu tun?

    Da ich 'RE-' weggelassen habe, habe ich die 8 durch 6 ersetzt und nun funktioniert es, vorher ist die RG-Nummer immer bei 2020/0010 stehengeblieben.

    So sieht es nun bei mir aus:

     

    let myYear := year(today());
    let myRN := max((select Rechnungen where year(Rechnungsdatum) = myYear).substr(Rechnungsnummer, 6));
    Rechnungsnummer := myYear + "/" + format(number(myRN) + 1, "0000");
    Rechnungsdatum := today()

    Sollte richtig sein, oder?

     

    Gruß

    Kruna

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    HAllo Copytexter,

    ja so ähnlich dachte ich es mir schon.

    Nun, wie eben gepostet, würde es mit dem anderen Code funktionieren, dass man die RG duplizieren kann.

    Mir geht es eigentlich darum, dass ich zB einen Auftrag habe und daraus eine RG erstellt wird. Jedoch wird nur ein Teil der RG beglichen. Da dachte ich mir, dass ich dir RG duplizieren könnte (die RG-Nummer bleibt gleich), wenn der andere Teil der RG beglichen werden soll. Oder wäre es besser, wenn eine neue RG-Nummer erstellt wird?

     

    Gruß

    Kruna

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

    Rechnungsnummern müssen laut Finanzamt eindeutig sein. Ich würde also schon allein deshalb für jede Rechnung unbedingt eine neue Nummer vergeben. Auch für Teilrechnungen, die sie sich auf dasselbe Projekt oder dieselbe Bestellung beziehen.

    Auch ich habe Angebote, Aufträge und Rechnungen in einer Tabelle und übernehme regelmäßig Daten von einem (z. B. Auftrag) in ein anderes Dokument (z. B. Rechnung). Allerdings gehe ich dabei generell anders vor, habe für das "Duplizieren" eine Schaltfläche und die jeweilige Belegnummer nicht automatisch bei neuem Datensatz generieren, sondern auch erst auf "Knopfdruck", wobei auch der vergebene Dokumenttyp berücksichtig wird.

    Da gibt es aber keine Standard-Lösung. Die Vorgehensweise hängt wie so oft von den jeweiligen Abläufen und Anforderungen ab.

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

    Zu deiner vorherugen Frage: Mit substr() kann man Teile aus Zeichenfolgen extrahieren. Die Syntax lautet

     

    substr(TEXT, POS, LÄNGE)

     

    TEXT steht für den String, das Feld oder die Variable, welche den Text enthält.
    POS steht für die Startposition, aber der die Zeichen ausgelesen werden sollen. Zu beachten ist hier, dass die Zählung bei 0 beginnt!
    LÄNGE steht für die Anzahl der Zeichen, die ab der Startposition ausgelsen werden sollen. Ist LÄNGE nicht angegeben, wird automatisch alles bis zum Ende der Zeichenfolge ausgelesen.

     

    substr("2020/0010", 5, 4)

     

    würde als Ergebnis also "0010" ergeben. Da Rechnungs- und andere fortlaufende "Nummern" aber bei jedem anders aufgebaut sind, muss man die Parameter in den kursierenden Skripten individuell anpassen, je nachdem, an welcher Stelle die laufende Nummer beginnt und wieviele Stellen sie hat.

    • Kruna
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ah ok, vielen Dank für die Erklärung, klingt nun plausibel.

    Ich habe da noch eine Frage bzgl. Auftrag/Rechnung, aber da werde ich besser einen neuen Thread erstellen.

    Gruß

    Kruna