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.