Home Forum Nuclos Konfiguration Businessprozesse Automatisch fortlaufende Nummer Aw: Automatisch fortlaufende Nummer

#4176
Markus Glitzner
Teilnehmer

Habe nun meine Lösung umgebaut und alles in eine Bibliotheksregel gepackt. Sämtliche Datenbankfunktionen, was das Ganze recht umständlich gemacht hat, werden nicht mehr benötigt.

Entität: Nummernkreise
Name [name] (Text, Eindeutig, Pflichtfeld)
Prefix [prefix] (Text)
Pad Count [padcount] (Ganzzahl)
Next Value [nextvalue] (Ganzzahl)

Helper Klasse:
import org.nuclos.common.collect.collectable.searchcondition.*;
import org.nuclos.server.masterdata.valueobject.*;
import org.nuclos.server.ruleengine.*;
import java.util.*;

public abstract class Helper {

public static void setNextValue(RuleInterface server, String sEntity, String sField, String sKey) throws NuclosBusinessRuleException {
//sEntity: the entity name e.g. Aufträge
//sField: the number field name e.g. auftragsnummer
//sKey: the name of Nummernkreis e.g. Auftragsnummer

//only if the object is new
if (server.isObjectNew()){
//default values
String prefix = "";
Integer padcount = 0;
Integer nextvalue = 1;

CollectableComparison cond = org.nuclos.common.SearchConditionUtils.newMDComparison(org.nuclos.server.common.MasterDataMetaCache.getInstance().getMetaData("Nummernkreise"), "name", ComparisonOperator.EQUAL, sKey);
Collection ids = server.getMasterDataIds("Nummernkreise", new org.nuclos.server.genericobject.searchcondition.CollectableSearchExpression(cond));

if (!ids.isEmpty()) {
//there is only one entry in the collection
Integer id = (Integer)ids.iterator().next();
MasterDataVO item = server.getMasterData("Nummernkreise", id);

//get the values from Nummernkreise
prefix = (String)Helper.isNull(item.getField("prefix"), "");
padcount = (Integer)Helper.isNull(item.getField("padcount"), padcount);
nextvalue = (Integer)Helper.isNull(item.getField("nextvalue"), nextvalue);

//set the new number to the called entity
String format = String.format("%%0%dd", padcount);
server.setFieldValue(sEntity, sField, prefix + String.format(format, nextvalue));

//set the new value in Nummernkreise
server.setFieldValue("Nummernkreise", id, "nextvalue", nextvalue+1);
}
else {
throw new NuclosBusinessRuleException("Der Nummernkreis " + sKey + " ist nicht vorhanden!");
}
}
}

public static Object isNull(Object o, Object defaultvalue) {
if (o != null) {
return o;
}else{
return defaultvalue;
}
}

public static Boolean isInt(String s) {
try {
int i = Integer.parseInt(s);
return true;
}
catch (NumberFormatException e) {
return false;
}
}

public static Integer toInt(String s, Integer defaultvalue) {
try {
return Integer.parseInt(s);
}
catch (NumberFormatException e) {
return defaultvalue;
}
}
}

Der Aufruf erfolgt in einer Geschäftsregel, die an die jeweilige Entität gebunden ist und beim Speichern ausgeführt wird:
Helper.setNextValue(server, "Auftrag", "auftragsnummer", "Auftragsnummer");

Anbei noch ein Beispiel Nuclet
[attachment]C:fakepathNummernkreis.nuclet[/attachment]

Attachments: