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
-
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
-
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
-
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])
*
-
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
-
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
-
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 -
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.
Content aside
- vor 3 JahrenZuletzt aktiv
- 7Antworten
- 536Ansichten