0

Meine fortlaufende Nummer will einfach nicht..

Hallo zusammen,

ich komme einfach nicht weiter mit meiner fortlaufenden Rechnungsnummer.

Zum Verständnis: Ich habe in einer Tabelle meine Angebote und Rechnungen. Meine Angebotsnummern generieren sich automatisch beim Erstellen eines Datensatzes, das klappt auch. Da ja nich aus jedem Angebot eine Rechnugn wird, sollen sich die Rechnungsnummern erst auf Knopfdruck generieren. Hierfür habe ich einen Trigger konfiguriert. Dieses habe ich auch schon mehrfach mit Hilfe dieses tollen Forums angepasst, er will aber einfach nicht forlaufend sein. Es wird zwar eine Nummer generiert, diese lautet aber immer RN180001

 

Hier der Code:

let myYear := year(Datum);

Rechnungsnummer := ("RN" + format(Datum, "YY") + format(cnt((select Angebote)[substr(Rechnungsnummer, 0, 4) = myYear]) + 1, "0000"))

 

Vielleicht hat ja jemand noch eine Idee wo der Fehler liegen könnte?

21 Antworten

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

    Auf die Schnelle: M. E. müsstet du die Vergleichsvariable in dasselbe, zweistellige Format bringen wie beim Zusammenstellen der Rechnungsnummer »format(Datum, "YY")« und die substr()-Parameter von "0, 4" auf "2, 2" ändern.

     

    Getestet habe ich es allerdings nicht.

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Paul,

    villeicht so:

    ---

    let myYear := year(Datum);

    Rechnungsnummer := ("RN" + format(Datum, "YY") + format(cnt((select Angebote)[number(substr(Rechnungsnummer, 0, 4)) = myYear]) + 1, "0000"))

    ---

    Zur Erklärung: substr...... liefert einen String zurück, year(Datum) ist eine Zahl.

     

    Leo

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

    Vergleichsvariable = myYear

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Stimmt, dann :

    let myYear := format(Datum, "YY");

    Rechnungsnummer := ("RN" + myYear + format(cnt((select Angebote)[(substr(Rechnungsnummer, 2, 2)) = myYear]) + 1, "0000"))

     

    Leo

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

    Mein (ungeprüfter) Vorschlag wäre:

     

    let myYear := format(Datum, "YY";

    Rechnungsnummer := ("RN" + format(Datum, "YY") + format(cnt((select Angebote)[substr(Rechnungsnummer, 2, 2) = myYear]) + 1, "0000"))

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

    :) 

     

    Kopiere Leos Version, ich habe beim ersten format() eine Klammer vergessen. 

    • Paul_J_Herberhold
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Danke Copytexter, 

    mit deinen ANsätzen hat es tatsächlich geklappt. Der Hammer!

     

    Für Leute mit dem Problem hier nochmal die nun funktionierende Formel:

    let myYear := format(Datum, "YY");
    Rechnungsnummer := "RN" + format(Datum, "YY") + format(cnt((select Angebote)[substr(Rechnungsnummer, 2, 2) = myYear]) + 1, "0000")

    • Paul_J_Herberhold
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Die von Leo wollte bei mir irgendwie nicht laufen ;) Fragt mich nicht wieso...

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Eigentlich sind die Formel identisch. Ist aber egal, hauptsache es läuft.

    • Paul_J_Herberhold
    • vor 6 Jahren
    • Gemeldet - anzeigen

    deswegen verstehe ich es auch nicht :D aber ich hinterfrage es mal nicht.

    Vielen Dank für die Hilfe :)

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

    Stimmt, die Formeln sind fast identisch, der einzige Unterschied ist, dass Leo statt noch mal format() gleich die Variable myYear eingesetzt hat, was ja eigentlich sogar "noch richtiger" ist. Wahrscheinlich lag's nur an irgendeiner Kleinigkeit.

     

    Aber mal ganz was anderes: Rechnungsnummern müssen zwar nicht im mathematischen Sinne fortlaufend sein, also 1, 2, 3 usw., aber doch im Sinne von lückenlos innerhalb der gewählten Systematik. Ist das noch gegeben, wenn die Rechnungsnummern nun so wie oben aus der Angebotstabelle generiert werden? Könnten dabei nicht Nummernfolgen wie RN180012, RN180015, RN18017 u. ä. herauskommen? Und was ist, wenn Angebote gelöscht werden? Dann hätte man eventuell noch mal RN18017, oder?

     

    Vielleicht hast du das schon genau durchdacht, aber ein Hinweis auf die Problematik kann ja nicht schaden. Sowas im Nachhinein zu ändern ist in der Regel deutlich schwieriger.

    • Paul_J_Herberhold
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Copytexter,

    tatsächlich war genau das mein Problem. Mit dieser Formel stimmen die fortlaufenden Nummern aber bisher. Vorher hatte ich das Problem mit nicht korrekt fortlaufenden Nummern. Ninox nimmt wohl generell gerne die Zeilen zur Berechnung der Nummern. Und weil (leider) nicht jedes Angebot zur Rechnung wird gab es da Probleme. Mit der Formell klappt es nach meinem kurzen Test sehr gut. Hoffe es bleibt auch bei genauerer Betrachtung so.

     

    Wenn Angebote gelöscht werden ist das kein Problem, da diese eine eigene Nummr haben. Solang diese nicht doppelt belegt ist, ist mir dort auch egal ob mal eine Zahl fehlt. Die Rechnungen dürfen nach den Erzeugen der Rechnungsnummer nicht mehr gelöscht werden. Notfalls storniert man diese also, im System bleiben sie aber erhalten. Rechnung die storniert wurden haben automatisch immer einen Gesamtbetrag von 0 Euro.

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

    Okay, ich will dir deine Lösung auch nicht ausreden, aber mit der jetzt genutzten Formel zählst du ja nur die vorhandenen Angebots-Datensätze desselben Jahres und erhöhst das Ergebnis um 1. Wenn du also 10 Angebote aus 2018 hast, ist die Rechnungsnummer 0011. Soweit, so gut. Löschst du nun aber irgendeines der Angebote (Summe: 9), ist die nächste Rechnungsnummer 0010. Und wenn dann du drei weitere Angebote erstellst (Summe: 12), wird die nächste Rechnungsnummer 0013 sein. Und die darauf folgende auch, sofern sich an der Zahl der Angebote zwischenzeitlich nichts ändert.

     

    Oder sehe ich das falsch?

    • Leonid_Semik
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Sehe ich auch so. Es wäre vielleicht besser einfach die Maximale Nummer der Rechnung zu suchen und mit +1 weiter arbeiten

    • Paul_J_Herberhold
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Hallo Copytexter, 

    ich habe das jetzt mal getestet und ich kenne das Problem was du beschriebst ja auch, deswegen bin ich ja überhaupt nur auf die Suche nach einer neuen Möglichkeit gegangen.

     

    Hab jetzt eben mal getestet und vorhandene Angebote wieder gelöscht, die Nummer bleibt korrekt. Der Grund dafür ist sicherlich, dass ich sie nur für die Rechnungen und nur auf Knopfdruck generiere. Rechnungen werden nicht mehr gelöscht, daher ist die Zahl korrekt

    • Paul_J_Herberhold
    • vor 6 Jahren
    • Gemeldet - anzeigen

    ABer ich bin natürlich trotzdem gespannt, wie würde ich nach dert maximalen Nummer suchen?

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

    Na ja, du müsstest halt direkt auf die Rechnungstabelle zugreifen, dort die höchste vergebene Nummer auslesen und diese um 1 erhöhen. Der Code dafür könnte z. B. so aussehen (mit aktuellem Tagesdatum):

     

    let myYear := format(today(), "YY");
    let LastNum := max((select Rechnungen where substr(Rechnungsnummer, 2, 2) = myYear).number(substr(Rechnungsnummer, 4, 4)));
    Rechnungsnummer := "RN" + myYear + format(LastNum + 1, "0000")

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

    Ach so, ich kenne halt das ganze Drumherum nicht, aber falls du Angebote und Rechnungen in einer gemeinsamen Tabelle (namens "Angebote"?) speicherst und nur nach dem Präfix (z. B. "AN"/"RN") unterscheidest, dann müsste man diesen natürlich in den Filter einbeziehen, damit man tatsächlich auch nur alle Rechnungen aus dem betreffenden Jahr heranzieht:

    let myYear := format(Datum, "YY");
    let LastNum := max((select Angebote where substr(Rechnungsnummer, 0, 2) = "RN" and substr(Rechnungsnummer, 2, 2) = myYear).number(substr(Rechnungsnummer, 4, 4)));
    Rechnungsnummer := "RN" + myYear + format(LastNum + 1, "0000")

    Dasselbe könnte man übrigens auch mit den Angeboten machen, falls den gleichen Aufbau haben. Man müsste halt nur den Rechnungs-Präfix "RN" durch den der Angebote (z. B. "AN") ersetzen.

    • Paul_J_Herberhold
    • vor 6 Jahren
    • Gemeldet - anzeigen

    Habe deinen Code eben mal probiert und er funktioniert auch :) vielen Dank dafür

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

    Keine Ursache, freut mich, wenn's funktioniert. Ist sicher die bessere Lösung. Die andere hätte über kurz oder lang zu Problemen geführt, da bin ich mir ziemlich sicher.

    • bernd
    • vor 6 Jahren
    • Gemeldet - anzeigen

    ich habe mal meine Variante im Webinar gestellt, 209_laufende-Nummer

Content aside

  • vor 6 JahrenZuletzt aktiv
  • 21Antworten
  • 5102Ansichten