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:

// Import required classes
import java.util.Calendar
import java.text.SimpleDateFormat

// Initialize data connection to data base
def conn = g_dbConnections.systemConnection

// Get date of process
// Enter the GUID of the data field "Operationdate" here
def dtOperationdate = g_record["0158FC7B4355CA2D10A1621A9A7CAA8F53ECB2AC"].value

// Determine time zone of the logged in user
def tz = g_session.user.timeZone

// Determine year numbers from operation date
// Four digit year
def strYear = String.format('%tY', dtOperationdate)
// Two digit year
def strYearShort = String.format('%ty', dtOperationdate)

// Create start date for meter reading determination
// (01.01. start of operation year)
def calStart = Calendar.getInstance(tz)
calStart.setTime(dtOperationdate)
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)

// Create end date for meter reading determination
//(31.12.end of operation year)
def calEnd = Calendar.getInstance(tz)
calEnd.setTime(dtOperationdate)
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)

// Determine the last counter reading in the transaction year and
// create the new transaction number with +1
// Enter the GUID of the data group "transaction" here
def intCounter = g_dbQuery.executeAndGetScalarIntValue(conn, "SELECT MAX(L_OPERATIONCOUNTER)+1 FROM DATAGROUP('27B3340528694E79C45E3A7F693F287DE0ABC758') WHERE DT_OPERATIONDATE >= ? AND DT_OPERATIONDATE < ?", 1){
	setTimestamp(1, calStart.time)
	setTimestamp(2, calEnd.time)
}

// Formatting the operation number
def strVorgangsnummer = strYearShort + "-" + intCounter.toString().padLeft(4, "0")

// Put results into processing context
g_sharedState.put("Operationnumber", strOperationnumber)
g_sharedState.put("Operationcounter", 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.

// Enter the GUID of the "Process" data group here.
def intCounter = g_dbQuery.executeAndGetScalarIntValue(conn, "SELECT MAX(L_OPERATIONCOUNTER)+1 FROM DATAGROUP('27B3340528694E79C45E3A7F693F287DE0ABC758') WHERE DT_OPERATIONDATE>= ? AND DT_OPERATIONDATE < ?", 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.