Home › Forum › Allgemeines › Allgemeines zu Nuclos › Subform
- Dieses Thema hat 22 Antworten und 3 Teilnehmer, und wurde zuletzt aktualisiert vor 6 Jahren, 11 Monaten von
K. Struckmeier.
-
AutorBeiträge
-
3 Januar 2017 um 11:22 Uhr #9265
K. Struckmeier
TeilnehmerHallo,
ich habe eine Regel für das Subform (siehe Bild) erstellt. Im Regelmanager habe ich diese Regel auf das BO (Subform) hinzugefügt. Wenn ich dann direkt in dem BO einen Eintrag erstelle führt er die Regel korrekt aus. Nun will ich aber, dass er die Regel ausführt wenn ich wie im Bild einen Eintrag hinzufüge.Hier ist noch die Regel. Wenn ich diese auf das BO wie im Bild hinzufüge kann ich keinen Eintrag hinzufügen (speichert nicht):
Die Regel:
package org.nuclet.businessentity;
import org.nuclos.api.provider.BusinessObjectProvider;
import org.nuclos.api.rule.InsertRule;
import org.nuclos.api.context.InsertContext;
import org.nuclos.api.annotation.Rule;
import org.nuclos.api.exception.BusinessException;/** @name
* @description
* @usage
* @change
*/
@Rule(name=“bestellt“, description=“addition“)
public class bestellt implements InsertRule {@Override
public void insert(InsertContext context) throws BusinessException {Bestellung bestellt = context.getBusinessObject(Bestellung.class);
Artikel artikel = bestellt.getArtikelBO();
int a,b,c;
a=artikel.getBestellt();
b=bestellt.getMenge();
c=a+b;artikel.setBestellt(c);
BusinessObjectProvider.update(artikel);}
}Attachments:3 Januar 2017 um 11:42 Uhr #9266Fry123
TeilnehmerHier habe ich das gleich Problem:
https://www.nuclos.de/forum/makros-und-regeln/6464-regeln-und-subforms.htmlLeider ist es immer noch nicht dick und rot im Wiki…
3 Januar 2017 um 12:13 Uhr #9268K. Struckmeier
TeilnehmerUnd wann kommt Nuclos 5?
Sonst waren die letzten 2 Monate Arbeit umsonst.3 Januar 2017 um 12:46 Uhr #9269Nick Röder
TeilnehmerDer Beitrag von Fry123 betrifft Ihre Problematik nicht.
Sie haben eine Regel aus dem Kontext der Bestellung aufgerufen. Sie müssen dann die Werte auch wieder in diesem Kontext speichern. Dazu dürfen Sie sie nicht explizit über BusinessObjectProvider.update(Artikel) speichern.
Das Objekt wird automatisch über den Kontext gespeichert. Am Objekt Bestellung hängen auch noch alle abhängigen Objekte dran. Sie haben sich bereits richtig die Artikel geholt. Das einzige was Sie noch ändern müssen, ist das Update auf den Artikel zu entfernen, dies passiert automatisch über den Updatemechanismus. Ansonsten speichert die Regel zweimal, zu erst über BusinessObjectProvider.update(Artikel) und dann über den Kontext der Bestellung und dies führ zu einem Versionskonflikt. Dies wird Ihnen auch über das Logfile angezeigt.
3 Januar 2017 um 13:42 Uhr #9270K. Struckmeier
TeilnehmerIch habe das jetzt gemacht ( BusinessObjectProvider.update(artikel); ) entfernt. Die Regel an das BO vom Subform gehängt und es dann ausprobiert. Dem BO Bestellung erfassen (Haupt BO) habe ich keine Regel angehängt. Die Regel wird dann beim anlegen eines Eintrages nicht abgespeichert. Und wenn ich die Regel nur an das Haupt BO dran hänge, dann kommt wieder eine Fehlermeldung.
Kann es sein, dass ich im Regelmanager etwas falsch mache?3 Januar 2017 um 13:56 Uhr #9271Nick Röder
TeilnehmerAber das ist ja genau falsch.
Bitte machen Sie es so wie oben von mir beschrieben. Es muss im Kontext der Bestellung sein und auch an diesem BO hängen
3 Januar 2017 um 14:06 Uhr #9272K. Struckmeier
TeilnehmerIch glaube ich kann Ihnen nicht ganz folgen. Ich habe jetzt unten den Code:
BusinessObjectProvider.update(artikel); zu BusinessObjectProvider.update(bestellt);Oder was soll ich ändern?
3 Januar 2017 um 16:03 Uhr #9273Nick Röder
TeilnehmerSie Speichern bereits automatisch im Update/Insert Context alle Objekte die an der Bestellung hängen und natürlich die Bestellung selber. D.h. sie brauchen
die Zeile mit dem Update nicht.3 Januar 2017 um 16:09 Uhr #9274K. Struckmeier
TeilnehmerAlso dann so:
package org.nuclet.businessentity;
import org.nuclos.api.provider.BusinessObjectProvider;
import org.nuclos.api.rule.InsertRule;
import org.nuclos.api.context.InsertContext;
import org.nuclos.api.annotation.Rule;
import org.nuclos.api.exception.BusinessException;/** @name
* @description
* @usage
* @change
*/
@Rule(name=“bestellt“, description=“addition“)
public class bestellt implements InsertRule {@Override
public void insert(InsertContext context) throws BusinessException {Bestellung bestellt = context.getBusinessObject(Bestellung.class);
Artikel artikel = bestellt.getArtikelBO();
int a,b,c;
a=artikel.getBestellt();
b=bestellt.getMenge();
c=a+b;artikel.setBestellt(c);
}
}Die Regel habe ich dann an das BO Bestellungen gehängt. Ist das jetzt richtig?
3 Januar 2017 um 16:30 Uhr #9275Nick Röder
TeilnehmerGrundsätzlich ja. Aber wenn ich Ihre Regel richtig lese, holen Sie sich genau einen Artikel. Wollen Sie nicht auf (alle) Werte des Unterformulars zugreifen?
Diese Methode holt sich aus der Bestellung einen Artikel und berechnet dort etwas…
3 Januar 2017 um 16:33 Uhr #9276K. Struckmeier
Teilnehmerok und wie mache ich es, dass es auf alle Werte zugreift?
3 Januar 2017 um 16:43 Uhr #9277Nick Röder
TeilnehmerIm Wiki finden Sie genau dazu ein Beispiel. ich kann Ihnen nur empfehlen, dies bei der Entwicklung immer zu Rate zu ziehen.
Einfach bei den Regeln unter Update Kontext das Beispiel ansehen. Dort ist genau so ein Fall beschrieben.
Im Bestellobject gibt es zu jedem abhängigen Objekt eine Get Methode, um sich alle Werte als Liste zu holen. Also z.B. Bestellung.getBestellposition() wenn das abhängige Objekt Bestellposition lautet.
3 Januar 2017 um 16:53 Uhr #9278K. Struckmeier
TeilnehmerUnd wie passe ich das dann an meine Regel an?
public class KundeUpdate implements UpdateRule {
public void update(UpdateContext context) throws BusinessException {
// BusinessObject ‚Kunde‘ can only be used in update-processes, if the user does have the right to change a ‚kunde’s data.
Kunde kundeToUpdate = context.getBusinessObject(Kunde.class);
}
}3 Januar 2017 um 17:02 Uhr #9279Nick Röder
TeilnehmerNehmen Sie doch einfach das Beispiel aus dem Wiki und tauschen die Entitätsnamen aus.
3 Januar 2017 um 17:07 Uhr #9280K. Struckmeier
TeilnehmerWo muss ich die Entitätsnamen austauschen?
Etwa so?public class bestellung implements UpdateRule {
public void update(UpdateContext context) throws BusinessException {Besetllung besetllung= context.getBusinessObject(Besetllung.class);
}
} -
AutorBeiträge