Direkt zum Hauptinhalt

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

  1. Prüfung: Wenn das Feld "Rechnungsnr" bereits gefüllt ist, wird das Skript sofort beendet. So wird bei erneutem Export keine neue Nummer vergeben.

  2. Nummer generieren: Die Methode GeneriereNummer lä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.

  3. Speichern: Mit currentContext.SaveChanges = true wird 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;
}