0

Rechnungsnummer

Hallo zusammen,

ich habe die Vorlage Rechnung installiert. Wenn ich eine neue Rechnung anlege, wird die Rechnungsnummer wie folgt generiert: 2018-001 (Jahr-Fortlaufende Nummer)

Hierzu ist folgende Formel hinterlegt:

let y := year(Datum);
let c := cnt(select Rechnung where year(Datum) = y);
Rechnungsnummer := y + "-" + format(c, "000“)


Wie bekomme ich es hin, dass das Jahr nur mit den letzten beiden Ziffern (also 18 statt 2018) und der Monat mit angehängt wird? Also dass die Rechnungsnummern im Endeffekt wie folgt geführt werden: 18-01-001, 18-01-002, 18-01-003

36 Antworten

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

    Ach so, die internen Datensatz-Nummern bleiben übrigens auch immer unverändert. Und sie werden beim Löschen eines Datensatzes auch nicht neu vergeben, so dass theoretisch Lücken entstehen können. Außerdem wollen die meisten eine zeitraumbezogene Nummerierung, also eine, die mit dem Jahres- oder Monatswechsel wieder bei 1 beginnt. Datensatznummern dienen aber ausschließlich der internen Nummerierung und laufen einfach durch. Deshalb eignen sie sich in der Regel nicht zur Erzeugung inhaltsbezogener Identifikationsnummern für Kunden, Projekte, Rechnungen oder was auch immer.

    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ich bin bei Copytexter, die Rechnungsnummer sollte in ein Textfeld, dies kann per Trigger auf Tabellenebene (je nach Bedarf “bei neuem Datensatz” oder “bei Änderungen”) automatisiert gefüllt werden und sollte dann nicht mehr änderbar sein (Schreibbar wenn: Feldname).

    Das Duplizieren von Rechnungen kann man übrigens sehr gut auch via Befehlsschaltfläche erledigen und dort dann die doppelte Re-Nummer mittels Skript abfangen.

     

    Falls von Interesse: Ich habe in einer Tabelle Stammdaten (mit nur einem Datensatz) Nummernkreise für jede Belegart hinterlegt - so gestatte ich bestimmten Usern Einflussnahme auf das Aussehen der Belegnummern, ohne im Code eingreifen zu müssen. Über eine globale Funktion

     

    function DokNummer(Art : number) do
    let mySetup := first(select Stammdaten);
    let myDokNummer := switch Art do
    case 1:
    (
    let myPrae := mySetup.“Präfix Angebot”;
    let myNumber := myPrae + format(mySetup.“nächste Angebot-Nr.”, “00000”);
    let myNew := mySetup.“nächste Angebot-Nr.” + 1;
    mySetup.(“nächste Angebot-Nr.” := myNew);
    myNumber
    )
    case 2:
    (
    let myPrae := mySetup.“Präfix Auftragsbestätigung”;
    let myNumber := myPrae + format(mySetup.“nächste Auftragsbestätigung-Nr.”, “00000”);
    let myNew := mySetup.“nächste Auftragsbestätigung-Nr.” + 1;
    mySetup.(“nächste Auftragsbestätigung-Nr.” := myNew);
    myNumber
    )
    case 3:
    (
    let myPrae := mySetup.“Präfix Lieferschein”;
    let myNumber := myPrae + format(mySetup.“nächste Lieferschein-Nr.”, “00000”);
    let myNew := mySetup.“nächste Lieferschein-Nr.” + 1;
    mySetup.(“nächste Lieferschein-Nr.” := myNew);
    myNumber
    )
    case 4:
    (
    let myPrae := mySetup.“Präfix Rechnung”;
    let myNumber := myPrae + format(mySetup.“nächste Rechnung-Nr.”, “00000”);
    let myNew := mySetup.“nächste Rechnung-Nr.” + 1;
    mySetup.(“nächste Rechnung-Nr.” := myNew);
    myNumber
    )
    case 5:
    (
    let myPrae := mySetup.“Präfix Gutschrift”;
    let myNumber := myPrae + format(mySetup.“nächste Gutschrift-Nr.”, “00000”);
    let myNew := mySetup.“nächste Gutschrift-Nr.” + 1;
    mySetup.(“nächste Gutschrift-Nr.” := myNew);
    myNumber
    )
    end;
    myDokNummer
    end;

     

    übergebe ich mit

     

    “Beleg-Nummer” := DokNummer(number(Belegart))

    Die nächstpassende Belegnummer. “Belegart” ist im Übrigen ein Auswahlfeld. So erreiche ich, dass sämtliche Verkaufsbelege (Angebot, Auftragsbestätigung, Lieferschein, Rechnung, Gutschrift) in einer Tabelle unterkommen...

     

    lg, Torsten

    • Andreas_Schmitz
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Copytexter, das Problem entsteht in der Praxis. Wenn man eine Rech.-Nummer in einem Textfeld speichert, dann sollte diese für den Benutzer nicht veränderbar sein, wie Torsten das auch anführt, d.h. das Textfeld sollte schreibgeschützt sein. Wenn man aber dem Benutzer erlaubt, eine Rechnung neu zu erstellen, dann ist bei Ninox automatisch auch die Möglichkeit gegeben, die Rechnung zu kopieren. Dabei würde aber das Textfeld der Rechnungsnummer auch kopiert werden und schon hat man zweimal die gleiche Rech.-Nummer und könnte sie nicht mehr ändern, weil das Feld schreibgeschützt ist! Finanzrechtlich gesehen, sind doppelte Rech.-Nummern verboten, während eine fortlaufende Nummer nicht verlangt wird Die Rech.-Nr. muss nur eindeutig sein! Ich gebe Torsten Recht, dass man das Duplizieren einer Rechnung auch über eine Schaltfläche erledigen kann, aber man kann nicht vermeiden, dass ein Benutzer doch in der Kopfzeile die Schaltfläche von Ninox zum Kopieren benutzt, weil man Sie nicht separat ausschalten kann, ohne auch die Funktion Neu erstellen abzustellen.  Es macht übrigens keinen Unterschied, ob ich über ein Funktionsfeld eine Rech.-Nr. berechnen lasse oder bei Änderung die Rech.-Nummer neu berechne. Ich wäre froh, ich würde eine bessere Lösung finden. Ich programmiere kein Lösung, wo nur Eingeweihte mit arbeiten, sondern viele Benutzer, die leider immer den Knopf finden, der alles zerstört. lg Andreas

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

    Hallo Andreas, Ninox ist nun mal keine Programmiersprache, sondern eine Low-Code-Datenbank. Bietet über Rechte und Rollen aber durchaus Möglichkeiten der Individualisierung. Und mit der Funktion openFullscreen() lässt sich die Standard-Symbolleiste mit “Löschen”, “Duplizieren” usw. sogar komplett ausblenden. Dann muss man die benötigten Navigationselemente eben selbst bauen.

     

    Ich selbst mache es bei mir übrigens so, dass ich die Belegnummer für ein Dokument nicht automatisch per Trigger, sondern manuell über eine Schaltfläche erzeugen und dann in einem Funktionsfeld anzeigen lasse, damit ich sie nicht versehentlich ändern kann (das Datenfeld ist versteckt). Das hat für mich auch den praktischen Vorteil, dass ich schon mal Basisdaten erfassen kann, um diese später irgendwann zu vervollständigen und das Dokument durch Vergabe einer tagesaktuellen Belegnummer quasi offiziell zu machen. Auch gedruckt wird per Schaltfläche, die aber wiederum erst erscheint, wenn eine Belegnummer vergeben wurde. Und so weiter. Die Standard-Menüleiste in den Datenformularen nutze ich im Alltag praktisch gar nicht.

     

    Will sagen: Es gibt durchaus Möglichkeiten, die Benutzerführung gezielt zu steuern und in bestimmte Bahnen zu lenken. Und man darf sich natürlich noch mehr solcher Möglichkeiten wünschen. Aber - wie gesagt: Ninox ist von Hause aus keine Programmiersprache, sondern ein Softwarebaukasten mit einfach bedienbaren Steuerelementen für Nichtprogrammierer. Das hat viele Vor-, aber natürlich auch Nachteile. Wenn man als Entwickler hundertprozentige Kontrolle über sämtliche Navigations- und Steuerelemente haben will, muss man mit klassischen Entwicklungswerkzeugen arbeiten und auch die Benutzeroberfläche komplett selbst programmieren.

    • Michi.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ganz ehrlich, auf die Idee zu kommen eine Rechnung zu duplizieren ist noch keiner gekommen bei uns. Und wenn das mal der Fall sein sollte kommen sie an und sagen das da ein Missgeschick passiert ist. Die User haben bei uns kein Recht zu löschen. Das macht zwar hier und da mehr Arbeit, aber verhindert auch schlimmeres. Ganz davon abgesehen könnte man ja auch noch nach doppelten RG Nummern suchen lassen und dies über Dialog kunt tun. 

    • Icarus_Ralf_Becker
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Andreas,

    zumindest in der Cloud-Variante kann man die Symbole durch HTML-Code beliebig ausblenden, und damit den Duplicate-Button verschwinden lassen.

    in den globale Funktionen folgendes definieren:

    function UIHide(options : text) do
            var html := “”;
            for items in split(options, “,”) do
                    html := html + switch items do
                            case “print”:
                                    “<style>div.hud-menu-button.i-32-24.i-light-grey.i-setting-print{display: none;}</style>”
                            case “trash”:
                                    “<style>div.hud-menu-button.i-32-24.i-light-grey.i-setting-trash{display: none;}</style>”
                            case “copy”:
                                    “<style>div.hud-menu-button.i-32-24.i-light-grey.i-setting-copy{display: none;}</style>”
                            case “add”:
                                    “<style>div.hud-menu-button.i-32-24.i-light-grey.i-setting-add{display: none;}</style>”
                            end
            end;
            html
    end;

    Dann ein f(x) Feld im Datensatz angelegen (sichtbar wenn: userHasRole(“admin”)) und folgenden Code rein.

    html(UIHide(“print,copy,trash,add”))

     

    VG - Ralf

    • Andreas_Schmitz
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo Leonid!

    Diese Lösung:

    let y := year(Datum);
    let c := cnt(select Rechnung where year(Datum) = y);
    Rechnungsnummer := format(Datum, "YY-MM-") + format(c, "000")

    setzt aber voraus, dass niemals ein Datensatz gelöscht wird, denn cnt zählt nur die vorhandenen Datensätze!

    LG Andreas

    • Andreas_Schmitz
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo Ralf,

    vielen, vielen Dank für Deine Lösung! Das war genau das, wonach ich gesucht habe! Ich hatte zwischenzeitlich aufgegeben, NInox weiter zu verwenden, deswegen habe ich mich nicht früher bedankt!

    Vielleicht noch eine Bemerkung für alle, die Deine Lösung verwenden. Das f(x)-Feld muss unter jedem Reiter eingefügt werden!

    LG Andreas

    • UweG
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo Andreas
    Die Datenbank Nr. 340_CSS-Plugin  im Team Webinar DE 2021 erleichtert das Ein- und Ausblenden der Ninox-Symbole in allen deinen Tabellen.

    • Andreas_Schmitz
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo UweG, wo finde ich die Datenbank Nr. 340_CSS-Plugin bzw. das Team Webinar DE 2021?

    LG Andreas

    • UweG
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo Andreas.
    Wenn du ein ABO für die Ninox-Cloud hast, schreibe eine Mail an Ninox-Support mit deiner Ninox-Mailadresse und lass dich in das Team 'Webinar DE 202'1 einladen.
    Dort findest du die beschriebene Datenbank und auch viele weitere von engagierten Ninox-Usern erstellte Dagtenbanken zu verschiedensten Problemen oder zur Nutzung von Ninox-Script.