Home Forum Nuclos Konfiguration Businessprozesse Automatisch fortlaufende Nummer

Ansicht von 15 Beiträgen - 16 bis 30 (von insgesamt 52)
  • Autor
    Beiträge
  • #4496
    Martin Schwärzel
    Teilnehmer

    Das 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
    Martin

    #4497
    Markus Glitzner
    Teilnehmer

    Hier 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;
    }
    }
    }

    #4499
    Martin Schwärzel
    Teilnehmer

    Habe 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

    #4624
    Thomas Hamm
    Teilnehmer

    Hallo,

    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

    #4895
    Ramin Goettlich
    Teilnehmer

    Hallo,

    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,
    nuclosian

    #4955

    Hallo Hugo,
    kannst Du mir Deine Entität Nummernkreise mal zukommen lassen?

    #4956
    Markus Glitzner
    Teilnehmer
    Attachments:
    #5039
    Thomas Hamm
    Teilnehmer

    Hallo 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

    #5040
    Ramin Goettlich
    Teilnehmer

    Hallo 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,
    nuclosian

    #5041
    Thomas Hamm
    Teilnehmer

    Hallo 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

    #5042
    Markus Glitzner
    Teilnehmer

    Hallo!

    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ß
    Hugo

    #5043
    Thomas Hamm
    Teilnehmer

    Alles 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

    #5044
    Markus Glitzner
    Teilnehmer

    Was meinst du damit?

    Anlegen == Speichern

    #5045
    Thomas Hamm
    Teilnehmer

    Ich 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.

    #5046
    Markus Glitzner
    Teilnehmer

    Ach 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.

Ansicht von 15 Beiträgen - 16 bis 30 (von insgesamt 52)