Sage kennt zwei verschiedene Darstellungsarten der Belegnummer: zusammengesetzt und aufgespalten. Je nach Fall wird Dir für eine Rechnung mit der Nummer „123456“ aus dem Jahr „2026“ mal Jahr und Nummer getrennt angezeigt und mal zusammengesetzt als „2026-123456“.
Diese unterschiedlichen Darstellungsarten findest Du nicht nur in der Oberfläche, sondern, je nach Tabelle, auch direkt in der Datenbank. Deswegen gehört es einfach dazu, je nach Fragestellung die Belegnummer in zusammengesetzter oder aufgespaltener Form ausgeben zu können. Und dafür reichen ein paar einfache SQL-Befehle.
Zusammensetzen von Belegnummern
Hier gibt es zwei Varianten: den Verkettungsoperator + oder die SQL-Funktion CONCAT(). In der Praxis funktionieren beide, Unterschiede gibt es in ihrem Verhalten, wenn Werte mal NULL sind.
Wird der Verkettungsoperator + verwendet, müssen die beiden Bestandteile mit CONVERT() oder CAST() in reinen Text (also den VARCHAR-Datentyp) umgewandelt werden. Sonst würde SQL Server die beiden Zahlen (im INT-Datentyp) addieren, was natürlich nicht gewollt ist. Mit CONVERT() zur Typumwandlung sieht das so aus:
CONVERT(VARCHAR(4), MeinJahr) + '-' + CONVERT(VARCHAR(6), MeineNummer)
-- Ergebnis: 2026-123456Und schon wird die zusammengesetzte Belegnummer in einer Zelle ausgegeben. Die Zahlen in Klammern hinter VARCHAR geben übrigens die Länge des Textes an, der erhalten werden soll. Also 4 Zeichen für das Jahr und 6 Zeichen für die Nummer.
Variante 2 nutzt die CONCAT()-Funktion und kommt mit weniger Schreibaufwand aus:
CONCAT(MeinJahr, '-', MeineNummer)
-- Ergebnis: 2026-123456Hier ist keine aufwändige Typumwandlung nötig, weil die CONCAT()-Funktion das direkt mit übernimmt. Meistens reicht für das Zusammensetzen von Belegnummern diese kürzere Variante aus.
Unterschiede weisen die beiden Varianten in der Behandlung von NULL-Werten auf. Ist eine Nummer oder ein Jahr mal NULL, so ist mit dem Verkettungsoperator + auch das gesamte Ergebnis NULL. Dagegen liefert die CONCAT()-Funktion den Teil zurück, der nicht NULL ist:
CONCAT(NULL, '-', MeineNummer)
-- Ergebnis: -123456Welche Ausgabe gewünscht ist, hängt von den Anforderungen ab. Manchmal ist es hilfreich, dass das Ergebnis einfach NULL ist, wenn ein Teil der zusammengesetzten Belegnummer fehlt.
Aufspalten von Belegnummern
Findet man die zusammengesetzte Belegnummer in einer Tabellenspalte vor und möchte das Belegjahr einzeln ausgeben, bietet sich die LEFT()-Funktion an:
LEFT(ZusammengesetzteNummer, 4)
-- Ergebnis: 2026Die LEFT()-Funktion gibt vom Anfang des Ausdruckes Zeichen zurück, wobei hier mit der 4 die Anzahl der zurückgegebenen Zeichen festgelegt wird. Analog kann mit der RIGHT()-Funktion vom Ende eines Ausdruckes aus eine definierte Anzahl von Zeichen erhalten werden, was sich für das Herauslösen der Nummer aus der zusammengesetzten Belegnummer anbietet:
RIGHT(ZusammengesetzteNummer, 6)
-- Ergebnis: 123456In den meisten Fällen lässt sich so bereits die Belegnummer aufspalten. Ab und zu benötigt man jedoch die SUBSTRING()-Funktion, wenn man etwas aus der Mitte eines zusammengesetzten Ausdruckes entnehmen möchte. Das kann zum Beispiel bei offenen Posten (OPs) der Fall sein, wenn eine OP-Nummer aus Belegnummer und einer angefügten Zahl besteht (z. B. Teilung in 2026-123456.1 und 2026-123456.2):
SUBSTRING('2026-123456.1', 6, 6)
-- Ergebnis: 123456Der SUBSTRING()-Funktion wird erst der Ausdruck angegeben, dem ein Teil entnommen werden soll, dann die Startposition der Entnahme und dann die Anzahl der zu entnehmenden Zeichen. Hier sollen ab einschließlich der 6. Position 6 Zeichen entnommen werden. Die SUBSTRING()-Funktion ist also vielseitiger, aber auch ein wenig komplexer als die LEFT()- und RIGHT()-Funktionen.
Fazit
Das Zusammensetzen und Aufspalten von Belegnummern lässt sich mit wenigen SQL-Ausdrücken erreichen. Mit CONCAT() ist das Zusammensetzen von Belegnummern schnell gemacht, und wenn die aufzuspaltende Belegnummer einen festen Aufbau hat, lässt sich mit LEFT() oder RIGHT() der gewünschte Teil direkt entnehmen. Und sollte man mal einen etwas komplizierteren Aufbau haben, hilft die vielseitige SUBSTRING()-Funktion.