Home › Forum › Nuclos Konfiguration › Businessprozesse › Automatisch fortlaufende Nummer
- Dieses Thema hat 51 Antworten und 15 Teilnehmer, und wurde zuletzt aktualisiert vor 9 Jahren, 7 Monaten von
caf.
-
AutorBeiträge
-
23 November 2011 um 17:59 Uhr #4496
Martin Schwärzel
TeilnehmerDas Beispiel ist super, einfach nachzuvollziehen. Danke
Die Lösung von hugo klappt nun aber in 3.1.3 nicht mehr.
Anscheinend verhält sich das server.setFieldValue bei einem neuen Datensatz nicht mehr gleich wie früher. Es gibt die Fehlermeldung.„Der Datensatz kann nicht gespeichert werden, (evtl. ist der Schlüssel schon vergeben)“
Das Problem liegt nur in der Zeile
server.setFieldValue(sEntity, sField, prefix + String.format(format, nextvalue));
Hat jemand einen Rat?
Danke und Gruss
Martin23 November 2011 um 18:20 Uhr #4497Markus Glitzner
TeilnehmerHier meine aktuelle Version
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 {
/**
* ...
*
* @author Markus Glitzner (alias Hugo)
* @version 2011-10-30
*
* @param sEntity the entity name e.g. Aufträge
* @param sField the entity's number field e.g. auftragsnummer
* @param sKey the name of the number range e.g. Auftragsnummer
*
*/
public static void NextValue(RuleInterface server, String sEntity, String sField, String sKey) throws NuclosBusinessRuleException {//only if the object is new
if (server.isObjectNew()){//get the id of the numbering entry
Integer id;
id = getId(server, "Nummernkreise", "name", sKey);if (id == null) {
throw new NuclosBusinessRuleException("Der Nummernkreis " + sKey + " ist nicht vorhanden!");
}else{
//get the MasterDataVO of Nummernkreis
MasterDataVO item = server.getMasterData("Nummernkreise", id);//get the values from Nummernkreis
String prefix = (String)Nz(item.getField("prefix"), "");
Integer padcount = (Integer)Nz(item.getField("padcount"), 0);
Integer nextvalue = (Integer)Nz(item.getField("nextvalue"), 1);//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 Nummernkreis
server.setFieldValue("Nummernkreise", id, "nextvalue", nextvalue+1);
}
}
}private static Integer getId(RuleInterface server, String sEntity, String sField, String sKey) {
CollectableComparison cond = org.nuclos.common.SearchConditionUtils.newMDComparison(org.nuclos.server.common.MasterDataMetaCache.getInstance().getMetaData(sEntity), sField, ComparisonOperator.EQUAL, sKey);
Collection ids = server.getMasterDataIds(sEntity, new org.nuclos.server.genericobject.searchcondition.CollectableSearchExpression(cond));if (!ids.isEmpty()) {
return (Integer)ids.iterator().next();
}else{
return null;
}
}private static Object Nz(Object o, Object defaultvalue) {
if (o != null) {
return o;
}else{
return defaultvalue;
}
}
}
23 November 2011 um 19:23 Uhr #4499Martin Schwärzel
TeilnehmerHabe es soeben selber herausgefunden. Die Fehlermeldung war nicht sehr aussagekräftig.
Ich habe in ein Int Feld einen String eintragen wollen, was nicht sehr gut kommt. :dry:Klappt nun sehr gut.
Danke für die schnelle Antwort (klappt auch mit der alten Version)
Gruss Martin
1 Dezember 2011 um 22:28 Uhr #4624Thomas Hamm
TeilnehmerHallo,
ist es eventuell möglich dies auch über die Parameter in Nuclos zu lösen? Dann müsste man hierfür keine neue Entitäten anlegen. Leider finde ich keine Methoden wie get- bzw. setParameter. Aber ich könnte dies doch direkt über eine Datenbankabfrage erreichen oder?
Gruß
th-connect
25 Januar 2012 um 14:14 Uhr #4895Ramin Goettlich
TeilnehmerHallo,
aktuell unterstützt Nuclos nativ kein Verfahren zur konfigurierbaren Nummerngenerierung (vom nicht konfigurierbaren Systemidentifizierer einmal abgesehen).
Teilweise sind die Anforderungen an zu generierende Nummern komplex und individuell, so dass eine Nummerngenerierung für den Einzelfall kaum ohne die Implementierung einer entsprechenden Geschäftsregel möglich ist. Deswegen wird man sich bis auf Weiteres mit Geschäftsregeln oder den hier im Thread vorgeschlagenen Bibliotheksregeln behelfen müssen.
Ein Beispiel für einen etwas komplexeren, aber typischen Fall für Anforderung an Nummerngenerierung, die mit den hier vorgeschlagenen Bibliotheksregeln -soweit ich sehe- nicht erreichbar wäre: Rechnungsnummern, die den Kunden oder den Auftrag mit in der Rechnungsnummer verschlüsseln, oder Auftragsnummern, die den Kunden mitverschlüsseln.
Grüsse,
nuclosian2 Februar 2012 um 23:29 Uhr #4955Sebastian Süßdorf
TeilnehmerHallo Hugo,
kannst Du mir Deine Entität Nummernkreise mal zukommen lassen?2 Februar 2012 um 23:38 Uhr #4956Markus Glitzner
TeilnehmerAttachments:19 Februar 2012 um 22:28 Uhr #5039Thomas Hamm
TeilnehmerHallo zusammen,
ich schreibe gerade auch an einer Nummernvergabe und bin dabei auf ein Problem gestoßen. Die Vergabe funktioniert problemlos, jedoch nur wenn ich im Pflichtfeld eine Nummer hinterlegt habe. Sonst kommt eben die Meldung, dass das Feld keinen gültigen Wert hat. Ich habe mir mal über den Standardwert des Attributs geholfen was ich jedoch nicht sehr schön finde. Gibt es da noch eine andere Möglichkeit? In der Geschäftsregel habe ich „Speichern“ ausgewählt welches laut Wiki ja vor dem Speichern ausgeführt wird.
Grüße
th-connect
19 Februar 2012 um 22:34 Uhr #5040Ramin Goettlich
TeilnehmerHallo th-connect,
mir ist nicht ganz klar, worin das Problem besteht. Wenn das Pflichtfeld in der Regel mit einem Wert (der erzeugten Nummer) belegt wird, kann es auch nicht zu einer Pflichtfeldverletzung kommen. Die Speichernregel ist Bestandteil der Transition, wird also in diesem Sinne vor dem Speichern ausgeführt. Erhalten Sie einen Fehler.
Bzgl. Standardwert automatisch vergebener Felder: Ich mache das gern so, dass ich als Standardwert „“ setze, dann ist dem User beim Betrachten des (ausgegrauten…) Feldes auch sofort klar, was hier passieren soll/wird.
Grüsse,
nuclosian19 Februar 2012 um 23:00 Uhr #5041Thomas Hamm
TeilnehmerHallo nuclosian,
einen Fehler bekomme ich in dem Sinne nicht. Eventuell liege ich auch falsch. Ich habe ja eine Geschäftsregel die beim Speichern ausgeführt wird. Das Pflichtfeld welches gefüllt werden soll lass ich leer. Wenn ich dann aber auf Speichern klicke, kommt die Meldung weil das Pflichtfeld leer ist. Wenn ich aber vor dem Speichern z.B. eine 0 reinschreibe, dann wird das Feld auch richtig über meine Regel befüllt (die 0 wird überschrieben). In der Geschäftsregel benutze ich setFieldValue(). Liegt es eventuell daran?
Gruß th-connect
19 Februar 2012 um 23:19 Uhr #5042Markus Glitzner
TeilnehmerHallo!
Pflichtfelder werden noch vor dem Speichern geprüft, darum greift auch deine Regel noch nicht. Ich habe bei allen automatischen Nummern „(Neu)“ als Standard hinterlegt, dann weis der Benutzer auch , dass hier eine neue Nummer entsteht. Sehe ich jetzt auch kein wirkliches Problem darin. Nur 0 sagt halt als Standardwert nicht viel aus, darum vielleicht nicht ganz passend.
Gruß
Hugo19 Februar 2012 um 23:25 Uhr #5043Thomas Hamm
TeilnehmerAlles klar. Werde ich so machen. Vielen Dank.
Gibt es eigentlich einen besonderen Grund warum Geschäftsregeln nur beim Löschen und Speichern funktionieren und nicht beim Anlegen?
Gruß th-connect
19 Februar 2012 um 23:37 Uhr #5044Markus Glitzner
TeilnehmerWas meinst du damit?
Anlegen == Speichern
19 Februar 2012 um 23:42 Uhr #5045Thomas Hamm
TeilnehmerIch meinte damit, wenn man auf „neuen Datensatz anlegen“ klickt. Somit könnte man mit einer Geschäftsregel noch frühler beginnen. Fände ich persönlich benutzerfreundlicher.
19 Februar 2012 um 23:50 Uhr #5046Markus Glitzner
TeilnehmerAch so meinst du, könnte manchmal u.U. Sinn machen, aber durch die Möglichkeit einen Standardwert zu hinterlegen ja nicht umbedingt notwendig, aber ist halt wie vieles auch Geschmackssache.
-
AutorBeiträge