Ansicht von 15 Beiträgen - 1 bis 15 (von insgesamt 23)
  • Autor
    Beiträge
  • #9265
    K. Struckmeier
    Teilnehmer

    Hallo,
    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:
    #9266
    Fry123
    Teilnehmer

    Hier habe ich das gleich Problem:
    https://www.nuclos.de/forum/makros-und-regeln/6464-regeln-und-subforms.html

    Leider ist es immer noch nicht dick und rot im Wiki…

    #9268
    K. Struckmeier
    Teilnehmer

    Und wann kommt Nuclos 5?
    Sonst waren die letzten 2 Monate Arbeit umsonst.

    #9269
    Nick Röder
    Teilnehmer

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

    #9270
    K. Struckmeier
    Teilnehmer

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

    #9271
    Nick Röder
    Teilnehmer

    Aber 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

    #9272
    K. Struckmeier
    Teilnehmer

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

    #9273
    Nick Röder
    Teilnehmer

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

    #9274
    K. Struckmeier
    Teilnehmer

    Also 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?

    #9275
    Nick Röder
    Teilnehmer

    Grundsä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…

    #9276
    K. Struckmeier
    Teilnehmer

    ok und wie mache ich es, dass es auf alle Werte zugreift?

    #9277
    Nick Röder
    Teilnehmer

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

    #9278
    K. Struckmeier
    Teilnehmer

    Und 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);
        }
    }

    #9279
    Nick Röder
    Teilnehmer

    Nehmen Sie doch einfach das Beispiel aus dem Wiki und tauschen die Entitätsnamen aus.

    #9280
    K. Struckmeier
    Teilnehmer

    Wo 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);
        }
    }

Ansicht von 15 Beiträgen - 1 bis 15 (von insgesamt 23)