Home › Forum › Nuclos Entwicklung › Makros und Regeln › Neue Zeilen in Unterformular hinzufügen
- Dieses Thema hat 16 Antworten und 4 Teilnehmer, und wurde zuletzt aktualisiert vor 6 Jahre, 11 Monaten von
Anonym.
-
AutorBeiträge
-
1 Februar 2015 um 14:59 Uhr #8186
Franz Holzer
TeilnehmerWie hier beschrieben:
http://wiki.nuclos.de/pages/viewpage.action?pageId=327852gibt es hier auch eine Hilfe zu der neuen API ?
Finde dazu leider nichts.lg
2 Februar 2015 um 03:37 Uhr #8195Frank Pavlic
TeilnehmerHi,
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ß
Frank2 Februar 2015 um 21:41 Uhr #8199Franz Holzer
Teilnehmerdanke 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 🙂
3 Februar 2015 um 03:53 Uhr #8200Martin Rithos
TeilnehmerHier 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;3 Februar 2015 um 12:32 Uhr #8202Franz Holzer
TeilnehmerIch 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
3 Februar 2015 um 14:00 Uhr #8206Frank Pavlic
TeilnehmerHallo,
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ß
Frank5 Februar 2015 um 18:38 Uhr #8213Franz Holzer
TeilnehmerHallo 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)
6 Februar 2015 um 10:05 Uhr #8217Frank Pavlic
TeilnehmerHallo,
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ß
Frank6 Februar 2015 um 13:05 Uhr #8218Franz Holzer
TeilnehmerDanke 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 ?
6 Februar 2015 um 14:23 Uhr #8220Frank Pavlic
TeilnehmerHallo,
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ß
Frank6 Februar 2015 um 14:37 Uhr #8223Franz Holzer
TeilnehmerHallo 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 !!
6 Februar 2015 um 15:05 Uhr #8225Frank Pavlic
TeilnehmerHallo,
da Du das Interface StateChangeFinalRule verwendest, musst Du in deiner Regel noch explizit sagen, dass dein neueer Datensatz gespeichert wird, alsoBusinessObjectProvider.insert(newKontaktNotiz);
müsste dein Problem lösen.
mySpieler kannst Du dir übrigens in deiner Regel sparen, boSpieler hast Du doch bereits.
Gruß
Frank6 Februar 2015 um 20:34 Uhr #8227Franz Holzer
TeilnehmerDanke Frank.
Top.
Funktioniert.26 April 2016 um 01:46 Uhr #8809Dieter Mennig
TeilnehmerHallo 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.
26 April 2016 um 16:24 Uhr #8812Franz Holzer
Teilnehmersoweit ich weiß funktioniert das so nicht – erst beim speichern.
-
AutorBeiträge