0

Automatische Rechnungs- respektive Kundennummer

Hallo. Ich habe mir die Threats im Forum angesehen, in jedoch als Laie hoffnungslos überfordert. Ich habe mir meine Datenbank mit dem Warenwirtschaftmodell aufgebaut, wahrscheinlich jedoch etwas wesentliches verändert und das Erstellen einer automatischen Nummer funktioniert nicht mehr. Leider finde ich im Modell die Formel nicht, die ich brauche um meine Nummer zu erstellen. Meine Rechnungsnummer soll folgerndermassen aussehen. HN1-2020xxxx wobei HN1 der Firmenname ist 2020 das laufende Jahr, das jedes Jahr ändern soll und xxxx die eigentliche Nummer die über die Jahre fortlaufend sei soll. Kann mir bitte jemand erklären wie und wo ich dies zusammenbasteln kann. Vielen lieben Dank. Luc

11 Antworten

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

    Hallo Luc, wenn "HN1-" als fester Wert immer am Anfang steht, dann könnte der Code zum Generieren einer Rechnungsnummer nach obigem Schema so aussehen (z. B. als Trigger "Bei neuem Datensatz"):

    let myJ := format(today(), "YYYY");
    let lastNr := last((select RECHNUNGEN where substr(RECHNR, 4, 4) = myJ).substr(RECHNR, 8));
    RECHNR := "HN1-" + myJ + format(number(lastNr) + 1, "0000")

    RECHNUNGEN und RECHNR müssten ggf. durch die tatsächlichen Namen der Tabelle und des Feldes für die Rechnungsnummer ersetzt werden.

    • lucazzeri69
    • vor 4 Jahren
    • Gemeldet - anzeigen

     Hallo sorry, dass es etwas gedauert hat. Bei mr sieht der Schirm folgendermassen aus.

    Wo genau, an welcher Stelle müsste ich die Formel einsetzen? Tabelle = Kundenbestellungen?? Feld = Numéro facture??

    Danke für die Hilfe

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

    Wenn die Nummer automatisch beim Erstellen eines neuen Datensatzes generiert werden soll, dann muss der Code wie gesagt als Trigger auf Tabellen-Ebene "Bei neuem Datensatz" ausgeführt werden. 

    Also oben links über der Tabelle auf das Zahnrad klicken und im Menü auf "Felder bearbeiten ...". Daraufhin erscheint ein schwebendes Dialogfenster mit den vorhandenen Datenfeldern. Links davon unter dem Namen der Tabelle befinden sich einige Optionen, u. a. "Bei neuem Datensatz folgendes Script ausführen:". Da reinklicken, den Code eintippen oder hineinkopieren und ggf. die Bezeichnungen RECHNUNGEN und RECHNR anpassen.

    Wie deine Tabellen und Felder heißen, solltest du selbst am besten wissen, aber wenn ich den Screenshot richtig interpretiere, dann könnte es so funktionieren:

    let myJ := format(today(), "YYYY");
    let lastNr := last((select '1_Kundenbestellungen' where substr('Numéro Facture', 4, 4) = myJ).substr('Numéro Facture', 8));
    'Numéro Facture' := "HN1-" + myJ + format(number(lastNr) + 1, "0000")

    • lucazzeri69
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo, vielen lieben Dank. Es funktioniert! Allerdings vergass ich zu erwähnen, dass ich ab einer bestimmten Nummer beginnen möchte. Sagen wir HN120200201. Wo müsste ich dies bestimmen?

    Ausserdem würde ich den Code gerne verstehen. 

    let myJ := format(today(), "YYYY");  bestimmt das Jahr?? Passt sich das Jahr automatisch an 2021   2022...

    let lastNr := last((select '1_Kundenbestellungen' where substr('Numéro Facture', 4, 4) = myJ).substr('Numéro Facture', 8));  bestimmt dir fortlaufende Nummer?? Wofür stehen die fettgedruckten Ziffern?

    'Numéro Facture' := "HN1-" + myJ + format(number(lastNr) + 1, "0000").  bestimmt die Zusammensetzung der Nummer?? Hier habe ich versucht, die 0000 durch 0201 zu ersetzen. Dies klappte dann jedoch nicht.

    Eine automatische Kundennummer wird dann auch so generiert?

    • lucazzeri69
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Eine Sache fällt mir trotzdem auf. Bei einem Testlauf habe ich bemerkt, dass die Rechnungsnummer für jede Position auf der Rechnung den Wert 1  dazu zählt. Das heisst, Rechnung A mit 4 Artikeln Nummer 0001, Rechnung B 6 Artikel Nummer 0005, Rechnung C 10 Artikel Nummer 0012

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

    Hallo Luc, für die laufende Nummerierung der Rechnungen wird die höchste Nummer innerhalb des betreffenden Jahres gesucht und um 1 erhöht. Würde kein passender Datensatz gefunden, wäre die erste Nummer "0001". Um als erste Nummer bspw. die "HN1-20200201" zu bekommen, kann man sie für diesen ersten Datensatz einfach manuell eintragen. Alle weiteren Nummern werden dann automatisch korrekt berechnet, auch bei Jahreswechseln (Neustart dann bei "HN1-20210001").

    Zu den einzelnen Code-Zeilen:

    In der ersten Zeile wird aus dem aktuellen Tagesdatum (today()) das Jahr gelesen und mit dem format() als vierstelliger String formatiert, z. B. "2020".

    Mit der Funktion substr() kann man aus einem Text einen Teilstring extrahieren, die Syntax lautet "substr(TEXT, STARTPOSITION, LÄNGE)". Die Rechnungsnummer hat den festen Aufbau "HN1-JJJJLLLL", wobei das "J" für "Jahr" steht, das "L" für "Laufende Nummer". Da die Zählung der Zeichen bei 0 beginnt, startet die Jahreszahl immer bei Position 4 und ist 4 Zeichen lang. Deshalb "(... 4, 4)". Mit diesem Wert, z. B. "2020", wird das Jahr gefiltert. Lässt man beim substr() die Länge der zu extrahierenden Zeichenfolge weg, dann werden ab der STARTPORITION alle Zeichen bis zum Ende genommen. In Verbindung mit dem last() bringt das zweite substr() demnach die Laufende Nummer als Ergebnis, in obigem Beispiel also "0201".

    In der letzten Zeile wird die neue Nummer zusammengesetzt. Die feste Zeichefolge "HN1-" plus dem aktuellen Jahr als Ergebnis der ersten Code Zeile ("2020") plus der laufenden Nummer, die mit dem "0000" bei format() als zwingend vierstellig definiert wird. Da die Variable 'lastNr' einen String beinhaltet, wird der Wert vorher mit number() in eine Zahl umgewandelt und um 1 erhöht, bevor er mit dem format() wieder in einen String zurück konvertiert wird.

    Macht im Ergebnis bspw. "HN1-20200201", als nächstes "HN1-20200202" usw.

    Eine kurze Erläuterung aller Ninox-Funktionen findet sich auch in der Online-Dokumentation:
    https://ninox.com/de/manual/erweiterte-Berechnungen/funktions-und-sprachreferenz

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

    Zu deinem letzten Kommentar: Der oben genannte Code ist dazu gedacht, als Trigger "Bei neuem Datensatz ..." in der Tabelle '1_Kundenbestellungen' ausgeführt zu werden. Dann berücksichtigt er auch nur deren Datensätze und keine Einträge der Untertabelle 'Rechnungspositionen'. Niemand ist unfehlbar, ich schon gar nicht, aber hier vermute ich, dass 
    der Code irgendwo anders ausgeführt wird und/oder verändert wurde. Der von dir beschriebene Effekt mit "0001", "0005" usw. ist für mich so nicht nachvollziehbar.

    • lucazzeri69
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Vielen Dank für deine Zeit und die Erklärungen. Ich werde mich bestimmt noch mal melden (grrr) Zu meinem letzten Kommentar. Sorry mein Fehler, ich habe den Code falsch eingesetzt, fnktioniert jetzt. Vielen Dank

    • lucazzeri69
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo. Wie vorhergesagt melde ich mich ein Weiteres Mal. 

    Ich möchte eine automatische Kundennummer erzeugen und habe die Formel für Rechungsnummer dementsprechend umgeschrieben, allerdings klappt es nicht 100%ig. Ich möchte die Nummer 2020xxxx erzeugen und zwar von meiner letzten Nummer an. Diese Formel schreibt mir 20200001 und zwar jeds Mal wenn ich einen neuen Kunden in die Tabelle einschreibe. das +1 funktioniert nicht. Gebe ich manuell eine Nummer vor schreibt das Programm trotzdem 20200001. Was mache ich falsch?

    let myJ := format(today(), "YYYY");
    let lastNr := last((select '2_Kunden' where substr('Numéro Client', 4, 4) = myJ).substr('Numéro Client', 8));
    'Numéro Client' := myJ + format(number(lastNr) + 1, "0000")

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

    Hallo, die Nummer hat den festen Aufbau 2020xxxx, das Jahr beginnt also bei Position 0 und ist 4 Zeichen lang. Die laufende Nummer beginnt direkt danach bei Position 4 und ist ebenfalls 4 Zeichen lang. Bei den Werten, die du beim substr() angegeben hast, findet Ninox keinen passenden Datensatz, 'lastNr' bleibt deshalb immer leer, was im Ergebnis jedes Mal zu "20200001" führt. Du musst also die Werte der substr()-Parameter entsprechend anpassen:

    let myJ := format(today(), "YYYY");
    let lastNr := last((select '2_Kunden' where substr('Numéro Client', 0, 4) = myJ).substr('Numéro Client', 4));
    'Numéro Client' := myJ + format(number(lastNr) + 1, "0000")

    • lucazzeri69
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Vielen lieben Dank für die schnelle Rückmeldung. Es funktioniert jetzt.