Home Forum Nuclos Konfiguration Businessprozesse Arbeitsschritt – Unterformulare verknüpfen

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

    Hallo!

    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ß
    Hugo

    #5775
    Frank Pavlic
    Teilnehmer

    Hallo Hugo,
    ganz verstanden habe ich deine Anforderung nicht. Kannst Du mir dein Problem etwas konkreter beschreiben???

    Gruss

    Frank

    #5776
    Markus Glitzner
    Teilnehmer

    In 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ß
    Hugo

    #5777
    Frank Pavlic
    Teilnehmer

    Hallo 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“ = auftragsposId

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

    #5779
    Markus Glitzner
    Teilnehmer

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

    #5780
    Moritz Neuhaeuser
    Teilnehmer

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

    #5781
    Markus Glitzner
    Teilnehmer

    Die 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ß
    Hugo

    #5782
    Frank Pavlic
    Teilnehmer

    Hallo 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

    #5783
    Frank Pavlic
    Teilnehmer

    Hallo Hugo,
    danke Dir für deine Lösung und Erklärung.

    Gruß

    Frank

    #5784
    Ramin Goettlich
    Teilnehmer

    Anwendungsfä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.

    #5785
    Frank Pavlic
    Teilnehmer

    Danke nuclosian für die Infos.

    Gruß
    Frank

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