Home › Forum › Nuclos Entwicklung › Makros und Regeln › Regel Button – neuer Datensatz
- Dieses Thema hat 19 Antworten und 3 Teilnehmer, und wurde zuletzt aktualisiert vor 7 Jahren von
Franz Holzer.
-
AutorBeiträge
-
16 Juli 2015 um 15:26 Uhr #8498
Franz Holzer
TeilnehmerHallo,
Habe wiedermal einen „sonder“ Wunsch.
Unzwar möchte ich in einem BO-A per Button einen Eintrag in einem Anderen BO-B machen.Der schönste weg wäre natürlich direkt.
Dazu habe ich jedoch nichts gefunden.Nun war die idee (der versuch) BO-B in BO-A als Unterformular anzulegen.
Das funktioniert auch soweit bis auf das ich den Fehler:
„Der Datensatz kann nicht erstellt werden (eventuell ist der Schlüssel schon vergeben)“
Und genau da liegt mein Problem.
Wie kann ich Nuclos sagen – vergib eine neue ID ?Der Code zur Regel sieht wie folgt aus:
@Rule(name="newSpielerButton", description="test")
public class newSpielerButton implements CustomRule {
public void custom(CustomContext context) throws BusinessException {
//BO Spieler in Variable bo laden
//Spieler bospieler = context.getBusinessObject(Spieler.class);
Scouting boscouting = context.getBusinessObject(Scouting.class);//Vorname und Nachname in Variable speichern
String newvorname = boscouting.getVorname();
String newnachname = boscouting.getNachname();
Date newjahrgang = boscouting.getJahrgang();// Neuen Spieler generieren und eintragen
Spieler newSpieler = new Spieler();
newSpieler.setVorname(newvorname);
newSpieler.setNachname(newnachname);
newSpieler.setJahrgang(newjahrgang);
newSpieler.setKontaktinfo("test");boscouting.insertSpieler(newSpieler);
BusinessObjectProvider.insert(newSpieler);
}
}
Das ganze soll eine Art „Schnell Anlage“ sein weil man im BO-A genau diesen „Spieler“ als Referenz angeben muss.
Sollte es diesen Spieler nicht geben – könnte man somit „schnell“ den Spieler mit den nötigsten Daten anlegen ohne im unterformular rumzuwerken (viel zuviele Einträge – langes scrollen) und ohne in das andere BO-B wechseln zu müssen.
lg,
Franz16 Juli 2015 um 16:05 Uhr #8500Frank Pavlic
TeilnehmerHallo Franz,
klar kannst du das per Button zum „Direkt anlegen“ lösen. Regel programmieren, welche den Spieler neu anlegt. Anschließend den Button als Regelbutton mit der neu erstellten Regel konfigurieren.
Alternativ kannst Du auch einen Arbeitsschritt anlegen, Quellentität=Scouting, Zielentität=Spieler, Felder zuordnen, fertig. Kommst Du sogar ohne Programmierung aus.
Anschließend den Button als Arbeitschritt-Button mit dem neu erstellten Arbeitsschritt konfigurieren.Gruß
Frank24 September 2015 um 19:21 Uhr #8529Franz Holzer
TeilnehmerMit dem Objektgenerator bin ich gescheitert – aus dem grund das der Button erst aktiv ist nachdem der Datensatz einmalig gespeichert wurde.
Ich kann erst Speichern nachdem ich den Button verwendet habe, den dieser legt mir einen Datensatz an welchen ich danach wiederrum für ein Plfichtfeld zur auswahl habe.Mit der Regel hab ich auch Probleme.
Es scheint als will er mit keine ID generieren.Fehler: „Der Datensatz konnte nicht erstellt werden (eventuell ist der schlüssel schon vergeben)“
hier mal der code – ich dachte so sollte das funktionieren.
Scouting boscouting = context.getBusinessObject(Scouting.class);//Vorname und Nachname in Variable speichern
String newvorname = boscouting.getVorname();
String newnachname = boscouting.getNachname();
Date newjahrgang = boscouting.getJahrgang();// Neuen Spieler generieren und eintragen
Spieler newSpieler = new Spieler();newSpieler.setVorname(newvorname);
newSpieler.setNachname(newnachname);
newSpieler.setJahrgang(newjahrgang);
newSpieler.setKontaktinfo("test");boscouting.insertSpieler(newSpieler);
BusinessObjectProvider.insert(newSpieler);
}
}Ich denke ich brauch was in die richtung oder ?
newSpieler.setSpielerId(newId());
funktioniert leider nicht – is nun nur ein wunschdenken von mir
30 September 2015 um 13:19 Uhr #8537Frank Pavlic
TeilnehmerHallo Franz,
folgende Zeilen hast Du in deinem Code drin:
boscouting.insertSpieler(newSpieler);
BusinessObjectProvider.insert(newSpieler);
Das macht aber keinen Sinn.
So wie ich das lese, legst du einen neuen Datensatz „newSpieler“ über das Business Objekt „Scouting“ an,wenn Du so willst als Eintrag im Unterformular. Anschließend willst Du aber newSpieler über das Business Objekt „Spieler“ anlegen, und da hat nuclos Recht – der Schlüssel ist bereits vergeben.
Folgendes müsste gehen:
/*Annahme: Referenzfeld von Spieler auf Scouting heisst "Scouting".
*/
newSpieler.setScoutingId(boscouting.getId());
BusinessObjectProvider.insert(newSpieler);
Gruß
Frank30 September 2015 um 15:56 Uhr #8538Franz Holzer
TeilnehmerDanke Frank für deine Unterstützung !!!
aber da war ich schon.
Aber du hast recht – das ist/war ein Denkfehler.Mein Referenzfeld von Spieler auf Scouting heisst „Scouting“.
Und von Scouting auf Spieler heisst „Spieler“.Somit müsste
newSpieler.setScoutingId(boscouting.getId());
BusinessObjectProvider.insert(newSpieler);
richtig sein.
Jedoch bekomme ich dann auch oben besagten Fehler.
(eventuell existiert der Schlüssel schon)———–
Ich verstehe
boscouting.getId()
auch nicht ganz.
Welche ID liest er den dann aus ?
Ist die einmalig ?
Darum war eben mein gedanke auf „newId“.Weil ich mache das ganze ja nicht in einem bestehenden Datensatz.
Sondern ich möchte einen neuen anlegen, stelle fest – ich kann keinen neuen anlegen da der Spieler fehlt und will auf der selben Maske die „schnell anlage“ nutzen.
Somit gibt es ja noch keine ID da der datensatz nicht gespeichert ist.
Sehe ich das richtig ?
———–
Update: es geht auch in einem gespeichert Datensatz nicht.
Selber fehler … wo liegt mein Denkfehler ….30 September 2015 um 19:47 Uhr #8539Frank Pavlic
TeilnehmerHallo Franz,
hänge doch mal deine server.log an,nachdem der Fehler aufgetreten ist, aber bitte die gesamte Datei und nicht nur einen Auszug. Da müsste es drin stehen.Gruß
Frank30 September 2015 um 19:55 Uhr #8540Franz Holzer
TeilnehmerHallo Frank,
Siehe anhang.
Ich kann leider nichts (für mich schlüssiges) entdecken.
Danke für deine Mühe im vorfeld !*Update*
Ich seh grad das ist nicht die gesamte log.
Muss ich noch eben umstellenUpdate 2:
keinen plan wie ich ihm das “ … 95 more“ abgewöhne.
hab mich an
http://wiki.nuclos.de/display/Administration/SQL+Logging
gehalten.lg
Attachments:30 September 2015 um 21:04 Uhr #8541Franz Holzer
TeilnehmerDas Log File hat mich doch auf eine Spur gebracht.
[FieldValidationError [entity=imvoS603ljrn3vdrMV1b, field=OHUjtNJS1qe2GIA7knZL,
und habe nachgesehen, und ich habe tatsächlich ein Pflichtfeld vergessen !
Jedoch funktioniert das ganze noch immer nicht.
Nun kommt der Fehler (mitten am Bildschirm):Scouting mit id kann nicht gefunden werden
Wenn ich das ganze nun aber in einem gespeicherten Datensatz machen funktioniert es !!!
Jedoch ist dies nicht das Ziel.
Somit scheiter ich wieder an meiner Ausgangsvermutung das mein Code (getID) in einem nichtgespeicherten Datensatz nicht funktioniert.
Annahme – nicht gespeichert -> kein id zum auslesen.Vorschläge ?
ein setNewId oder getMaxId (+1) wär halt hilfreich …
1 Oktober 2015 um 00:00 Uhr #8544Frank Pavlic
TeilnehmerHallo Franz,
prima, erster Fehler gefunden. Jetzt kannst Du in der CustomRule folgendes tun.Jetzt bräuchte ich noch einmal deine server.log, nachdem du den Fehler reproduziert hast, bitte wieder komplett.
Gruß
Frank1 Oktober 2015 um 10:39 Uhr #8548Franz Holzer
Teilnehmer1 Oktober 2015 um 15:00 Uhr #8554Frank Pavlic
TeilnehmerHallo Franz,
leider ist immer noch eine ValidationException vorhanden:
Caused by: CommonValidationException [getMessage()=common.exception.novabitvalidationexception, errors=[], fielderrors=[FieldValidationError [entity=agj3WZWg34V1CXRKrmvw, field=TFwiFwivwzy1CxtzoMuD, message=CollectableUtils.3 {R40001390}]]]
Das musst Du noch lösen.
Gruß
Frank1 Oktober 2015 um 21:09 Uhr #8556Franz Holzer
Teilnehmerkann ich nicht finden.
Verstehe auch nicht warum der Validierungsfehler auftreten soll wenn der Datensatz nicht gespeichert ist aber nicht auftritt wenn er gespeichert ist.Kann daher nicht nachvollziehen woher das kommen soll.
kann man
[entity=agj3WZWg34V1CXRKrmvw, field=TFwiFwivwzy1CxtzoMuD
noch iwie entschlüsseln ?
anbei nochmal die serverlog – aber frisch.
Nicht das der validierungs fehler von gestern war.————-
Ich glaube ich habs.
Also es gibt ein Plfichtfeld auf der Maske Scouting.
Dieses Feld ist aber so lange leer bis ich mit der schnell anlage einen neuen „Spieler“ angelegt habe – um ihn wiederum in diesem Pflichtfeld auswählen zu können (is übrigends die Refernz auf bospieler)Sprich das ist der Sinn des ganzen – Pflichtfeld kann nicht ausgefüllt werden – da Spieler nicht vorhanden, um ihn schnell anzulegen (Nur Name) habe ich auf der Maske eben die „schnell anlage“ gemacht.
Fülle ich dieses Feld nun mit einem XY Namen welchen es bereits in der DB gibt aus – funktioniert auch meine „schnell anlage“
das ist aber überhaupt nicht so gewollt bzw. macht so keinen sinn.
Warum macht nuclos das ?
Wie kann ich es umgehen?——————
Update 2:Habe nun testweise dieses Pflichtfeld entfernt (hacken Plfichtfeld entfernt)
Nun funktioniert es.Würde ich nun als Workaround ansehen.
Aber eigentlich hätte ich diese Feld schon gern als Pflichtfeld drin.Warum überprüft er überhaupt dieses Feld ?
Attachments:3 Oktober 2015 um 23:44 Uhr #8560Ramin Goettlich
TeilnehmerDer aktuelle Regelcode nach diesem Thread wäre interessant, wie sieht der nun aus.
Fest steht jedenfalls, und die bisherigen Fehler scheinen darauf hinzudeuten, dass genau das hier das Problem ist:
.getId() liefert immer null zurück, solange der Datensatz nicht gespeichert ist. Die ID wird erst beim Speichern durch die Datenbank gesetzt (durch die Sequenz IDFACTORY), daher schlägt das hier fehl, solange boscouting ungespeichert ist:
newSpieler.setScoutingId(boscouting.getId());
BusinessObjectProvider.insert(newSpieler);Um eine Alternative vorschlagen zu können, müsste die Anforderung etwas genauer geschildert werden.
5 Oktober 2015 um 20:00 Uhr #8565Franz Holzer
TeilnehmerHallo nuclosian,
Bisher dachte ich auch das dein beschriebenes Szenario schuld ist.
Dem ist aber nicht so.Es funktioniert soweit nun ohne Probleme.
(Ausführung in ungespeichertem Datensatz)Jedoch wenn ich auf der Maske ein Pflichtfeld habe – funktioniert es nicht.
Obwohl das Pflichtfeld nichts mit meiner Regel, bzw mit dem anlegen des Datensatzes zu tun hat.
der Code:
/** @name notifyFromBlickfeld
*/package org.nuclet.gig;
import java.text.SimpleDateFormat;
import org.nuclos.businessentity.*;
import org.nuclos.api.rule.CustomRule;
import org.nuclos.api.context.CustomContext;
import org.nuclos.api.annotation.Rule;
import org.nuclos.api.exception.BusinessException;
import org.nuclos.api.mail.NuclosMail;
import org.nuclos.api.provider.MailProvider;
import org.nuclos.api.User;
import org.nuclos.api.provider.QueryProvider;
import org.nuclos.api.provider.BusinessObjectProvider;
import org.nuclos.api.businessobject.Query;
import java.util.Date;@Rule(name="newSpielerButton", description="test")
public class newSpielerButton implements CustomRule {
public void custom(CustomContext context) throws BusinessException {
//BO Spieler in Variable bo laden
//Spieler bospieler = context.getBusinessObject(Spieler.class);
Scouting boscouting = context.getBusinessObject(Scouting.class);//Vorname und Nachname in Variable speichern
String newvorname = boscouting.getVorname();
String newnachname = boscouting.getNachname();
Date newjahrgang = boscouting.getJahrgang();// Neuen Spieler generieren und eintragen
Spieler newSpieler = new Spieler();newSpieler.setVorname(newvorname);
newSpieler.setNachname(newnachname);
newSpieler.setJahrgang(newjahrgang);
newSpieler.setKontaktbetreff("Schnell Anlage von Scout");newSpieler.setScoutingId(boscouting.getId());
BusinessObjectProvider.insert(newSpieler);}
}
Das mit dem Pflichtfeld ist halt ärgerlich bzw. ein Schönheitsfehler momentan.
6 Oktober 2015 um 00:17 Uhr #8566Ramin Goettlich
TeilnehmerDas kann ich nicht nachvollziehen, sicher ist auf jeden Fall: Wenn der Datensatz nicht gespeichert ist, hat die Zeile
newSpieler.setScoutingId(boscouting.getId());
nicht den gewünschten Effekt, denn boscouting.getId() liefert erst nach dem Speichern einen Wert != null.Das führt natürlich nur dann auch zu einem Fehler, wenn ScoutingId im Spieler ein Pflichtfeld ist…
-
AutorBeiträge