Dieses Skript zeigt, wie man anhand einer Nummernkreistabelle automatisch bei der Dokument-Ausgabe generiert.
Die Vorteile im Vergleich zu einfachen Zählerfeldern in cobra besteht darin, dass hiermit eine lückenlose Nummerierung auch bei unterschiedlichen Dokument/Belegarten erreicht werden kann.
Konfiguration
Es gibt eine freie Tabelle Nummernkreise mit folgenden Feldern:
Nummernkreis, Text 50
NächsteNummer, Zahl
Format, Text 50
Präfix, Text 50
Suffix, Text 50
Es handelt sich um einen Skriptexporter
Ausgangstabelle ist die Tabelle, in der die Nummer vergeben wird
Das Skript wird als AfterLoadData ausgeführt
Ideen
Es wird zunächst geprüft ob der Datensatz bereits eine Nummer hat, nur falls leer wird die Nummer generiert.
Es wird in einer freien Tabelle geführt welches die nächste Nummer als nächstes Vergeben wird.
Skript
// Version 5
namespace Ruthardt.PrintPlus.Skripting
{
using System;
using System.Data;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using Ruthardt.CobraBase.Functions.Access.Ado;
using Ruthardt.CobraFramework.Ado;
using Ruthardt.PrintPlus.Model.Interfaces;
/// <summary>
/// Diese Klasse enthält die Funktionalität, die vor der Erstellung des Belegs ausgeführt wird.
/// </summary>
public class BelegnummerVergeben : IScriptAction
{
/// <summary>
/// PrintPlus ruft ein Script über diese Execute-Methode auf und übergibt dabei den aktuellen <see cref="ICurrentContext"/>
/// vgl. <see cref="IScriptAction"/>.<see cref="IScriptAction.Execute"/>
/// </summary>
/// <param name="context">Der <see cref="ICurrentContext"/> des aktuellen Export-Vorgangs</param>
public void Execute(IPrintContext printContext, ICurrentContext currentContext, IChildContext childContext)
{
// Zugriff auf den aktuellen Datensatz
var beleg = currentContext.Data;
// aktuelle Belegnummer abprüfen
var belegnummer = beleg.GetStringValue("Belegnummer");
// wenn aktuell keine Belegnummer vergeben wurde, dann neue vergeben
if (string.IsNullOrEmpty(belegnummer) &&
printContext.WaitFormManager.ShowMessageBox("Soll eine Rechnungsnummer vergeben werden?", "Nummer vergeben?",
MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
{
var mandant = beleg.GetStringValue("Mandant");
var belegart = beleg.GetStringValue("Belegart");
var nummernkreis = belegart + " " + mandant;
// neue Belegnummer speichern
try
{
belegnummer = GeneriereNummer(printContext.AdoAccess, nummernkreis);
beleg.SetValue("Belegnummer", belegnummer);
// Anweisung dass PrintPlus die Daten speichern soll
currentContext.SaveChanges = true;
}
catch
{
printContext.WaitFormManager.ShowMessageBox("Fehler bei Nummernvergabe '" + nummernkreis + "'");
}
}
}
private string GeneriereNummer(AdoAccess adoAccess, string nummernkreis)
{
// Nummernkreis laden
var tableNummernkreis = adoAccess.GetAdapterTable(
"SELECT * FROM [#Nummernkreise#] WHERE [#Nummernkreise.Nummernkreis#] = @nummernkreis",
new SqlParameter("@nummernkreis", nummernkreis));
var viewNummernkreis = new AdoView(tableNummernkreis.Rows[0], "Nummernkreise", adoAccess);
// Nächste Nummer ermitteln
var nummer = viewNummernkreis.GetStringValue("Präfix") + viewNummernkreis.GetIntValue("Nächste Nummer").ToString(viewNummernkreis.GetStringValue("Format")) + viewNummernkreis.GetStringValue("Suffix");
// Nächste Nummer um 1 erhöhen
viewNummernkreis.SetValue("Nächste Nummer", viewNummernkreis.GetIntValue("Nächste Nummer") + 1);
// Nummernkreis speichern
tableNummernkreis.Update();
// vergebene Nummer zurückgeben
return nummer;
}
}
}