Home Forum Nuclos Entwicklung Makros und Regeln Regel Button – neuer Datensatz

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

    Hallo,

    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,
    Franz

    #8500
    Frank Pavlic
    Teilnehmer

    Hallo 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ß
    Frank

    #8529
    Franz Holzer
    Teilnehmer

    Mit 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

    #8537
    Frank Pavlic
    Teilnehmer

    Hallo 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ß
    Frank

    #8538
    Franz Holzer
    Teilnehmer

    Danke 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 ….

    #8539
    Frank Pavlic
    Teilnehmer

    Hallo 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ß
    Frank

    #8540
    Franz Holzer
    Teilnehmer

    Hallo 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 umstellen

    Update 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:
    #8541
    Franz Holzer
    Teilnehmer

    Das 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 …

    #8544
    Frank Pavlic
    Teilnehmer

    Hallo 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ß
    Frank

    #8548
    Franz Holzer
    Teilnehmer

    Hi Frank,

    Anbei das Log.

    Attachments:
    #8554
    Frank Pavlic
    Teilnehmer

    Hallo 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ß
    Frank

    #8556
    Franz Holzer
    Teilnehmer

    kann 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:
    #8560
    Ramin Goettlich
    Teilnehmer

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

    #8565
    Franz Holzer
    Teilnehmer

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

    #8566
    Ramin Goettlich
    Teilnehmer

    Das 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…

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