Nummer vergeben
Dieses Skript zeigt, wie bei der Dokument-Ausgabe automatisch eine lückenlose Nummer aus einem Nummernkreis vergeben wird.
Vorteile gegenüber cobra-Zählerfeldern
- Lückenlose Nummerierung über verschiedene Beleg-/Dokumentarten hinweg
- Steuerbar über Präfix, Suffix und Formatierung
- Nummer wird nur vergeben, wenn noch keine vorhanden ist
Tabelle
Für dieses Beispiel wird die freie Tabelle "Nummernkreise" mit folgenden Feldern genutzt:
| Feld | Typ | Beispielwert |
|---|---|---|
| Nummernkreis | Text | Rechnung |
| Präfix | Text | RE- |
| Nächste Nummer | Ganzzahl | 1042 |
| Format | Text | 00000 |
| Suffix | Text | (leer) |
Konfiguration in PRINT+PLUS
- Event:
AfterLoadData - Ausgangstabelle: z.B. "Rechnungen" (mit einem Feld "Rechnungsnr")
Beispielskript
// Version 6
namespace Ruthardt.PrintPlus.Skripting
{
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using Ruthardt.CobraBase.Functions.Access.Ado;
using Ruthardt.CobraFramework.Ado;
using Ruthardt.Common.Util;
using Ruthardt.PrintPlus.Export.Context;
using Ruthardt.PrintPlus.Model;
using Ruthardt.PrintPlus.Model.Interfaces;
using Ruthardt.PrintPlus.Model.Enumerations;
public class NummerVergeben : IScriptAction
{
public void Execute(IPrintContext printContext, ICurrentContext currentContext, IChildContext childContext)
{
var datensatz = currentContext.Data;
// Prüfen ob bereits eine Nummer vorhanden ist
var rechnungsnr = datensatz.GetStringValue("Rechnungsnr");
if (!string.IsNullOrEmpty(rechnungsnr))
{
// Nummer bereits vorhanden - nichts tun
return;
}
// Neue Nummer generieren und zuweisen
var neueNummer = GeneriereNummer("Rechnung");
datensatz.SetValue("Rechnungsnr", neueNummer);
// Änderung in die Datenbank zurückschreiben
currentContext.SaveChanges = true;
// Logging für Nachvollziehbarkeit
printContext.Logger.Info($"Rechnungsnr '{neueNummer}' vergeben für Datensatz {datensatz.CurrentKey}.");
}
private string GeneriereNummer(string nummernkreis)
{
// Nummernkreis aus der Datenbank laden
var sql = AdoInstance.Current.ParseSQL(
"SELECT * FROM [#Nummernkreise#] WHERE [#Nummernkreise.Nummernkreis#] = @nummernkreis");
var table = AdoInstance.Current.GetAdapterTable(sql,
new SqlParameter("@nummernkreis", nummernkreis));
var view = new AdoView(table.Rows[0], AdoInstance.Current);
// Nummer zusammensetzen: Präfix + formatierte Nummer + Suffix
var praefix = view.GetStringValue("Präfix");
var naechsteNummer = view.GetIntValue("Nächste Nummer");
var format = view.GetStringValue("Format");
var suffix = view.GetStringValue("Suffix");
var nummer = praefix + naechsteNummer.ToString(format) + suffix;
// Ergebnis z. B.: "RE-01042"
// Nächste Nummer hochzählen und speichern
view.SetValue("Nächste Nummer", naechsteNummer + 1);
table.Update();
return nummer;
}
}
}
Erklärung Schritt für Schritt
-
Prüfung: Wenn das Feld "Rechnungsnr" bereits gefüllt ist, wird das Skript sofort beendet. So wird bei erneutem Export keine neue Nummer vergeben.
-
Nummer generieren: Die Methode
GeneriereNummerlädt den passenden Nummernkreis aus der Datenbank, setzt die Nummer aus Präfix, formatierter Zahl und Suffix zusammen und erhöht den Zähler um 1. -
Speichern: Mit
currentContext.SaveChanges = truewird PRINT+PLUS angewiesen, die Änderung (neue Rechnungsnr) automatisch in die cobra-Datenbank zurückzuschreiben, sobald das Skript vollständig durchlaufen ist.
Varianten
Mehrere Nummernkreise pro Belegart:
// Nummernkreis dynamisch aus Feldern zusammensetzen
var belegart = datensatz.GetStringValue("Belegart");
var mandant = datensatz.GetStringValue("Mandant");
var neueNummer = GeneriereNummer(belegart + " " + mandant);
Dokument überspringen, wenn bereits vorhanden:
var dokument = datensatz.GetStringValue("Dokument");
if (!string.IsNullOrEmpty(dokument))
{
// Kein erneutes Dokument erzeugen
currentContext.SkipDocument = true;
return;
}
Keine Kommentare vorhanden
Keine Kommentare vorhanden