Home › Forum › Nuclos Konfiguration › Businessprozesse › Arbeitsschritt – Unterformulare verknüpfen
- Dieses Thema hat 10 Antworten und 4 Teilnehmer, und wurde zuletzt aktualisiert vor 10 Jahre, 10 Monaten von
Frank Pavlic.
-
AutorBeiträge
-
18 Juli 2012 um 12:00 Uhr #5774
Markus Glitzner
TeilnehmerHallo!
Wie kann ich in einem Arbeitsschritt die einzelnen Datensätze von Unterformularen miteinander verknüpfen? Es gibt keine möglich im Quellattribut auf die intid zuzugreifen.
Momentan mach ich dafür einfach ein zweites Referenzfeld auf die eigene Entität und mittels Trigger ein Update der Referenz, jedoch gefällt mir diese Lösung überhaupt nicht.
Gruß
Hugo18 Juli 2012 um 21:04 Uhr #5775Frank Pavlic
TeilnehmerHallo Hugo,
ganz verstanden habe ich deine Anforderung nicht. Kannst Du mir dein Problem etwas konkreter beschreiben???Gruss
Frank
18 Juli 2012 um 22:05 Uhr #5776Markus Glitzner
TeilnehmerIn einem Arbeitsschritt wird aus einem Auftrag ein Lieferschein erzeugt. Dabei werden auch die Auftragspositionen als Lieferscheinpositionen übernommen. Nun benötige ich in jeder Lieferscheinposition einen Bezug zur Auftragsposition und genau das geht mit Standardmittel nicht.
Gruß
Hugo19 Juli 2012 um 00:30 Uhr #5777Frank Pavlic
TeilnehmerHallo Hugo,
so wie ich das sehe, müsste es folgendermaßen funktionieren.1.
Geschäftsregel anlegen „AUFPOS_LIEFPOS_Verknuepfen“
2.
Der Kern der Funktion ist ja, an die intid der zugehörigen Auftragsposition ranzukommen und das müsste mit folgender Zeile klappen:
Integer auftragsposId = server.getSourceObjectContainerCVO().getGenericObject().getId();… checken ob auftragsposId tatsächlich auch eine Auftragsposition ist
… Lieferscheinposition holen und dort ID-Feld „auftragsposition“ = auftragsposId3.
In Geschäftsregel bei Verwendung Entität „Lieferscheinposition“ und Ereignis „Speichern“ auswählen. Ich denke es müsste auch funktionieren, wenn Du die Regel im Arbeitschritt unter „Auszuführende Regeln“ einrichtest. Aber immer nur eine von beiden Möglichkeiten durchführen . Doppelt hält nicht immer besser B)Gruss
Frank
19 Juli 2012 um 09:13 Uhr #5779Markus Glitzner
TeilnehmerHallo Frank!
Das funktioniert so leider nicht, da ich mit server.getSourceObjectContainerCVO().getGenericObject().getId() nicht die Id der Position, sondern die Id des Auftrags bekomme, da der Arbeitsschritt auch dort ausgelöst wird.
Aber so einen ähnlichen Ansatz hatte ich auch schon, indem ich mir über getDependants und der auftragId die Auftragspositionen geholt habe und danach die Lieferscheinpositionen mit addSubformEntry erstellen wollte. Das ganze funktioniert allerdings nicht wenn der Lieferschein noch nicht gespeichert wurde, da server.getObjectId() 0 zurückgibt und so die Lieferscheinposition keinen Bezug zum Lieferschein haben. „Ausführung im Anschluss“ funktioniert hier auch nicht.
Ich habs jetzt so gelöst, indem ich bei der Auftragsposition ein weiteres Referenzfeld auf sich selbst erstellt habe und hier einfach die intid nochmals speichere. Gefällt mir zwar nicht wirklich, wüsst aber momentan keinen anderen Weg.
Gruß
Hugo19 Juli 2012 um 09:59 Uhr #5780Moritz Neuhaeuser
TeilnehmerHallo,
bei der Problematik muss bedacht werden, dass aus n-Elementen des Auftrags (Quelle) nicht unbedingt n-Elemente(Ziel) entstehen, nämlich dann, wenn eine Gruppierung verwendet wird. D.h. eigentlich hat man keine eindeutige Beziehung Quellunterformulareintrag -> Zielunterformulareintrag.Wenn aber „garantiert wird“, dass aus n Quellunterformulareinträgen mehr oder weniger n Zielunterformulareinträge entstehen hilft vielleicht folgendes snippet weiter (nicht getestet):
final List colSrcDependants = server.getSourceObjectContainerCVOs().iterator().next().getDependants().getData("Auftragsposition");
final List colTgtDependants = server.getRuleObjectContainerCVO().getDependants().getData("Lieferscheinposition");
int idx = 0;
for (final EntityObjectVO evoTgt: colTgtDependants) {
final EntityObjectVO evoRelatedTgt = colSrcDependants.get(idx);
evoRelatedTgt.getFieldIds().put("Auftragsposition", evoTgt.getId());
evoRelatedTgt.flagNew();
idx++;
}// Das ist ein Workaround, leider hat es keine Wirkung wenn nur die EntityObjectVO's angepasst werden, hier werden die Dependants(EntityObjectVO) zu Dependants(MasterDataVO)
final Collection colResult = new HashSet();
for (final EntityObjectVO evoTgt: colTgtDependants) {
colResult.add(DalSupportForMD.wrapEntityObjectVO(evoTgt));
}Es werden alle Quellunterformulareinträge und alle Zielunterformulareinträge jeweils in eine Liste ausgelesen. Jeder Zielunterformulareintrag mit index n bekommt die Referenz des entsprechenden Indexes aus den Quellunterformulareinträgen.
Besser wäre es hier eine Referenzlogik einzubauen z.B. Referenz wenn Artikel aus Quelle mit Artikel aus Ziel übereinstimmt, dies könnte natürlich auch über mehrere Felder geschehen.19 Juli 2012 um 10:22 Uhr #5781Markus Glitzner
TeilnehmerDie Idee hatte ich auch schon, nur fehlte mir ein snippet dazu, danke.
Bei dieser Vatiante darf halt nix „schief“ gehen, da sonst unter bestimmten Umständen ev. ein falscher Bezug gesetzt wird.
Eine Gruppierung wird in unserem Fall nicht gemacht. Ich benötige die Id um auslesen zu können, wieviel von welcher Positionen bereits geliefert wurde (Teillieferung).
Im Arbeitsschritt gibt es ja bei den zu übernehmenden Unterformularen das Flag „Attribute gruppieren“. Ev. könnte man hier ein zweites Flag machen „Zielobjekt mit Quellobjekt verknüpfen“, wobei das eine das andere ausschließen müsste.
Falls von Interesse, hier meine jetzige Umsetzung:
In der Auftragsposition gibt es ein berechnendes Attribut, welches die Menge der einzelnen Lieferpositionen summiert, die auf die jeweilige Auftragsposition referenzieren. Daraus ergibt sich die Menge der Erst.- bzw. Restlieferung, welche im Arbeitsschritt für die Lieferung übernommen wird. Somit kann ich problemlos Teillieferungen ralisieren und wenn sich die Ursprungsmenge in der Auftragsposition erhöht (was öfters mal vorkommt), ändert sich auch automatisch die Restmenge für die (nächste) Lieferung.Gruß
Hugo19 Juli 2012 um 12:26 Uhr #5782Frank Pavlic
TeilnehmerHallo mneuhaeuser,
guter Einwand, Gruppierung habe ich dabei komplett ignoriert, da ich es noch nie benötigte :whistle: . Danke für die Erklärung und vor allem Code, werden sicher noch weitere Personen davon profitieren.Was wäre ein sinnvoller Anwendungsfall für die Attribute-Gruppierung ?
Gruß
Frank
19 Juli 2012 um 12:26 Uhr #5783Frank Pavlic
TeilnehmerHallo Hugo,
danke Dir für deine Lösung und Erklärung.Gruß
Frank
19 Juli 2012 um 12:44 Uhr #5784Ramin Goettlich
TeilnehmerAnwendungsfälle für eine Gruppierung sind z.B.
a) Sammelrechnung für mehrere Aufträge, dabei Gruppierung nach Artikeln o.ä.
b) Generierung Bestellvorschläge aus Artikeln (Arbeitsschritt, der aus Artikeln je Hauptlieferant eine Bestellung generiert, d.h. nach Hauptlieferant der Artikel gruppiert).Anmerkung: Wir werden für „Arbeitsschritt“ zukünftig den Terminus „Generator“ verwenden, weil er erklärender ist. Diese Umbenennung wird sich bald auch in Nuclos wiederspiegeln.
19 Juli 2012 um 14:26 Uhr #5785Frank Pavlic
TeilnehmerDanke nuclosian für die Infos.
Gruß
Frank -
AutorBeiträge