0

Zählen von Verknüpfungen mit while-Schleife

Hallo alle zusammen,

ich hab folgendes Szenario:

Wir haben in unserem Betrieb eine Mitarbeiterhierachie. Dazu hab ich eine Tabelle angelegt "Mitarbeiter". Dort werden alle einzelnen Mitarbeiter gelistet.

Ich hab, um jedem Mitarbeiter einen Vorgesetzten zuzuordnen, die Tabelle nochmal mit sich selbst verknüpft. soweit so gut.

Nun hab ich bei der Hirarchie ganz unten bei einem Azubi begonnen und diesen einen Vorgesetzten zugeordnet, diesem Vorgesetzten seinen Vorgesetzten zugewiesen usw.... das ganze dann  hoch bis zum Chef, bei dem die Verknüpfung dann leer ist! 

Mein Problem:

Ich würde gern alle Personen zählen, die in der Hierarchie über dem ausgewählten Mitarbeiter sind! 

Beispiel:

Chef = 0 Mitarbeiter!

Abteilungsleiter = 1 .....(nur Chef)

Teamleiter = 2  ......(Abteilungsleiter u. Chef)

Meister = 3 ....( Teamleiter, Abteilungsleiter u. Chef)

usw......

 

Ich hab versucht das ganze über eine while-schleife zu lösen, nur hat sich bei jedem Ansatz den ich versucht habe mein Browser aufgehängt, da mein Code wahrscheinlich komplett falsch war!

let my := this;

let anzahl := cnt(my.Vorgesetzter)  

while anzahl != 0  "Start" 

Wie kann ich nun abfragen ob die Verknüpfung von meinem Datzensatz auch ne Verknüfung hat und diese Verknüfung dann wieder eine Verknüfung hat... solange bis ninox beim letzten Datensatz angekommen ist der keine verknüfung hat ? Diese Summe würde ich dann gerne in einem Zahlenfeld per Button speichern!

 

für jede Hilfe wär ich euch wie immer sehr dankbar.

Liebe Grüße Martin

7 Antworten

null
    • Jonas_Zander
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Moin Martin,

     

    ich habe mir das mal nachgebaut nur mit dem Zusatz, dass ich ein Funktionsfeld mir gebaut habe. Ich bin leider noch nicht so sicher in den ganzen Funktionen in Ninox, daher bin ich mit simplen if else Befehlen herangegangen. Es ist jetzt erstmal nur bis in die 4 Ebene an Vorgesetzten.

    ---------

    let my1V := Vorgesetzer;
    let my2V := myFV.Vorgesetzer;
    let my3V := mySV.Vorgesetzer;
    let my4V := myTV.Vorgesetzer;
    if my1V != null then
    if my2V != null then
    if my3V != null then
    if my4V != null then 4 else 3 end
    else
    2
    end
    else
    1
    end
    else
    0
    end

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

    Bestimmt gibt es schönere und elegantere Code-Lösungen, aber so würden die Vorgesetzenanzahl korrekt "gezählt".

    LG

    Jonas

    • Martin_Wackenhut
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Servus Jonas;

    erstmal vielen Dank für deinen Lösungsansatz und Mühe.

    Anfangs hatte ich es auch über die "if-then" kontrollstruktur versucht, habe aber dann schnell gemerkt, dass diese Lösung an ihre Grenzen kommt, da es bei uns in der Firma "theoretisch" unendlich viele vorgesetzte geben kann (natürlich nur theorie) und ich den Code nicht jedesmal anpassen möchte und erweitern um eine if-Abfrage.

    Das Beispiel oben sollte nur zur Veranschaulichung dienen und war von mir, zugegeben, etwas blöd gewählt da man denkt das die Anzahl begrenzt ist.

    Es muss irgenwie über eine while-Schleife funktionieren, aber leider kenn ich mich da auch zu wenig aus!  

    Vielleicht hat jemand noch eine andere Idee :)

    Gruß Martin 

    • mirko3
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hi Martin. Mir ist nicht ganz klar, wie Eure Hierachie funktioniert. Wenn es zwei Abteilungsleiter gibt, gelten sie beide als Vorgesetzte eines Meisters (Fall A), oder nur der direkte (Fall B)? Aber egal wie, ich hätte einen Vorschlag für einen anderen Ansatz. Wenn jede Hierachieebene codiert wird in eine extra Feld (z.B. HE = 0,1,2,3...n) und 0 der Chef ist, dann ginge in Fall A die Anzeige in einem Funktionsfeld (oder per Button, wenn Dir das lieber ist). Ich bezweifle die Möglichkeit einer Schleifenabfrage, aber schreibe mal, wenn Du es so gelöst bekommst. Für Fall B ist es dann sogar noch einfacher: HE - 1. Gruß Mirko

    *

    let Q := HE;
    cnt((select TABELLE)[HE< Q])

    *

    • Ninox-Professional
    • planoxpro
    • vor 3 Jahren
    • Gemeldet - anzeigen

    N'Abend allerseits, ich werfe auch mal meinen Hut in den Ring:

     

    let myZ := 0;
    let myPath := "Vorgesetzter";
    let myLoop := true;
    while myLoop do
       if eval(myPath, this) then
          myZ := myZ + 1;
          myPath := myPath + "." + "Vorgesetzter"
       else
          myLoop := false
       end
    end;
    myZ

    • Martin_Wackenhut
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Guten Abend mz und planox,

    Die Funktion von planox hat es auf den Punkt gebracht! Wahnsinn! vielen Dank euch allen für eure Hilfe :)

    Ich hätte da  noch ein weiteres Anliegen wenn das nicht zuviel verlangt ist:

    Wäre es auch noch möglich per Button für jeden Vorgesetzten den Ninox zählt, einen Datzensatz in einer Untertabelle  anzulegen und diesen Datzensatz mit dem jeweiligen Vorgesetzten zu Verknüpfen? So das man sozusagen eine Liste der Vorgesetzten sieht?

    Beispiel: Ich bin jetzt auf dem Datensatz des Teamleiters "Max Mustermann"! Dieser hat den Abteilungsleiter "Hans Müller" also Vorgesetzten und dieser wiederrum nur den Chef "Karl Albrecht"

    Wenn ich nun auf den Button drücke, sollte Ninox 2 Datensätze anlegen, einen für den Abteilungsleiter und einen für den Chef und diese Datzensätze dann natürlich entsprechend verknüpfen. 

    Die Untertabelle hab ich schon vorbereitet, es gibt die Verknüpfung zu Mitarbeiter und bestimmte Felder wie Vorname, Name usw. die auch übertragen werden sollen. 

    Gruß Martin

    • Martin_Wackenhut
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Ich hab es mal selbst versucht aber ich komm nicht weiter:

    Ich bekomm die Anzahl der Datensätze jetzt erstellt in dem ich den code von planox.pro mit

    let new := (create Übersicht);
    new.Mitarbeiter := my);

    einfach etwas erweitere. Nur hab ich kein Schimmer wie ich Ninox sagen kann, dass er für den 1. Datensatz der erstellt wird den 1. vorgesetzten verknüpfen soll und in den 2 Datensatz der ertellt wird den 2. Vorgestzten verknüpfen soll usw... natürlich nur falls diese auch existieren! aber da die schleife ja sowieso abbricht sobald 

    if eval(myPath, this) nicht erfüllt ist muss ich mich um das problem ja nicht kümmern.

     

    let my := this;

    let myVor := 'Vorgesetzter'
    let myZ := 0;
    let myPath := "Vorgesetzter";
    let myLoop := true;

    while myLoop do
    if eval(myPath, this) then
    myZ := myZ + 1;

    let new := (create Übersicht);
    new.Mitarbeiter := my);

    new.Vorgesetzter := myVor 

    myPath := myPath + "." + "Vorgesetzter";

    new.Vorgesetzter := myVor  

    Es muss doch irgendwie machbar sein wie bei myPath den Wert der Variable bzw den Namen auch zu erweitern! so das Ninox den nächsten Vorgestetzten in die Variable myVor speichert ^^ 

    hat einer von euch eine Idee ??  Das würde mir für viele weitere Dinge die ich in Ninox umsetzten möchte einiges nach vorne bringen :)

    Viele Grüße 

    Martin 

    • Ninox-Professional
    • planoxpro
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo Martin, auf die Schnelle:

     

    let me := this;
    let myVName := null;
    let myPath := "Vorgesetzter";
    let myLoop := true;
    while myLoop do
       if eval(myPath, this) then
          myVName := eval(myPath + ".Name", this);
          let newV := (create 'Übersicht');
          newV.(Mitarbeiter := me);
          newV.(Name := myVName);
          myPath := myPath + ".Vorgesetzter"
       else
          myLoop := false
       end
    end

     

    Den Zähler habe ich dabei jetzt weggelassen, den braucht man ja nicht mehr, da man die Einträge mit "cnt('Übersicht')" ja direkt zählen könnte.