Home Forum Nuclos Entwicklung Makros und Regeln Neue Zeilen in Unterformular hinzufügen

Ansicht von 15 Beiträgen - 1 bis 15 (von insgesamt 17)
  • Autor
    Beiträge
  • #8186
    Franz Holzer
    Teilnehmer

    Wie hier beschrieben:
    http://wiki.nuclos.de/pages/viewpage.action?pageId=327852

    gibt es hier auch eine Hilfe zu der neuen API ?
    Finde dazu leider nichts.

    lg

    #8195
    Frank Pavlic
    Teilnehmer

    Hi,
    bei jedem BO gibt es für jedes Unterformular die Methoden get, insert, delete. Spontan würde ich sagen, neues Unterformular-Objekt erzeugen, Felder mit sinnvollen Daten füllen und anschließend insert aufrufen. Auf die Schnelle reingetippt, Hauptentität = Angebote, Unterformular = Angebotspos:
    Angebotspos abpos = new Angebotspos();
    abpos.setArtikelname("Artikel 1345");
    abpos.setAngebot(Angebote.getId());
    Angebote.insertAngebotspos(abpos);

    Gruß
    Frank

    #8199
    Franz Holzer
    Teilnehmer

    danke Frank !

    die zeile
    abpos.setAngebot(Angebote.getId());

    begreif ich noch nicht ganz (funktioniert auch nicht)

    soll dies die Referenz auf Angebot darstellen oder ?
    oder was ist „Angebot“ in dem kontext. (also ohne e)

    Auf jedenfall bekomme ich den Fehler

    „cannot find symbol, symbol: method setAngebot(java.lang.Long)

    ich schau mal ob ich drauf komme wieso 🙂

    #8200
    Martin Rithos
    Teilnehmer

    Hier ist doch genau der Fall den du suchst, oder?

    Hast du alles notwendige importiert?

    import org.nuclos.api.rule.InsertRule;
    import org.nuclos.api.context.InsertContext;
    import org.nuclos.api.annotation.Rule;
    import org.nuclos.api.exception.BusinessException;
    import org.nuclos.api.provider.BusinessObjectProvider;
    import org.nuclos.api.provider.QueryProvider;

    #8202
    Franz Holzer
    Teilnehmer

    Ich versuche das ganze bei einem Status wechsel.
    Die Import müssten dennoch stimmen.

    noch eine Verständniss Frage zu dem Beispiel das du gepostet hast:
    Lager myLagerort = QueryProvider.getById(Lager.class, 40271111L);

    Ich nehme an „40271111L“ ist die ID zu dem Lagerort.
    Wo kann ich die IDs auslesen ?
    Also nicht per regel sondern wirklich auslesen damit ich es verwenden kann 🙂

    lg

    #8206
    Frank Pavlic
    Teilnehmer

    Hallo,
    logisch bekommst Du einen Fehler, wenn Du mein Beispiel 1-zu-1 übernimmst, und deine BOs aber nicht „Angebote“ und „Angebotspositionen“ heissen bzw. das BO-attribut „Angebot“ in Angebotspositionen nicht existiert. Das war ja nur ein Beispiel, wie Du die Methoden verwendet sollst, wenn Du per Regel neue Unterformular-Datensätze hinzufügen willst.
    abpos.setAngebot(Angebote.getId()) bedeutet:
    setze in der Auftragsposition das Feld „Angebot“, was ein Referenzfeld auf die Hauptentität „Angebote“ ist, mit der Id des Angebots, welches Du in deiner Maske gerade bearbeitet hast und zu speichern versuchst.
    Das beantwortet auch gleich deine aktuelle Frage, wie du an die ID eines Datensatzes rankommst. Das ist eben die Methode getId(). Alle diese Methoden findest Du übrigens im Verzeichnis /data/codegenerator/bosrc/. Dort befinden sich dann die Objektdarstellung für alle deine definierten Entitäten, also lauter .java-Dateien. Die getId()-Methode kommt aus der AbstractBusinessObject, also nicht wundern,falls Du die in den java-Dateien nicht findest.

    Gruß
    Frank

    #8213
    Franz Holzer
    Teilnehmer

    Hallo Frank,

    Meine BOs heissen natürlich ganz anderst.
    Natürlich wurde dein Beispiel bei mir angepasst… verrückt das du glaubst ich füge dein Beispiel 1zu1 ein .. ^^
    Das war auch nicht der Fehler.

    Die ID im Code auzulesen war auch nicht das Problem.
    Ich wollte eher die ID vom Monitor ablesen um sie weiter zuverwenden.
    Sprich wie in meiner Frage dazu, woher kommt die Nummer/Zahl.
    Artikel myArticle = QueryProvider.getById(Artikel.class, 40460000L);

    Sprich woher kommt „40460000L“ bzw. was ist „40460000L“
    Geht ja aus dem Beispiel nicht hervor.

    Gibts es eine möglichkeit eines „printout“ ala Popup in nuclos ?

    Ich werde mir das ganze die Tage nochmals ansehen – hatte nun Krankheits bedingt eine kurze Nuclos auszeit 😉

    Edit:

    Kurzform des Codes:

    Spieler= Statusmodell BO
    Kontakt= unterformular
    Attribut Spieler (in Kontakt) ist ein Referenzfeld auf Spieler.


    Spieler boSpieler = context.getBusinessObject(Spieler.class);

    //Vorname und Nachname in Variable speichern
    String vorname = boSpieler.getVorname();
    String nachname = boSpieler.getNachname();
    //kontakt info
    String kontaktinfo = boSpieler.getKontaktinfo();
    //Frist Datum auslesen und neu formatieren
    SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy");
    String frist = df.format(boSpieler.getKontaktfrist());

    Kontakt newKontaktnotiz = new Kontakt();
    Spieler mySpieler = QueryProvider.getById(Spieler.class, boSpieler.getId());

    newKontaktnotiz.setSpieler(mySpieler.getId());
    newKontaktnotiz.setNotiz(kontaktinfo);

    boSpieler.insertKontakt(newKontaktnotiz);
    }
    }

    Bringt

    cannot find symbol, symbol: method setSpieler(java.lang.Long)

    #8217
    Frank Pavlic
    Teilnehmer

    Hallo,
    Kontakt.Spieler ist eine Referenz, daher müsste der Methodenaufruf newKontaktNotiz.setSpielerId(mySpieler.getId()) heißen.
    Das ist in meinem ungetesteten Beispiel auch falsch, abpos.setAngebotId(Angebote.getId()) muss es heissen.

    Falls Du die Tomcat-Logs nicht scheust, gib deine Debug-Ausgaben einfach per System.out.println(…) aus 🙂

    Gruß
    Frank

    #8218
    Franz Holzer
    Teilnehmer

    Danke Frank,

    das wars.
    Das ganze funktioniert zwar noch nicht – aber der Compiler zickt nicht mehr rum 🙂

    Hab 2 regeln bei einem Status wechsel.
    Email versenden und in einem Unterformular was eintragen.

    die mail wird versendet, im Unterformular tut sich aber nichts.

    In de Log Files (catalina.out und server.log von nuclos) sehe ich aber beide dinge nicht.

    Vermutlich noch eine Debug Level einstellung ?

    #8220
    Frank Pavlic
    Teilnehmer

    Hallo,
    System.out.println ist eigentlich unabhängig von Debug-Levels, komisch, dass Du nichts in catalina.out siehst.
    Frage: hast Du mal in der DAtenbank direkt reingeschaut, ob auch wirklich nichts angelegt wurde? Vielleicht zeigt Dir nuclos nur nichts an, weil das entsprechende Referenzfeld leer ist. So ein Phänomen hatte ich auch schon gehabt.

    Warum deine Unterformular-Regel nicht geht, ist schwierig zu sagen, wenn kein Code gepostet wird 😉 . Siehst Du in den server-Logs Einträge wie „Regel so_und_so wird gestartet“, konkret, die eine Regel, welche im Unterformular einen neuen Datensatz anlegt?

    Gruß
    Frank

    #8223
    Franz Holzer
    Teilnehmer

    Hallo Frank.

    Ich bekomme bei dem Status wechsel nur ein
    2015-02-06 11:18:32,623 INFO [org.nuclos.server.common.NuclosRemoteInvocationExecutor] - client invocation of RemoteInvocation: method name 'changeStateByUser'; parameter types [org.nuclos.common.UID, java.lang.Long, org.nuclos.common.UID, java.lang.String] on org.nuclos.server.statemodel.ejb3.StateFacadeBean@7e632e98 took 298 (276) ms

    es wird aber eine Mail versendet (Regel)

    Die Regeln werden vorher bzw beim speichern geladen:


    INFO [org.nuclos.server.customcode.codegenerator.NuclosJavaCompiler] - Execute Java compiler for source files: {benachrichtigunguser.java=PlainCG[code=org.nuclet.gig.benachrichtigunguser], kontaktnotizEintragen.java=PlainCG[code=org.nuclet.gig.kontaktnotizEintragen], NeuerBlickfeldSpieler.java=PlainCG[code=org.nuclet.gig.NeuerBlickfeldSpieler], test.java=PlainCG[code=org.nuclet.gig.test]}

    System.out.println seh ich keines in den logs.

    den Code zur regel habe ich eigentlich schon gepostet.

    package org.nuclet.gig;

    import org.nuclos.api.rule.StateChangeFinalRule;
    import org.nuclos.api.context.StateChangeContext;
    import org.nuclos.api.provider.StatemodelProvider;
    import org.nuclos.api.annotation.Rule;
    import org.nuclos.api.exception.BusinessException;
    import org.nuclos.api.provider.BusinessObjectProvider;
    import org.nuclos.api.provider.QueryProvider;
    import java.text.SimpleDateFormat;

    /** @name
    * @description
    * @usage
    * @change
    */
    @Rule(name="kontaktnotizEintragen", description="kontaktnotizEintragen")
    public class kontaktnotizEintragen implements StateChangeFinalRule {
    public void changeStateFinal(StateChangeContext context) throws BusinessException {

    Spieler boSpieler = context.getBusinessObject(Spieler.class);

    //kontakt info
    String kontaktinfo = boSpieler.getKontaktinfo();
    //Frist Datum auslesen und neu formatieren
    SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy");
    String frist = df.format(boSpieler.getKontaktfrist());

    Kontakt newKontaktnotiz = new Kontakt();
    Spieler mySpieler = QueryProvider.getById(Spieler.class, boSpieler.getId());

    newKontaktnotiz.setSpielerId(mySpieler.getId());
    newKontaktnotiz.setNotiz("kontaktinfo");

    boSpieler.insertKontakt(newKontaktnotiz);
    System.out.println("TEST OUTPUT");
    }
    }

    bezüglich referenzfeld – wie meinst du das ?
    newKontaktnotiz.setSpielerId(mySpieler.getId());

    sollte doch den aktuellen „Spieler“ (Datensatz im BO Spieler) auslesen – damit die Kontaktnotiz zum richtigen Datensatz zugeordnert wird ?

    Das mit direkt in der Datenbank nachsehen mache ich nun.

    lg und danke für dein Hilfe !!

    #8225
    Frank Pavlic
    Teilnehmer

    Hallo,
    da Du das Interface StateChangeFinalRule verwendest, musst Du in deiner Regel noch explizit sagen, dass dein neueer Datensatz gespeichert wird, also BusinessObjectProvider.insert(newKontaktNotiz);

    müsste dein Problem lösen.

    mySpieler kannst Du dir übrigens in deiner Regel sparen, boSpieler hast Du doch bereits.

    Gruß
    Frank

    #8227
    Franz Holzer
    Teilnehmer

    Danke Frank.

    Top.
    Funktioniert.

    #8809
    Dieter Mennig
    Teilnehmer

    Hallo zusammen,

    ich habe gerade ein ähnliches Problem. Ich möchte auch bei der Neuanlage eines BO automatisch einen Datensatz in ein Unterformular einfügen. Dazu habe ich mir eine Regel (serverseitig) geschrieben (Event Anlegen), die auch funktioniert. Es ist nur so, dass der Datensatz erst dann in das Unterformular geschrieben wird, wenn ich das BO speichere. Ich möchte aber, dass der Datensatz im Unterformular eingefügt wird, wenn ich auf „Neuen Datensatz erfassen“ klicke, also das BO noch nicht gespeichert ist.

    Bezogen auf das Beispiel im Wiki (http://wiki.nuclos.de/pages/viewpage.action?pageId=819878) heißt das: Wenn ich eine neue Bestellung erzeuge (also nachdem ich auf „Neuen Datensatz erfassen“ geklickt habe) soll die Bestellposition sofort in das Unterformular geschrieben werden.

    Wie kann ich das erreichen? Es wäre schön, wenn hier jemand helfen könnte.

    Danke sehr.

    #8812
    Franz Holzer
    Teilnehmer

    soweit ich weiß funktioniert das so nicht – erst beim speichern.

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