Home › Forum › Nuclos Entwicklung › Makros und Regeln › Beschreibung der Regeln-APIs
- Dieses Thema hat 12 Antworten und 4 Teilnehmer, und wurde zuletzt aktualisiert vor 12 Jahre, 8 Monaten von
Jan Smiesko.
-
AutorBeiträge
-
23 August 2010 um 19:20 Uhr #2430
Jan Smiesko
TeilnehmerHallo Forum!
Gibt es eine Beschreibung der APIs für Regeln?
FG
Jan24 August 2010 um 18:42 Uhr #2436Ramin Goettlich
TeilnehmerLeider noch nicht, folgt aber bald hier: http://wiki.nuclos.de/2.5/Wiki.jsp?page=Regeln%20API
Ergänzende Anmerkung:
Entwickelt man Regeln in Eclipse, hat man dort natürlich die volle Code Completion Unterstützung etc.
In der neuesten Nuclos Version unterstützt der Regeleditor ausserdem bereits einen Debugmodus und im Ansatz auch schon Code Completion. Das wird in einem der nächsten Releases noch erweitert.
25 August 2010 um 12:03 Uhr #2440Matthias Haake
TeilnehmerEntwickelt man Regeln in Eclipse, hat man dort natürlich die volle Code Completion Unterstützung etc.
Und man kann vernünftig testen (z.B. mit JUnit, EasyMock).
31 August 2010 um 10:31 Uhr #2509Jan Smiesko
TeilnehmerDanke für die Vorschläge!
Mit Eclipse bzw. Java habe ich wenig Erfahrung und die Einrichtung von Eclipse mit all den Abhängigkeiten scheint mir recht kompliziert zu sein. (evtl. gibt es ein Tutorial zur Einrichtung)
Deshalb bevorzuge ich eine integrierte IDE-Umgebung in Nuclos, um mich auf das Wesentliche konzentrieren zu können.Bin ich richtig in der Annahme, dass die Regel-APIs im File
nuclos/server/ruleengine/RuleInterface.java
zu finden sind?
Ich habe z.B. eine setField-Methode gefunden, diese verlangt aber mehr Parameter, als in einem Beispiel (2 Parameter), das ich mir ansah. Habe ich das richtige File oder was hat es mit dem Parameterunterschied auf sich?
Auszug aus RuleInterface.java
/**
* sets a field of the current object.
* @param sFieldName field to change value for
* @param iValueId new value id
* @param oValue new value
* @precondition sFieldName != null
*/
public void setField(String sEntityName, String sFieldName, Integer iValueId, Object oValue) {…}FG
Jan6 September 2010 um 18:02 Uhr #2543Claudia Mangstl
Teilnehmer7 September 2010 um 13:32 Uhr #2545Matthias Haake
TeilnehmerVielen Dank für den Link.
Ich hätte dazu noch eine Frage: Wird es später auch eine Doku für die Objekte geben, die vom RuleInterface zurück gegeben werden (z.B. MasterDataVO, DynamicAttributeVO)?
Ich fände es auch sehr hilfreich, wenn anhand eines kleines Beispieles mit ein/zwei Entitäten mal erklärt wird, was genau durch ein MasterDavaVO dargestellt wird und wann man Field und wann Attribute verwenden muss/sollte. Oder was der Unterschied zwischen MasterDataIds und GenericObjectIds sind – wann braucht man was? Oder was genau „getCellValues“ denn macht. In der Doku sieht man zwar die Signatur der Methode aber ohne jegliche Erklärungen…
Vielen Dank und Grüße,
Matthias7 September 2010 um 19:27 Uhr #2546Jan Smiesko
TeilnehmerHallo,
und danke für den Link. Ich würde mir auch eine Erklärung der Objekte wünschen.
Was ich getestet habe (bitte Support-Team um Korrektur, falls nicht richtig):
public void rule(RuleInterface server) throws NuclosBusinessRuleException {
MasterDataVO mdVOAdresse = server.getMasterData();
mdVOAdresse.setField(„test“, „Test1“ );}
***
server.getMasterData();
liefert das Objekt ‚MasterDataVO‘ (VO ? ValueObject), welches auf den aktuellen Datensatz zeigt, wenn ich mich in einem Modul befinde. In diesem Fall bin ich im Modul ‚Adressen‘ unter Details. In der Entität Adressen ist ein Textfeld ‚test‘. Dieses wird z.B. beim Speichern zu Testzwecken mit einem Wert ‚Test1′ automatisch befüllt:mdVOAdresse.setField(„test“, „Test1“ );
***Habe das obere Beispiel auch mit mdVOAdresse.setFieldValue(…) getestet, hat aber nicht funktioniert. Was ist z.B. der Unterschied zwischen den Methoden ’setField‘ und ’setFieldValue‘?
FG
Jan8 September 2010 um 18:06 Uhr #2548Claudia Mangstl
TeilnehmerHallo Jan,
sämtliche Methoden stammen noch aus dem Vorgänger-Konzept. Hier hatten wir eine Unterscheidung zwischen Modul- und Stammdatenentitäten, die auch im Datenmodell unterschiedlich behandelt wurden. Daher gibt es noch viele unterschiedliche Wege, um ans Ziel zu kommen.
Im Wiki unter Geschäftsregeln gibt es jetzt einen Eintrag mit einigen Methoden zum Setzen und Auslesen von Werten. Wir werden diese Beispiele nach und nach erweitern.
Nun zu Ihrem Versuch:
Der Aufruf „MasterDataVO mdVOAdresse = server.getMasterData();“ liefert nur die Metadaten zum jeweiligen Serverobjekt zurück.Handelt es sich bei den Adressen um ein einzelnes Feld ?
Dann rufen Sie zum Eintragen des Wertes „Test1“ durch diesen Aufruf:server.setFieldValue(„adresse“, „test“, „Test1“);
Der Unterschied zwischen setFieldValue und setField ist, dass es sich beim Aufruf von setField um ein Feld mit Fremdbezug handeln muss, also ein Feld mit Wert+ID.
—–
Oder handelt es sich bei den Adressen um ein Unterformular innerhalb einer anderen Entität ?
Dann müssen Sie die Daten des Unterformulars erst abhängig von der Entität laden mitCollection collmdvo = server.getDependants(„adresse“);
Jetzt über die Collection iterieren und den Wert des entsprechenden Feldes setzen mitmdvo.setField(„test“, „Test1“);
Bitte beachten: im ersten Fall bezieht sich der Aufruf auf das server-Objekt, das in der Methode der Regel übergeben wird.
Im zweiten Fall handelt es sich um eine andere Entität „mdvo“ (MasterDataVO), die an das „server“-Objekt gekoppelt ist. Beide Fälle haben unterschiedliche Methoden.Ich hoffe, ich konnte etwas helfen. Bitte zögern Sie nicht, weitere Fragen zu stellen 🙂
Viele Grüße,
Claudia M.9 September 2010 um 13:48 Uhr #2550Jan Smiesko
TeilnehmerHallo Claudia,
danke für die rasche Information!
Die diversen Objekte verstehe ich nicht:
‚ObjectId‘ entspricht der ‚intid‘ in der Tabelle (mit server.getObjectId(); habe ich diese erhalten)
Was ist dann ‚Intid‘. Mit server.getNextIntid(); habe ich einen Wert erhalten, den ich nicht zuordnen kann.
Den nachstehenden Befehl habe ich angewandt (gleiche EntityName anderes Objekt als gerade bearbeitet). Es kam keine Fehlermeldung, aber der Client reagierte nicht mehr. Die ObjectId habe ich überprüft.
Server wurde neu gestartet.server.setFieldValue(„Adressen“, 40000469, „test“, „etwas“);
Vielen Dank für Ihre Bemühungen!
FG
Jan9 September 2010 um 19:30 Uhr #2552Claudia Mangstl
TeilnehmerHallo Jan,
mit server.getObjectId() erhalten Sie die Id des aktuellen Datensatzes. Das brauchen Sie aber eigentlich garnicht, wenn sich das Feld „test“ in der aktuellen Entität (Adressen) befindet. Dann können Sie den Wert einfach über den Aufruf
server.setFieldValue(„Adressen“, „test“, „etwas“);
setzen.Mit server.getNextIntid() erhalten Sie eine ganz neue Id von der IDFactory. Zu dieser ID gibt es dann noch gar kein Objekt, dieser Aufruf wird also an dieser Stelle nicht benötigt.
Welche Fehlermeldung haben Sie denn bekommen ? Können Sie die mal posten und evtl. auch einen Screenshot von Ihrer Maske ?
20 September 2010 um 12:28 Uhr #2567Jan Smiesko
TeilnehmerHallo Claudia,
eine Fehlermeldung ist nicht gekommen, der Client hat nicht mehr reagiert, weil er auf eine Rückmeldung vom Server gewartet hat.
Die Anweisung
server.setFieldValue(„Adressen“, 40000469, „test“, „etwas“);
dient rein Testzwecken, um das Framework kennen zu lernen. In wollte einfach in der gleichen Entität einen anderen als den aktuellen Datensatz ändern.
Anbei die Screenshots.
Freundliche Grüße
Jan
20 September 2010 um 16:21 Uhr #2568Claudia Mangstl
TeilnehmerHallo Jan,
evtl. ist dieses Post: https://www.nuclos.de/index.php/de/nuclos-forum/makros-und-regeln/1832-aufloesung-von-referenzen-n1 auch genau der Fall, den Sie ausprobiert haben.
Viele Grüße,
ClaudiaPS: die Screenshots sind nicht sichtbar
20 September 2010 um 19:34 Uhr #2570Jan Smiesko
TeilnehmerIch hoffe diesmal klappt es mit den Bildern.
?… das Anhängen der Bilder hat nicht funktioniert. -
AutorBeiträge