Tipps & Tricks - Jahresbezogene Nummerierung

Dieser Beitrag zeigt, wie aus einem Vorgangsdatum und einem Vorgangszähler eine Vorgangsnummer erzeugt werden kann, die pro Jahr mit 1 startet, automatisch erhöht wird und auch das Jahr in der Nummer verwendet. Vorkenntnisse in Groovy und gute Intrexx-Kenntnisse sind für diesen Beitrag von Vorteil. Die Beispielapplikation mit Prozess können Sie hier herunterladen und wie gewohnt importieren. Aktivieren Sie den enthaltenen Prozess, damit Sie unser Beispiel testen können.

In der Beispielapplikation sind auf der Eingabeseite drei Eingabefelder mit den korrespondierenden Datenfeldern angelegt:

  • Vorgangsdatum (Kontrolltyp Datum)

  • Vorgangszähler (Kontrolltyp Ganzzahl)

  • Vorgangsnummer (Kontrolltyp Text)

Um die Vorgangsnummer zu erzeugen, muss in einem Prozess auf das Einfügen eines Datensatzes in der Datengruppe reagiert werden.

In der nachfolgenden Groovy-Aktion wird das folgende Skript ausgeführt:

// Importieren notwendiger Klassen
import java.util.Calendar
import java.text.SimpleDateFormat

// Datenverbindung zur Datenbank initialisieren
def conn = g_dbConnections.systemConnection

// Datum des Vorgangs auslesen
// Hier GUID des Datenfelds "Vorgangsdatum" eintragen
def dtVorgangsdatum = g_record["0158FC7B4355CA2D10A1621A9A7CAA8F53ECB2AC"].value

// Zeitzone des angemeldeten Benutzers bestimmen
def tz = g_session.user.timeZone

// Jahreszahlen aus Vorgangsdatum ermitteln
// Vierstellige Jahreszahl
def strYear = String.format('%tY', dtVorgangsdatum)
// Zweistellige Jahreszahl
def strYearShort = String.format('%ty', dtVorgangsdatum)

// Startdatum für Zählerstandsermittlung erstellen
// (01.01.Vorgangsjahr)
def calStart = Calendar.getInstance(tz)
calStart.setTime(dtVorgangsdatum)
calStart.set(Calendar.MONTH, Calendar.JANUARY)
calStart.set(Calendar.DATE, 1)
calStart.set(Calendar.HOUR, 0)
calStart.set(Calendar.MINUTE, 0)
calStart.set(Calendar.SECOND, 0)
calStart.set(Calendar.MILLISECOND, 0)

// Enddatum für Zählerstandsermittlung erstellen
//(31.12.Vorgangsjahr)
def calEnd = Calendar.getInstance(tz)
calEnd.setTime(dtVorgangsdatum)
calEnd.set(Calendar.MONTH, Calendar.JANUARY)
calEnd.set(Calendar.YEAR, strYear.toInteger() + 1)
calEnd.set(Calendar.DATE, 1)
calEnd.set(Calendar.HOUR, 0)
calEnd.set(Calendar.MINUTE, 0)
calEnd.set(Calendar.SECOND, 0)
calEnd.set(Calendar.MILLISECOND, 0)

// Letzten Zählerstand im Vorgangsjahr ermitteln und
// mit +1 die neue Vorgangsnummer erzeugen
// Hier GUID der Datengruppe "Vorgang" eintragen
def intCounter = g_dbQuery.executeAndGetScalarIntValue(conn, "SELECT MAX(L_VORGANGSZAEHLER)+1 FROM DATAGROUP('27B3340528694E79C45E3A7F693F287DE0ABC758') WHERE DT_VORGANGSDATUM >= ? AND DT_VORGANGSDATUM < ?", 1){
	setTimestamp(1, calStart.time)
	setTimestamp(2, calEnd.time)
}

// Formatierung der Vorgangsnummer
def strVorgangsnummer = strYearShort + "-" + intCounter.toString().padLeft(4, "0")

// Ergebnisse in Verarbeitungskontext legen
g_sharedState.put("vorgangsnummer", strVorgangsnummer)
g_sharedState.put("vorgangszaehler", intCounter)

Das Skript ermittelt die höchste Zählernummer des Vorgangsjahres und bestimmt damit die Nummer für den neuen Datensatz. Dazu wird die Jahreszahl der Datumsangabe ausgelesen und zwei Vergleichsdatumswerte für das Jahr erzeugt. Dabei werden zwei Kalenderobjekte jeweils mit dem Datum 01.01.<Vorgangsjahr> und 01.01.<Vorgangsjahr +1>definiert. Der zweite Datumswert steht sinngemäß für den 31.12.; durch den Vergleich im SQL-Statement muss jedoch der 01.01. mit einem Uhrzeitwert 00:00 und dem Operator "<" eingesetzt werden, um die letzte Minute des alten Jahres zur berücksichtigen. Die Ergebnisse der Berechnungen werden als Variablen in den Verarbeitungskontext gelegt. Ersetzen Sie ggfs. folgende Werte, wenn Sie das Groovy-Skript in anderen Applikationen verwenden wollen:

  • GUID des Datenfelds "Vorgangsdatum" (im Beispiel 0158FC7B4355CA2D10A1621A9A7CAA8F53ECB2AC)

  • GUID der Datengruppe "Vorgang" (im Beispiel 27B3340528694E79C45E3A7F693F287DE0ABC758)

Achten Sie auch auf die korrekten Datenfeld-Namen in der Datenbank-Abfrage.

Soll die Zählung immer bei einem anderen Wert starten, kann der Fallback-Wert bei der Ermittlung der neuen Zählernummer auf einen anderen Wert gesetzt werden. Im folgenden Beispiel beginnt die Zählung bei 1000.

// Hier GUID der Datengruppe "Vorgang" eintragen
def intCounter = g_dbQuery.executeAndGetScalarIntValue(conn, "SELECT MAX(L_VORGANGSZAEHLER)+1 FROM DATAGROUP('27B3340528694E79C45E3A7F693F287DE0ABC758') WHERE DT_VORGANGSDATUM >= ? AND DT_VORGANGSDATUM < ?", 1000){

In der nachfolgenden Datengruppen-Aktion wird der Datensatz geändert.

Dazu wird in der Feldzuordnung für die Vorgangsnummer und den Vorgangszähler jeweils ein Benutzerdefinierter Systemwert mit dem Typ "Verarbeitungskontext" erstellt und den entsprechenden Datenfeldern zugeordnet.