Abarbeitungs-Reihenfolge mittels Combobox festlegen.

  • WPF

Es gibt 51 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Abarbeitungs-Reihenfolge mittels Combobox festlegen.

    Hallo alle zusammen,

    Ich bräuchte mal wieder eure Hilfe….

    Ich hab da eine kleine App die mir helfen soll dringende
    Aufträge zu verwalten.

    Genauer gesagt die „Durchlauf-Reihenfolge“ dieser Aufträge
    auf die verschiedenen „Workcenter“ unserer Werkstatt.

    Es soll also die Reihenfolge festgelegt werden, in welcher
    die Aufträge (in der App handelt es sich um Orders) an einem bestimmten Workcenter
    abgearbeitet werden.

    So ganz einfach ist die ganze Sache doch nicht…..

    · Die Priorität/Reihenfolge (in der App eine
    Integer Zahl) darf immer nur einmal an einem Workcenter vorliegen.

    ·Eine Priorität eines Auftrages muss auch geändert
    werden können.

    ·Wird ein Auftrag einem Workcenter zugeordnet,
    dann sollte diesem Auftrag, auf diesem Workcenter die nächste, noch nicht
    vergebene Priorität zugewiesen werden.

    Wie gesagt diese ganzen Reihenfolgen, der verschiedenen
    Orders auf den verschiedenen Workcenter ist etwas „komplexer“ als ich es mir am
    Anfang vorgestellt hatte.

    Ich hab mir zu diesem Zweck eine kleine „Demo“ angelegt wo
    ich das ganze Testen will bevor ich den neuen Code in die eigentliche App
    übertrage.

    Diese Demo könnt ihr auch runterladen…. wenn Ihr wollt…

    In dieser Demo gibt es ein Datagrid welches eine Paar Orders
    darstellen soll.

    Die zweitletzte Spalte zeigt den Workcenter auf dem der
    entsprechenden Order abgearbeitet werden soll. (in der Demo gibt es 5 davon,
    Workcenter_1 bis Workcentrer_5)

    In der letzten Spalte, ganz rechts, soll dem Order dann mittels
    einer Combobox die Priorität/Reihenfolge auf dem zugeordneten Workcenter
    festgelegt werden.

    In der Demo gibt es zurzeit 5 Prioritäts-Werte, von 1-5
    (Propety: AvailableSequencePositions)

    Und jetzt bräuchte ich einen Code, der beim „öffnen“ der Priority-Combobox,
    nur die noch verfügbaren Prioritäten an dem entsprechenden Workcenter, anzeigen
    würde!

    Das geht bestimmt schön mit Linq, oder so….

    Kann mir da jemand helfen?

    Wie gesagt zur Zeit gibt es noch gar keinen Code in der Demo
    der diese Aufgabe übernimmt….
    Dateien
    Hallo

    Ich kann dir gerne versuchen zu helfen. So ganz blick ich aber noch nicht durch. (Habe das Beispiel jetzt aber auch noch nicht geladen)
    Ich denke vorallem das du hier den Wald vor lauter Bäumen nocht mehr siehst und evtl. falsch denkst.

    Jeiss schrieb:

    Die Priorität/Reihenfolge (in der App eine
    Integer Zahl) darf immer nur einmal an einem Workcenter vorliegen.

    OK, das kann ja gemacht werden indem einfach die Einträge durchlaufen und die Prio abgeändert wird. Nach oben oder nach unten.

    Also es gibt:

    Work 1 mit Prio 3
    Work 5 mit Prio 1
    Work 3 mit Prio 2

    Jetzt füngst du ein Work mit Prio 2 ein. Auf welche Prio kommt nun z.b. Work 3? Prio 1? Wenn ja was machste jetzt mit Work 5. Prio 0 oder -1 oder oder.
    Suboptimal

    Jeiss schrieb:

    Eine Priorität eines Auftrages muss auch geändert
    werden können.

    Selbes "problem".


    Jeiss schrieb:

    In der Demo gibt es zurzeit 5 Prioritäts-Werte, von 1-5
    (Propety: AvailableSequencePositions)

    Spätestens jetzt musst du wissen das das nicht klappen kann.

    Ich verstehe das gewisse Aufträge wichtiger sind als andere, ich kenne die genaue Aufgabenstellung nicht aber ich denke das du hier viel zu viel nachdenkst.
    Im "normalfall" ist es auch in der Produktion (ja ich komme auch aus der Großproduktion) so das wenn möglich Aufträge so abgearbeitet werden wie sie reinkommen. Wer zuerst kommt malt zuerst.
    Das es Ausnahmen gibt ist klar. Deshalb die Prio. Warum aber nicht wirklich eine feste Prio. Eben z.b. 1-5.

    Dann sortierst du alle Aufträge nach zwei Kriterien:

    Kriterium 1: Prio Absteigend
    Kriterium 2: Eingangsdatum

    Oder du hast einen Liefertermin dann würde ich unbedingt eine sortierung mit z.b. verbleibenden Tagen mit reinnehmen.

    Falls du trotzdem an deiner Überlegung festhalten möchtest dann erkläre bitte solche Dinge wie in meinem Beispiel oben, also wie sich das dann verhalten soll und dann können wir ja mal sehen ob uns etwas vernüftiges einfällt.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Jeiss schrieb:

    · Die Priorität/Reihenfolge (in der App eine
    Integer Zahl) darf immer nur einmal an einem Workcenter vorliegen.
    Diese Bedingung verstehe ich nicht.
    Wenn es hier um Abarbeitung einer Vorrang-WarteListe geht, muss selbstverständlich erlaubt und vorgesehen sein, dass mehrere Aufträge mit gleicher Priorität warten. (Die Priorität eines Auftrags kann sich ja nicht danach richten, was andere Aufträge für eine Priorität haben.)
    Bei gleicher Priorität greift sich die Abarbeitung dann den Auftrag mit dem ältesten Eingangsdatum (oder auch ein anderes Kriterium, oder auch Zufall).

    Vorrang-Wartelisten sind eine Standard-Datenstruktur - des Namens: Heap.
    Aber das braucht man nur, wenn um höchste Performance geht. Normal reicht eine Liste, man geht alle Elemente durch, und pickt sich das mit dem höchsten "Rating" raus.

    Aber bei Heap, oder beim genannten AuswahlVerfahren erhält man immer nur das "nächste" Element - keine Übersicht über die weitere Reihenfolge.
    Braucht man so eine Übersicht, so muss man eine VergleichsMethode proggen, die angibt, welches von 2 Elementen als "das grössere" gilt.
    Hat man so eine (Comparison-)Methode kann man jederzeit die Liste nach diesem Kriterium sortieren.

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hallo Sascha, hallo ErfinderDesRades,
    danke, dass ihr mir helfen wollt.

    Zu Beginn möchte ich den Begriff "Priorität" korrigieren...Der war nämlich sehr schlecht gewählt, Sorry!

    Lasst uns lieber über eine "Abarbeitungs-Reihenfolge", oder noch lieber, weil kürzer, einfach nur über eine Reihenfolge diskutieren.

    In meiner kleinen Testdemo, befindet sich ein Datagrid mit einer Auflistung von Aufträgen (im Programm sind das orders).

    Jedem Order wird dann mittels einer ersten Combobox mitgeteilt an welchem Workcenter er abgearbeitet werden soll.
    Mittels einer zweiten Combobox soll dem Order dann die Durchlaufnummer am gewählten Workcenter zugewiesen werden. (ein Zahl von 1-5, was ich vorher Priorität genannt hab)

    So viel zum Prinzip. Die Orders werden einfach nur auf verschiedene Workcenter verteilt und ihnen wird eine Reihenfolg auf diesem Workcenter zugewiesen.
    Folglich kann die zugewiesene Nummer (von 1-5) nur einmal pro workcenter vorkommen. Die Aufträge können die Workcenter nur nacheinander durchlaufen. Es können auf dem gleichen Workcenter keine 2 Aufträge gleichzeitig abgearbeitet werden!
    Aber selbstverständlich kann verschiedenen Aufträgen die gleiche Nummer zugewiesen werden, vorausgesetzt sie kommen auf verschiedene Workcenter.

    So müsste es von der Aufgabenstellung doch gehen. Oder?

    Sascha, du hast dich ja schon etwas mit der Problematik die hier vorliegt befasst. Und ja, da gibt es einige Bedingungen die es zu beachten gillt.

    Da ich ja der User dieser App sein werde, finde man sollte es ihm so "bequem" wie nur möglich machen... ;)
    Das könnte ich mir so vorstellen.

    Stellt der User an der Combobox (ganz rechts im Datagrid) eine "bereits vergebene" Reihenfolge auf dem entsprechenden Workcenter ein, dann könnte ja ein kleines Fensterchen den User über die Konfliktsituation benachrichtigen.
    Bei Bestätigung des Users wird die Nummer DOCH vergeben, und alle Orders welche auf dem betroffenen Workcenter eine Nummer hatten die gleich oder grösser war, werden um +1 erhöht.
    Cancelt der User die Meldung, dann bleibt die bereits vergebene Nummer erhalten, und der User muss eine neue Nummer für den letzten Order wählen.
    Was auch gewährleistet sein sollte, ist, dass, nachdem ein Order abgearbeitet worden ist, dann müssen die "größeren" Nummern um -1 nachrücken.

    Ich würde vorschlagen, dass wir uns vorerst mal auf dieses "Szenario" beschränken. Das würde schon mal einen guten Teil der Anforderungen decken.
    Was denkt ihr, ist das so umsetzbar? Oder hab ich was übersehen?

    Viele Grüße,
    Jeiss
    jetzt stelle ichs mir einfacher vor, dass jedes Workcenter eine Schlange mit maximal 5 Plätzen hat, und man gibt halt an, auf welchen Platz der neu zu vergebene Auftrag soll.
    Also dass man eine EinfügePosition angibt - dahinter liegende Aufträge müssen halt eine Stelle zurück-rücken (sofern Platz ist).
    Auch rücken alle Elemente eins vor, wenn das erste Element abgearbeitet ist.
    Ja ErfinderDesRades,
    du hast genau ins Schwarze getroffen!

    Das mit der EinfügePostition ist eine sehr gute Idee!

    Als ich noch vor ein paar Tagen den ersten Post zu diesem Thema geschrieben habe, glaubte ich noch es ginge darum, einen Code zu schreiben der es ermöglichen würde, NUR die noch freien/verfügbaren Plätze in der Warteschlange eines jeweiligen Workcenters in seiner Liste anzubieten und dem angewählten Order (im Datagrid angewählt) diesen Platz zuzuweisen...

    Aber mit dem "Denkansatz" wäre es nicht möglich gewesen einen "neuen Order" in eine Warteschlange, zwischen zwei schon vergebenen Plätzen einzufügen. Man hätte die neuen Order (welche noch keinen Platz in einer Warteschlange haben) immer nur hinten dran hängen können!

    Aber mit der Einfügeposition wäre dieses Problem behoben. Super!

    So viel also mal zur "Theorie"...

    Für mich geht es jetzt konkret darum den Code zu schreiben der dies möglich macht!
    Und genau da bräuchte eure Unterstützung.

    Also irgendwie scheint es mir als ob noch niemand sich meine TestDemo angeschaut hätte- :| Shade!(für mich)

    Ich hab mir die extra angelegt damit ich den neuen Code testen kann bevor ich ihn in mein eigentliches, viel größeres Projekt einbinden kann.
    In der TestDemo, gibt es nämlich eine Combobox mit den Zahlen (also 1-5) für die Position/den Platz in der Warteschlange.
    Klickt der User eine der Zahlen zwischen 1-5 an, dann hätte man ja gleich die Einfügeposition des Orders in der Warteschlange des Workcenters!
    Dann müsste man nur noch dafür sorgen, dass diese Position dem selektierten Order zugewiesen wird und, dass die Plätze welche die gleiche oder eine größere Zahl haben um +1 erhöht werden und so in der Warteschlange nach hinten rutschen.

    ErfinderDesRades,
    wärest du bereit dir die TestDemo anzuschauen?
    Ich verstehe ja, dass du den Code nicht an meiner Stelle schreiben möchtest. Du weißt ja schließlich schon wie es geht. ;)

    Könntest/Würdest du mich aber vieleicht schritt für Schritt bis ans Ziel begleiten, indem du mir einfach sagst was in meiner Demo fehlt damit es funktioniert. Solange bis das ding ordentlich läuft?
    Ja das kann womöglich einige Wochen dauern.....wir haben ja nicht nur das zu tun.... Hättest du Lust und Zeit?

    In der Zwischenzeit schau ich selber mal in meine Demo rein. Denn ich möchte gerne, dass die besagte Combobox beim Auswählen eines Eintrages einen Command "auslöst", oder wie sagt man dafür..... Und das fehlt bis jetzt noch in der Demo.

    Vielen Dank,
    Jeiss
    Jo, ich hatte's auch nicht gedownd - mir schien die Anforderung fragwürdig definiert - was sollte ich da das Sample zu angugge?

    Aber jetzt geguckt, und komme ich dir gleich mit einer neuen Idee:
    Du zeigst ja alle Oder in hierarchischer Sortierung an, quasi Order By WorkCenter, Rank (fka: "Priority")

    Wäre nicht intuitiver (und vlt. auch einfacher zu coden), rauf/runter-Buttons reinzumachen, die den selectierten Order um eine Stelle nach oben/unten verschieben?
    Wusste es dass keiner reingeguckt hatte.... ;)

    ErfinderDesRades schrieb:

    Du zeigst ja alle Oder in hierarchischer Sortierung an, quasi Order By WorkCenter, Rank (fka: "Priority")


    Jo, stimmt!

    ErfinderDesRades schrieb:

    Wäre nicht intuitiver (und vlt. auch einfacher zu coden), rauf/runter-Buttons reinzumachen, die den selectierten Order um eine Stelle nach oben/unten verschieben?


    ​Also wenn es aus irgend einem Grund einfacher zu Coden sein könnte, ja dann nur zu! Ich hab zwar noch nicht begriffen warum, aber du denkst ja bestimmt schon einen Schritt weiter.

    Würdest du gleich ganz auf die Rank-Combobox verzichten und alles mit den "rauf/runter-Buttons​" machen?

    ​Aber, sowieso. Egal wie du es angehen willst, für mich ist es ok solange es die Aufgabe löst.
    Wenn ich dann mal einen "Grund-Code" für diese Aufgabe habe, dann kann ich ihn ja, falls nötig, noch ein wenig an meine spezifischeren Wünsche anpassen.

    ​Nur so, damit auch nachher niemand fragt, warum ich das nicht gleich gesagt hab.....

    Bei einem neuen Order, welches dem Property "UrgentOrdersView" in der Klasse UrgencyListVM​ hinzugefügt wird, hat die CurrentWorkCenter​-Eigenschaft, in meiner "Echten, vollständigen App", den Wert "Nothing".
    ​Dürfte nicht von grosser Bedeutung, sein. Wollte aber nur darauf hinweisen, da diese Eigenschaft in der Demo einen Wert erhält.

    ​Also gut dann, was schlägst du als nächstes erstes vor?

    Danke,
    ​Jeiss
    naja - mit deim Datenmodell kann ich eiglich nicht weiter-arbeiten.
    Ist mir überkandidelt, falsch strukturiert, und ein MainViewmodel fehlt.
    das müsste man erstmal komplett vom Kopf auf die Füsse stellen - bevor man auch nur anfängt mit dem Order-Ranking.

    Und Ja, meine Ranking-Buttons würden die Ranking-Combo ersetzen.
    naja, dir schritt für schritt alles zu erklären - ich fürchte, das ufert aus, v.a., weil ich mich ja auch verrennen könnte.
    Also hab ich jetzt erstmal was gebastelt, was funzt.
    Vlt. ist dein Datenmodell auch nicht soo verheerend - ich halte es jdfs. für nötig, dass ein Order einen Verweis auf die Workstation hat, die ihn bearbeitet, und so habichs auch hingebastelt.
    Und dass du kein MainViewmodel hast, sondern nur son UrgencyListVM-Dingens, und dieses Dingens ist auch deswegen NoGo, weils von ObservableCollection erbt.
    Auflistungen sollte man nur beerben, um auch wirklich neue Auflistungs-Funktionalität einzuführen - nicht einfach jeden beliebigen Kram dranbatschen.

    Und ich stütze mich voll auf meine Wpf-Infrastruktur, sonst wäre ich wohl diese Woche nicht fertig geworden damit.

    Und ich verstosse gegen NoFears Vorstellung von MVVM, also ich differenziere nicht zwischen Model und Viewmodel - auch weil das eine Masse an Gedöhns nach sich zöge, was zum Verständnis meines Lösungs-Ansatzes nix beitrüge.

    Aber nun, wo ein funktionierender Prototyp vorliegt, können wir doch noch quasi "Schritt für Schritt" vorgehen, nämlich indem wir deine VerständnisFragen eine nach der anneren abarbeiten :D



    Update: Guckmal - ich hab (für mich) neue ObservableCollection-Funktionalität entdeckt, die Performanz und Code-Eleganz bringt:
    ersetze

    VB.NET-Quellcode

    1. Public Property cmdOrderUp() As New RelayCommand(Of Order)(AddressOf OrderUp, AddressOf CanOrderUp)
    2. Private Function CanOrderUp(ord As Order) As Boolean
    3. Dim i = Orders.IndexOf(ord)
    4. If i < 1 Then Return False
    5. Dim ord2 = DirectCast(Orders.GetItemAt(i - 1), Order)
    6. Return ord.WorkCenter Is ord2.WorkCenter
    7. End Function
    8. Private Sub OrderUp(ord As Order)
    9. Dim i = __Orders.IndexOf(ord)
    10. Dim ord2 = DirectCast(Orders.GetItemAt(Orders.CurrentPosition - 1), Order)
    11. Dim i2 = __Orders.IndexOf(ord2)
    12. __Orders.Swap(i, i2)
    13. Orders.MoveCurrentToPrevious()
    14. End Sub
    durch

    VB.NET-Quellcode

    1. Public Property cmdOrderUp() As New RelayCommand(Of Order)(AddressOf OrderUp, AddressOf CanOrderUp)
    2. Private Function CanOrderUp(ord As Order) As Boolean
    3. Dim i = __Orders.IndexOf(ord)
    4. Return i > 0 AndAlso ord.WorkCenter Is __Orders(i - 1).WorkCenter
    5. End Function
    6. Private Sub OrderUp(ord As Order)
    7. Dim i = __Orders.IndexOf(ord)
    8. __Orders.Move(i, i - 1)
    9. End Sub

    Dateien

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Hallo

    ErfinderDesRades schrieb:

    Und ich verstosse gegen NoFears Vorstellung von MVVM, also ich differenziere nicht zwischen Model und Viewmodel

    Ist ja nicht weiter schlimm. Solange nicht die V ins VM geholt wird ist eh alles gut. ^^

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo ErfinderDesRades,
    Zunächst einmal vielen Dank für deine Hilfe, deine Anmerkungen bezüglich meiner Demo und deiner ehrlichen Vorschläge.

    Ich werde mir all das durch den Kopf gehen lassen. Vor allem der NoGo mit der vererbten ObservableCollection....
    Nicht ärgern wenn ich jetzt total daneben liege (ich stehe nämlich ehrlich gesagt noch immer irgendwie unter Schock....), aber du zeigst mir ja eine Alternative mit:

    Quellcode

    1. Public Shared Instance As New Mainmodel

    Ich schätze deine ehrlichen Kommentare auf jeden fall sehr.
    Doch wie gesagt, wenn ich mich mal von meinem Schock erholt habe muss ich aber noch prüfen ob dein "OrderMoveUp-Lösungvorschlag" einigen meiner Anforderungen gerecht wird.

    Folgende Punkte müssten gewährleitet sein:
    1) In deiner Demo werden die Orders schön strukturiert durch die Prozedur "GenerateOrders" generiert. Und da funktionniert der MovUp immer gut.
    Was ist aber, wenn jemand die Orders im Grid nach einer anderen Eigenschaft als WorkCenter Ordnen würde. Funktionniert MoveUp dann immer noch richtig.
    Aendert das sorten der collection was am MoveUp?

    Hast du diesen Punkt schon geprüft? Wie ist deine Meinung hier zu?

    2) Ähnlich verhält es sich in meiner "richtigen" App (also nicht in der geposteten Demo) mit neuen Orders die der Collection neu hinzugefügt werden.
    Neue Orders haben in der jetzigen version meiner App weder WorkCenter noch Rank/Position in der Warteschlange. Irgendwann ordne ich einem neuen Order dann, mittels der Combobox, einem WorkCenter zu. Wird der MoveUp dann richtig funktionieren.

    3) Und "Last but not least", muss ich die einmal festgelegte Reihenfolge in der Warteaschlange von jedem workcenter auch vor dem schliessen der App speichern können. Und beim erneuten Laden der Daten, muss die Reihenfolge der Order an den Workcenter ja noch immer die gleiche sein...Sonst hat das ganze ja auch nix gebracht....! Gespeichert wird zur Zeit in eine XML-Datei.

    ​Gerne wüsste ich deine Meinung zu diesen drei Punkten.
    ​Oder wenn sonst jemand eine Meinung oder ein Kommentar hat, nur zu....

    ​Ich schließe das Thema noch nicht ab. Ich werde bestimmt noch fragen haben.

    Vielen Dank,
    Jeiss
    ich hab für mein teil als Vorlage deine Vorlage genommen, und deine Anforderungen umgesetzt.
    Wenn du deine Orders anders sortierst, dann erfüllt die Ansicht doch garnimmer deine Anforderungen.
    Du willst doch eine Sortierung der Order nach WorkCenter, damit du auf einen Blick kast,welche Order welchem Workcenter zugeordnet sind.
    Bin ich jdfs. von ausgegangen.



    "hängende" Verweise in untergeordneten Datensätzen machen immer Probleme und Codier-Aufwand.
    Das einfachste ist, du erschaffst ein WorkCenter mit Namen "nicht zugeordnet", und alle neuen Ordner ordnest du diesem zu.
    Dann brauchst du gar nichts zu Coden, und kriegst in derselben Ansicht die "nichtzugeordneten" Orders als nichtzugeordnet angezeigt.



    Speichern als xml-Datei ist leidlich gangbar.
    Steigen die Ansprüche kommt EF+SqlServer ins Spiel, was die Sache gewaltig aufbläht, und nur schwer portabel macht.
    Hallo.

    ErfinderDesRades schrieb:

    Du willst doch eine Sortierung der Order nach WorkCenter, damit du auf einen Blick kast,welche Order welchem Workcenter zugeordnet sind.
    Bin ich jdfs. von ausgegangen.

    Ja stimmt auch so, das ist der Sinn der ganzen Sache!

    Aber da das Datagrid mir auch die Möglichkeit bietet nach den Spalten zu sortieren, wäre das doch interessant wenn ich das auch nutzen könnte.
    Es stimmt, dass das nicht gefragt war. Aber praktisch gesehen, kann es durchaus sein, dass z.B. ein "Sort" nach der Order-Eigenschaft "KW" mir besser verdeutlichen würde, wieviel Verspätung ein Order vielleicht in der Zwischenzeit hat. Und dann wäre es auch denkbar, dass dieser Order dann auf ein anderes WorkCenter "verlegt" wird auf dem in der Zwischenzeit wieder Kapazität frei geworden ist... Das ganze "ge-Orders" ist eine ziemlich dynamische Geschichte....Leider!

    In deinem/unserem "Mainmodel" sind die Orders ja in der ObservableCollection(Of Order) "untergebracht". Gleich nach dem Start des Projektes sind die frisch erstellten Orders ja noch ganz "un-geordnet". Die werden ja einfach in der Prozedur GenerateOrders hintereinander angereiht, oder? Du hast diese Prozedur eben so erstellt, dass es aussieht als ob die Orders nach den Wkc sortiert seien. Kann man das mal so sehen?
    Durch jeden klick auf einen der MoveUp buttons, bewegt sich der selektierte Order dann in dieser "Liste aufwärts". In dieser Liste hat doch irgendwie jedes Order einen festen Platz, den index? Oder? Ist dieser denn nicht von der Sortierung unabhängig...?
    Na ja wie du siehst ist das alles noch nicht ganz klar in meinem Kopf....

    Da kämen wir dann auch schon zum nächsten Punkt. Das speichern in der XML-Datei. Der Gedanke scheint dir nicht zu missfalle. Aber wie würde das konkret aussehen?
    Nur die ObeserbableCollection mit For each durchlaufen und speichern? Oder müssten da aber feste Positionen (mit Nummern) her? Wenn man garantieren möchte, dass beim nächsten laden der Daten die Collection noch immer die gleiche Reihenfolge (der Orders auf den Wkc) anzeigt? Könntest du das bitte kurz erklären?

    ------------------------------------------------------------------------------------------------------

    ErfinderDesRades schrieb:

    Das einfachste ist, du erschaffst ein WorkCenter mit Namen "nicht zugeordnet", und alle neuen Ordner ordnest du diesem zu.

    Ja, an so was hatte ich auch schon gedacht. Werde es wohl auch so machen.

    Danke,
    Jeiss
    Sortierung:
    Üblicherweise haben Daten garkeine Ordnung, und vom Prinzip her ist bei Datenabruf nicht gewährleistet, dass wenn 2 mal dieselben Daten gerufen werden, dass sie auch in derselben Reihenfolge geliefert werden.
    Die Ordnung herzustellen ist eiglich Aufgabe der ListCollectionViews, und zwar anhand von Kriterien, wie Datum, WorkCenter, oder sogar WorkCenter.Name, sowie Mehrfach-Kriterien - dassis alles nix aussergewöhnliches.
    Aber wie's hier ist, ists aussergewöhnlich: Die Ordnung ist nicht durch Kriterien festgelegt, sondern sie ist eben so, wie die Elemente inne OC (händisch) angeordnet wurden.
    Dassis quasi ziemlich fragil - zB standardmässig kann man Daten ja über Spaltenheader-Click umsortieren - in diesem Falle aber würde das die gewünschte Funktionalität kaputtmachen.

    Speichern:
    Ich bin halt "verwöhnt" von WinForms: Da kann ich komplizierteste Datenmodelle ganz einfach im Dataset-Designer designen, hab damit alle erforderlichen Klassen gecodet, und drüberhinaus eine perfekte SpeicherMethode an der Hand.
    Leider wird typDataset vom Wpf-Databinding-System nur unzureichend unterstützt, das macht mich etwas unbegeistert.
    Ich hab mit Riesen-Aufwand eine eigene Dataset-Technologie gecodet, wo man aus .edmx-Dateien geeignete Klassen generiert bekommt - besser noch als typDataset, und auch besser als EF-Datacontexte.
    Und da hab ich mir natürlich auch eine perfekte Speichermethode für gecodet.
    Aber wie gesagt: Ein riesiger programmiererischer Aufwand, und habich bislang nur für c#,

    ErfinderDesRades schrieb:

    Die Ordnung ist nicht durch Kriterien festgelegt, sondern sie ist eben so, wie die Elemente inne OC (händisch) angeordnet wurden.
    Dassis quasi ziemlich fragil - zB standardmässig kann man Daten ja über Spaltenheader-Click umsortieren - in diesem Falle aber würde das die gewünschte Funktionalität kaputtmachen.

    Sorry das ich mich einmische. In diesem Fall würde ich persönlich wie folgt vorgehen. Ich habe meine Daten und lade diese in eine ICollectionView. Jedoch lade ich nicht die List(of meineModelklasse) sondern die List(Of ViewModelKlasse). Vorteil hier. Ich kann die Properties so aufbereiten wie ich das will und auch ReadOnly Properties reinpacken welche mir für die Sortierung von nutzen sind. Auch kann ich in z.b. einm DataGrid dann bei jedem Column das SortMemberPath Property setzen und nach einem Property sortieren welches gar nicht sichtbar ist usw.
    Diese VM passe ich genau so an wie ich es im View benötige. Deshalb nennt man es auch ViewModel. Ich habe die trennung zwischen Daten und View und trotzdem die freiheiten.

    Und vorweg weil ich weis das dies hier von jemanden kommen wird. Ja, das kann durchaus ein paar zeilen Boilerplate Code nach sich ziehen. Wobei dies zu verkraften ist für einen gewissen grad an "Luxus".

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo,
    tut mir leid, aber ich hab irgendwie den Eindruck, dass ich auf der Stelle trete.... (nicht böse gemeint)
    So komme ich irgendwie nicht weiter.
    Naja, aber wenigstens entdecke ich bei jeder neuen Antwort etwas neues was ich bis dahin nicht wusste.
    Bringt mich aber nicht mit meinen Orders weiter....

    'ErfinderDesRades'

    ErfinderDesRades schrieb:

    Die Ordnung herzustellen ist eiglich Aufgabe der ListCollectionViews, und zwar anhand von Kriterien, wie Datum, WorkCenter, oder sogar WorkCenter.Name, sowie Mehrfach-Kriterien - dassis alles nix aussergewöhnliches.

    ​Kommt das denn nicht daher, dass wir die Position/Reihenfolge (Feste Werte/Zahlen) in der Warteschlange der WorkCenter "fallen gelassen" haben und durch "MoveUp" in der Liste ersetzt haben? Wenn wir zusätzlich zu den oben zitierten Kriterien: Datum, WorkCenter, oder sogar WorkCenter.Name z.B. das Kriterium "DurchlaufNummer" hinzugefügt hätten, dann wäre das ja wieder: Nix aussergewöhnliches. Oder?
    ​Aber, du hast das ja schon irgendwie erklärt. Ich begreif das bloß nicht.....!

    ​'Nofear23m'
    ​Es ist ja schön, dass du dich einmischt,
    ​aber damit ich ne chance haben was zu verstehen.
    ​Worauf bezieht sich deine Aussage:

    Nofear23m schrieb:

    In diesem Fall würde ich persönlich........

    ​Ist das eine Anmerkung zu ErfinderDesRades Ordnungsproblem beim speichern, oder als Vorschlag um das eigentliche Problem der Workcenter-Warteschlangen-Positon an zu sehen?
    ​Hast du in meine Demo reingeguckt?
    ​Ja ist für eine kleine Demo schon fast zu gross. Ich wollte sie halt so komplett wie möglich machen, um es euch so einfach wie nur möglich zu machen mir zu helfen...
    ​Hatte aber nicht gedacht, dass es für einen Außenstehenden so schwierig sein würde sich da "rein zu fühlen". Wohl nicht sauber genug, Namen der Eigenschaften nicht passend/selbst erklärend genug.

    ​Um das Problem nochmal zu erklären, oder falls noch jemand sich "einmischen" sollte. ;)

    ​Es gibt doch so viele Beispiele und Tutorials im Internet, welche z.B. mit Autos zu tun haben wo es Models und ViewModels gibt.
    ​Da haben z.B. Autos Eigenschaften wie: Marke, Model und PS.
    ​Jetzt stellen wir uns vor alle diese schönen Autos müssten in die Werkstatt.
    ​Einige brauchen z.B. Ölwechsel, andere Reifenwechsel und andere wieder haben Problemen mit den Bremsen. Mehr wird in dieser Werkstatt eben nicht angeboten. ^^

    ​Und damit alles schön klappt müsste bei jeden der drei "Arbeitsposten" (Ölwechsel, Reifenwechsel und Bremsen) einen Plan aufgestellt werden in welcher Reihenfolge die Autos an den verschiedenen Posten "ran kommen". Und da ja nicht alles genau vorhersehbar ,ist würde es auch vorkommen, dass diese Reihenfolge geändert wird. Z.B. Auto N°5 in der Reihe, muss doch vor Auto N°4 ran kommen. (und wird so selbst zu N°4).
    ​So was muss doch programmierbar sein!
    Ähnlich verhält es sich bei meinem "Orders - WorkCenter - Reihenfolgen" Problem.....
    ​Ist schon jemand auf solch ein Beispiel gestoßen? Oder eins was "nahe dran" ist?

    ​Ich würde mich sehr über jede Hilfe freuen. Ich versuche nämlich schon seit ungefähr fünf Monaten eine Lösung zu meinem Order-Warteschlangenproblem zu finden. <X X/ ?( :huh:
    ​Da die eigentliche Aufgabenstellung doch nicht so kompliziert sein kann(kann ich mir nicht vorstellen...) nehme ich an, dass vieles aufs Konto von "Verständnisschwierigkeiten" zu schreiben ist.

    Danke,
    Jeiss


    Jeiss schrieb:

    Wenn wir zusätzlich zu den oben zitierten Kriterien: Datum, WorkCenter, oder sogar WorkCenter.Name z.B. das Kriterium "DurchlaufNummer" hinzugefügt hätten, dann wäre das ja wieder: Nix aussergewöhnliches. Oder?
    Klar, kann man machen.
    Nur kann man ja nicht einfach einem Element eine Nummer zuteilen, sondern man muss meist mehrere Elemente berücksichtigen, und da jeweils Teilbereiche neu durchnumerieren.
    Denk das mal durch, die "Nummer-Tänzchen", bei
    • Zufügen eines Elements
    • Erledigung des ersten Auftrags
    • Aufrücken eines Elements nach vorn
    • Aufrücken nach hinten
    und alles muss auch funzen, wenn die liste nicht ganz voll ist.
    Einiger Aufwand, und das Ergebnis ist auch nicht anners, als wie ichs verzapft habe.
    Hallo

    Jeiss schrieb:

    ​Ist das eine Anmerkung zu ErfinderDesRades Ordnungsproblem beim speichern, oder als Vorschlag um das eigentliche Problem der Workcenter-Warteschlangen-Positon an zu sehen?

    Richtig. Ich bin da ja am selben stand wie @ErfinderDesRades und denke das du dir hier fast mehr probleme erstellst als du gutmachst.

    Jeiss schrieb:

    Hast du in meine Demo reingeguckt?

    Ja, habe ich. Und ich verstehe dein Problem. Wie schon erwähnt komme ich auch aus der Produktion und hatte damals ein ähnliches Proramm für die Produktionseinreihung und kenne die damit verbundenen Probleme.
    Fakt ist, alles was du "manuell" machst für früher oder später zu Problemen. Fast sogar weniger was die programmierung und die Funktion angeht sondern früher oder später an der Bedienung.

    Ich bin ein Freund davon das ich sollche Dinge so gut wie möglich über die vorhandenen Daten "sortiere".
    Was hat man in der Regel?
    • Liefertermin (ganz wichtiges Sortierkriterium)
    • Eingangsdatum (Wenn zwei Liefertermin gleich wären -> wer zuerst kommt malt zuerst)
    Evtl. kann man wenn diese Kriterien nicht ausreichen dann noch eine Priorität vergeben welche einfach z.b. von 1-5 geht. Hier können auch zwei Orders die Prio 3 haben. Dann entscheidet wiederum Liefertermin und Eingangsdatum über die Entgültige einreihung.
    Und das DataGrid würde ich dann sowieso so einstellen das ich Entweder alle "Workcenter" zusammen anzeige oder nach "Workcenter" Gruppiere damit ich einen besseren überblik bekomme und evtl. Händisch eingreifen kann.
    Welches WS was zugeodnet wird nehme ich mal stark an, ist sowieso ein Sache die man händisch machen muss. Ich nehme an nicht jede WS könnte jeden Order übernhemen oder "können" alle das selbe?

    Ich weis nicht ob es "bei dir" relevant ist aber in meinem Fall hatte ich dann noch ein anderes wichtiges Kriterium da die Aufträge einfach verschieden groß waren.
    Bei manchen wusste ich das diese vieleicht 4-5 Stunden dauern würden, bei anderen war klar das diese Tage verschlingen. Hier müsste die "Logic" diese dann auch noch nach diesem Kriterium sortieren.

    Spiel das doch bitte mal komplett durch. In der Realität ist es doch so das in einem täglichen Geschäftsablauf keiner etwas "nachbessern" will oder überhaupt die Zeit dazu hat.

    Solltest du hier auf einen "grünen" Zweig kommen kann ich dir ja ein kleines Demo machen, bedenke aber das dies ja doch auch ein wenig Arbeit ist und das möchte ich nicht unbedingt einfach so mal machen obwohl es gar nicht dem entspricht was du haben willst. Auch möchte ich hier @ErfinderDesRades nicht reinpfuschen. Er ist was Daten und Datenmodelle angeht Top, nicht das ich mir hier Feinde mache.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##