Home › Forum › Nuclos Entwicklung › Makros und Regeln › Statuswechsel per Regel
Schlagwörter: changeStatus, Regel, Statuswechsel
- Dieses Thema hat 3 Antworten und 2 Teilnehmer, und wurde zuletzt aktualisiert vor 4 Jahren, 9 Monaten von
Frank Kittendorf.
-
AutorBeiträge
-
3 März 2019 um 10:38 Uhr #19537
Frank Kittendorf
TeilnehmerHallo Forum,
ich möchte gerne einen Statuswechsel per Regel durchführen, bekomme das aber einfach nicht hin.
Hier meine Regel:package org.nuclet.businessentity; import org.nuclos.api.rule.UpdateRule; import org.nuclos.api.context.UpdateContext; import org.nuclos.api.annotation.Rule; import org.nuclos.api.exception.BusinessException; import org.nuclet.statemodel.AM3AufgabeSM; /** @name * @description * @usage * @change */ @Rule(name="AM3Statuswechselerledigt", description="aktive Aufgabe auf erledigt setzen") public class AM3Aufgabeerledigen implements UpdateRule { public void update(UpdateContext context) throws BusinessException { AM3Aufgabe curAufg = context.getBusinessObject(AM3Aufgabe.class); curAufg.changeStatus(AM3AufgabeSM.State_99); } }
Das ist meine Statusmodell-Klasse:
package org.nuclet.statemodel; import org.nuclos.common.UID; import org.nuclos.api.statemodel.State; import org.nuclos.api.exception.BusinessException; import org.nuclos.api.businessobject.facade.thin.Stateful; public class AM3AufgabeSM { public static State State_10 = new State(UID.parseUID("AsAY0q9DqF6IxrdtF0YC"), "aktiv", "aktiv", 10, UID.parseUID("zxYU7wQutEgNa7ef95rT")); public static State State_99 = new State(UID.parseUID("TlRF012pzS5prNOefKLk"), "erledigt", "erledigt", 99, UID.parseUID("zxYU7wQutEgNa7ef95rT")); public static Integer getNumeral(org.nuclos.api.UID stateId) throws BusinessException { if (stateId == null) { throw new IllegalArgumentException("stateId must not be null"); } if (stateId.equals(State_10.getId())) { return State_10.getNumeral(); } if (stateId.equals(State_99.getId())) { return State_99.getNumeral(); } throw new BusinessException("Status with id " + stateId + " does not exist in this status model"); } public static Integer getNumeral(Stateful statefulBusinessObject) throws BusinessException { return getNumeral(statefulBusinessObject.getNuclosStateId()); } }
Der manuelle Statuswechsel funktioniert, der Statuswechsel per Regel leider nicht. Fehlermeldungen in den Logs bekomme ich nicht.
Es wäre super, wenn mir jemand hierbei helfen könnte.5 März 2019 um 09:40 Uhr #19591tobyase
TeilnehmerHallo,
für den Statuswechsel musst du denStatemodelProvider
verwenden.
Also bei deinem Code wäre das dannAM3Aufgabe curAufg = context.getBusinessObject(AM3Aufgabe.class); StatemodelProvider.changeState(curAufg, AM3AufgabeSM.State_99);
Und natürlich in den Imports
import org.nuclos.api.provider.StatemodelProvider;
nicht vergessen.
Viele Grüße,
TC6 März 2019 um 11:24 Uhr #19593Frank Kittendorf
TeilnehmerHallo TC,
danke für die schnelle Rückmeldung. Leider funktioniert es immer noch nicht.
Im Logfile bekomme ich nur die Meldung:
2019-03-06 11:29:53,904 INFO [org.nuclos.server.customcode.codegenerator.RuleDebugLoggerSingleton] - org/nuclet/businessentity/AMAM3Aufgabeerledigen.update(Lorg/nuclos/api/context/UpdateContext;)V [21] => AM3Aufgabe curAufg => AM3 Aufgabe 40107244
Könne es ein Problem sein, dass ich eine Update-Regel anstelle einer Statemodel-Regel benutze?
Oder ist ggf. mein Statusmodell falsch definiert? Muss der Übergang auf automatisch o. ä. gesetzt werden?
[aktiv] —> [erledigt]Viele Grüße
FKI6 März 2019 um 19:38 Uhr #19601Frank Kittendorf
TeilnehmerHallo Forum,
Problem gelöst!! Der Statuswechsel darf nicht vor dem Speichern (Update), sondern erst danach (UpdateFinal) ausgeführt werden.
Hier die funktionierende Regel.package org.nuclet.businessentity; import org.nuclos.api.rule.UpdateFinalRule; import org.nuclos.api.context.UpdateContext; import org.nuclos.api.annotation.Rule; import org.nuclos.api.exception.BusinessException; import org.nuclos.api.provider.StatemodelProvider; import org.nuclet.statemodel.AM3AufgabeSM; /** @name * @description * @usage * @change */ @Rule(name="AM3Statuswechselerledigt", description="aktive Aufgabe auf erledigt (numeral=99) setzen") public class AM3Aufgabeerledigen implements UpdateFinalRule { public void updateFinal(UpdateContext context) throws BusinessException { AM3Aufgabe curAufg = context.getBusinessObject(AM3Aufgabe.class); StatemodelProvider.changeState(cur.Aufg, AM3AufgabeSM.State_99); } }
-
Diese Antwort wurde geändert vor 4 Jahren, 9 Monaten von
Frank Kittendorf.
-
Diese Antwort wurde geändert vor 4 Jahren, 9 Monaten von
-
AutorBeiträge