Home Forum Nuclos Entwicklung Makros und Regeln getDependants von MasterDataVO

Ansicht von 14 Beiträgen - 1 bis 14 (von insgesamt 14)
  • Autor
    Beiträge
  • #3900
    Markus Glitzner
    Teilnehmer

    Hallo!

    Wie kann ich in einer Regel ein Subform ansprechen, das eine Relation auf ein übergeordnetes Subform hat?

    Ich brauche also die MasterDataVO Colelction von einem MasterDataVO Object.

    Mein Beispielcode funktioniert leider nicht:
    Collection collmdvo = null;
    Collection
    collmdvo2 = null;

    collmdvo = server.getDependants("subform1");
    for(MasterDataVO mdvo : collmdvo) {
    collmdvo2 = server.getDependants("subform2");
    for(MasterDataVO mdvo2 : collmdvo2) {
    mdvo2.setField("fieldname", value);
    }
    }

    #3906
    Markus Glitzner
    Teilnehmer

    gibts hierzu schon eine Lösung?

    #3907

    Hallo Hugo,

    ich habe jetzt leider kein Beispiel vorliegen bei mir, aber das getDependants geht immer auf das „darunterliegende“ Objekt. Wenn du also getDependants aufrufst um die Daten zu bekommen die in einer abhängigen Subform liegen funktioniert das nicht, weil die abhängige Subform nur an der übergeordneten Subform hängt.
    Ich hoffe das ist so verständlich, was ich damit sagen möchte ist:
    Wenn du die Daten haben möchtest von der abhängigen Subform musst du die Dependants indem du die ID von dem Subformdatensatz der übergeordneten mitgibst.

    Ich habe im Wiki kurz geschaut, das hier wäre dir glaube ich eine Hilfe:
    Nuclos Wiki – Geschäftsregeln

    Ich hoffe das hat dir geholfen, falls noch was unklar sein sollte meldest du dich einfach nochmal.

    #3908
    Markus Glitzner
    Teilnehmer

    Hallo!

    Auf das mit der Id der übergordneten Subform hätt ich auch schon getippt, nur ist mir nicht klar wie ich zu der Id komme. Für mich ist das weder in der Wiki, noch in der Api Referenz ersichtlich. Ich vermute aber, dass die iObjectId damit gemeint ist, nur wie bekomme ich die vom aktuellen Objekt?

    Mein generelles Problem ist, dass in der Api Referenz zwar viele Funktionen stehen, doch wie man diese wann und wo und in welchen Zusammenhang aufruft, sieht man nicht. Es ist für mich kein logischer Zusammenhang erkennbar.

    Schöne Grüße

    #3909

    Hallo Hugo,

    das sollte wie folgt funktionieren:

    for(MasterDataVO mdvo : collmdvo) {
    collmdvo2 = mdvo.getDependants().getValues("subform1");

    for(MasterDataVO mdvo2 : collmdvo2) {
    String value = mdvo2.getField("fieldname", String.class);
    }
    }

    Also du holst dir die Daten von dem ersten Subform und dann holst du von dem Einzeldatensatz des ersten Subform dir wieder die abhängigen Daten aus dem anderen.

    Hoffe das hilft dir weiter…

    #3910
    Markus Glitzner
    Teilnehmer

    ja, danke hilft schon ungemein weiter.

    Das einzige Problem was ich jetzt noch habe, setField fuktioniert bei mdvo2 nicht. Ich bekomme keine Werte in die Felder.

    Und noch ein Problem was ich habe ist, dass beim löschen eines Datensatzes im 2. Subform, also bei dem mit einem Übergeordneten Subform, der gelöschte Datensatz in der Regel erst beim 2. mal speichern verschwindet. Beim Hinzufügen ist der neue Datensatz in der Regel wie gewohnt bereits beim ersten mal Speichern da.

    Collection collmdvo = server.getDependants("Auftragsposition");
    for(MasterDataVO mdvo : collmdvo) {
    Collection collmdvo2 = mdvo.getDependants().getValues("Auftragsartikel");

    Integer i = 0;

    for(MasterDataVO mdvo2 : collmdvo2) {
    String value = mdvo2.getField("art", String.class);
    mdvo2.setField("artikelcode", value); //funktioniert nicht
    mdvo2.setField("bezeichnung", "test"); //funktioniert nicht
    i++;
    }

    //Anzahl der Artikel im SubSubform wird erst beim 2. mal speichern richtig angezeigt!!!
    mdvo.setField("position", i.toString());
    }

    #3913
    Markus Glitzner
    Teilnehmer

    So, bin wieder einen Schritt weiter. Um Werte im 2. Subform zu schreiben, muss erst setField aufgerufen werden und dann setValues.

    Collection collmdvo = server.getDependants("Auftragsposition");
    for(MasterDataVO mdvo : collmdvo) {
    Collection collmdvo2 = mdvo.getDependants().getValues("Auftragsartikel");

    Integer i = 0;

    for(MasterDataVO mdvo2 : collmdvo2) {
    //hier rein kommt man nur, wenn vorher mit der Maus ein
    //Datensatz im 2. Unterformular angeklickt wurde. Ist zu
    //beachten, wenn Werte in mdvo aus mdvo2 berechnet werden!!!
    mdvo2.setField("bezeichnung", "test");
    i++;
    }

    //hiermit werden die Werte in mdvo gespeichert
    mdvo.getDependants().setValues("Auftragsartikel", collmdvo2);

    //nur wenn collmdvo2 durchlaufen wurde ...
    if (i>0) {
    mdvo.setField("position", i.toString());
    }
    }

    Ein Problem bleibt aber immer noch. Wenn ein Datensatz im 2. Subform gelöscht wird, dann wird er in der Regel immer noch beim Durchlaufen der collection angezeigt als wäre er noch nicht gelöscht. Kann ich das abfragen. Hab im source code nichts dergleichen wie z.B: isDeleted() gefunden.

    Hugo

    #3914
    Markus Glitzner
    Teilnehmer

    jetzt hab ich auch mein letztes Problem lösen können.

    mit mdvo2.isRemoved() kann geprüft werden, ob der Datensatz im 2. Unterformular in der Eingabemaske gelöscht wurde.

    #3915

    Hallo,

    wenn ich das so richtig verstehe haben sich alle Probleme gelöst?

    #3916
    Markus Glitzner
    Teilnehmer

    nein, leider doch noch nicht ganz.

    Wenn in der Eingabemaske im abhängigen Unterformular ein Datensatz hinzugefügt wird und gleichzeitig wieder gelöscht wird, dann ist der Datensatz nach dem Speichern wieder da, wird also nicht gelöscht.

    Das tritt aber nur auf, wenn ich mit mdvo.getDependants().setValues("Auftragsartikel", collmdvo2); die Änerungen im 2. Unterformular schreiben will. Führe ich diese Zeile Code nicht aus, wird der neu hinzugefügte und gleichzeitig gelöschte Datensatz erst gar nicht gespeichert.

    das isRemoved Flag ist richtig gesetzt, ich bekomm aber das gelöschte mdvo nicht aus der Collection raus.

    #3917

    Hallo,

    wenn ich das richtig in Erinnerung habe dann darf der gelöscht markierte Datensatz nicht in die Collection mit aufgenommen werden.
    Wenn er in der Collection zum Zeitpunkt des Speicherns enthalten ist wird er in die DB geschrieben…

    #3919
    Markus Glitzner
    Teilnehmer

    aber wie bekomm ichs aus der collection raus, wenns schon drinnen ist.

    mdvo2 = null und collmdvo2.remove(mdvo2) führen beim Speichern zu einer null exception

    #3931

    Hallo,

    wenn ich mich recht erinnere war es nicht möglich ein MD VO aus der Collection zu entfernen.
    Was da zu machen ist wäre eine neue Collection erstellen, diese dann mit den zu speichernden Datensätzen füllen (und die die entfernt werden sollen nicht einfügen).

    Ich habe leider kein Beispiel dazu, aber ich meine das war so.
    Hoffe das hilft weiter.

    #3932
    Markus Glitzner
    Teilnehmer

    hilft leider nicht recht weiter. Diese Idee habe ich auch schon gehabt, hat aber nicht funktioniert, kam immer ein Fehler. Vielleicht war auch mein der Code falsch.

    Aber jetzt mal anders gefragt, es kann doch nicht sein, dass das noch nie jemand benötigt hat? Es dürfte aber mit den Untergeordneten Subforms sowie so noch einige Probleme geben, da beim Blättern zwischen den Datensätzen auch dann Elemente im untergeordneten Subform angezeigt werden, obwohl im Übergeordenten gar keine Elemente drinnen sind.

    Muss mir jetzt eine andere Lösung einfallen lassen, kann mich nicht ewig damit beschäftigen.

    Gruß Hugo

Ansicht von 14 Beiträgen - 1 bis 14 (von insgesamt 14)