Home › Forum › Nuclos Entwicklung › Makros und Regeln › getDependants von MasterDataVO
- Dieses Thema hat 13 Antworten und 2 Teilnehmer, und wurde zuletzt aktualisiert vor 11 Jahre, 11 Monaten von
Markus Glitzner.
-
AutorBeiträge
-
29 Juni 2011 um 11:08 Uhr #3900
Markus Glitzner
TeilnehmerHallo!
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;
Collectioncollmdvo2 = null; collmdvo = server.getDependants("subform1");
for(MasterDataVO mdvo : collmdvo) {
collmdvo2 = server.getDependants("subform2");
for(MasterDataVO mdvo2 : collmdvo2) {
mdvo2.setField("fieldname", value);
}
}30 Juni 2011 um 11:30 Uhr #3906Markus Glitzner
Teilnehmergibts hierzu schon eine Lösung?
30 Juni 2011 um 11:50 Uhr #3907Hartmut Beckschulze
TeilnehmerHallo 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äftsregelnIch hoffe das hat dir geholfen, falls noch was unklar sein sollte meldest du dich einfach nochmal.
30 Juni 2011 um 12:21 Uhr #3908Markus Glitzner
TeilnehmerHallo!
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
30 Juni 2011 um 13:34 Uhr #3909Hartmut Beckschulze
TeilnehmerHallo 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…
30 Juni 2011 um 14:12 Uhr #3910Markus Glitzner
Teilnehmerja, 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());
}
30 Juni 2011 um 22:13 Uhr #3913Markus Glitzner
TeilnehmerSo, 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
1 Juli 2011 um 09:23 Uhr #3914Markus Glitzner
Teilnehmerjetzt 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.
1 Juli 2011 um 12:25 Uhr #3915Hartmut Beckschulze
TeilnehmerHallo,
wenn ich das so richtig verstehe haben sich alle Probleme gelöst?
1 Juli 2011 um 12:33 Uhr #3916Markus Glitzner
Teilnehmernein, 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.
1 Juli 2011 um 13:05 Uhr #3917Hartmut Beckschulze
TeilnehmerHallo,
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…1 Juli 2011 um 13:37 Uhr #3919Markus Glitzner
Teilnehmeraber 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
4 Juli 2011 um 11:43 Uhr #3931Hartmut Beckschulze
TeilnehmerHallo,
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.4 Juli 2011 um 18:01 Uhr #3932Markus Glitzner
Teilnehmerhilft 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
-
AutorBeiträge