lasen sich Feldnamen durch Variablen ansprechen und auslesen..?
ich habe hier einen Auszug einer Excel.Csv mit 30 Spalten an Jahren die Infos über gewisse Zustände gespeicher haben.. diese möchte ich nun auswerten und in ninox überführen
als Untertabelle basierend auf Namen aus Personaldatenbank
funktioniert alles wie es soll nur habe ich das Problem das ich die Daten in einer 30x Schleife basierend auf dem Spaltennamen Jahreszahl importieren möchte..
in der Art
myD.(Statbin :=‘1990‘
und nun stellt sich die Frage ob ich dies nicht als Variable definieren kann
in der Art
myyear :=myyear + 1
myyearausw := “‘“ + myyear + “‘“
myD.(Jahr := myyear)
myD.(Statbin := myyearausw)
31 Antworten
-
Hallo Martin,
wie sieht die Untertabelle den aus? Auch 30 Spalten oder nur zwei bzw. drei Spalten (Personal, Jahr, Statbin). Ich würde es so machen:
1. Die csv in Editor öffnen (so dass die Trennzeichen zu sehen sind. Wenn es von Excel kommt, sollten die Semikolons als Trennzeichen vorkommen).
2. Den Text kopieren und in Ninox in eine Textfeld einfügen.
3.
---
let myARR:=(split(Textfeld,"
");
let myY:=first(myARR);
for i in range(1, cnt (myARR)) do
let myStr:=split(i,";");
for j in slice(myStr,1,1000) do
let new:=create UNTERTABELLE;
new.Personal:=first(select Personal where Name=first(myStr));
new.Jahr:=item(myY,i);
new.Statbin:=item(myStr,j)
end
end
---
Die formel ist nicht geprüft, weil ich das Datenmodel nicht kenne.
Leo
-
oops, einen Fehler endeckt.
---
---
let myARR:=(split(Textfeld,"
");
let myY:=first(myARR);
for i in range(1, cnt (myARR)) do
let myStr:=split(i,";");
for j in slice(myStr,1,1000) do
let new:=create UNTERTABELLE;
new.Personal:=first(select Personal where Name=first(myStr));
new.Jahr:=item(myY,i);
new.Statbin:=j
end
end
---
Leo
-
sie hat nur drei Spalten
let my := this;
let myYear := number(2005);
let myBinnum := number(2005);
for i in range(0, 15) do
let myD := (create SEOWDatum);
let myBin := text("'" + number(myBinnum + i) + "'");
myD.(SEOWUrlaub := my);
myD.(SEOWBIN := myBin);
myD.(Datum := myYear + i)
endIch habe versucht über einen Button in eine Untertabelle zu schreiben um das Monster mit 30 Spalten zu entfernen.
Problem an der Geschichte ist, den Tabellennamen kann man so scheints nicht über Variablen anspringen..
Es muss die Syntax
myD.(SEOWBIN := '2005');
und nicht myD.(SEOWBIN := myBin); über eine Variable gesetzt sein..
sprich über eine for Schleife ist dies nicht möglich wie es aussieht..
Das mit dem Textfeld ist ja ein krasser Ansatz... 2000 User 30Spalten.. kann sein das Ninox exploidet :))
Vielen Dank LEO ich mach mich mal auf die Versuchsstrecke...
-
Habe es über eine neue Tabelle mit Textfeld und Button getestet
let myARR:=(split(Text,"
");
let myY:=first(myARR);
for i in range(1, cnt (myARR)) do
let myStr:=split(i,";");
for j in slice(myStr,1,1000) do
let new:=create UNTERTABELLE;
new.Personal:=first(select Personal where Name=first(myStr));
new.Jahr:=item(myY,i);
new.Statbin:=j
end
endTabelle myARR wurde nicht gefunden hmmm..
-
---
do as server
let myARR := split(Text, "
");
let myY := split(first(myARR), ";");
for i in range(1, cnt(myARR)) do
let myStr := split(item(myARR, i), ";");
for j in slice(myStr, 1, 1000) do
let new := (create UNTERTABELLE);
new.(Personal := first(select Personal where Name = first(myStr)));
new.(Jahr := number(item(myY, i)));
new.(Statbin := j)
end
end
end
---
-
Hmmm tut nix
let myARR := split(Text, "
");
let myY := split(first(myARR), ";");
for i in range(1, cnt(myARR)) do
let myStr := split(item(myARR, i), ";");
for j in slice(myStr, 1, 1000) do
let new := (create SEOWDatum);
new.SEOWUrlaub.(Name := first(select SEOWUrlaub where Name = first(myStr)));
new.(Datum := number(item(myY, i)));
new.(SEOWBIN := j)
end
end -
Offensichtlich bin ich nicht in der Lage den Kode ohne DB zu schreiben. Habe jetzt nachgebaut und überprüft.
---
do as server
let myARR := split(Text, "
");
let myY := split(first(myARR), ";");
for i in range(1, cnt(myARR)) do
let myStr := split(item(myARR, i), ";");
for j in range(1, cnt(myStr)) do
let new := (create UNTERTABELLE);
new.(Personal := first(select Personal where Name = first(myStr)));
new.(Jahr := number(item(myY, j)));
new.(Statbin := item(myStr, j))
end
end
end
---
Hier noch die Datenbank zum Üben
https://www.dropbox.com/s/7cgmsbkephfyd6w/Martin.ninox?dl=0
Leo
-
Das ist genial Leo.. vielen Dank.. deines Funktioniert 1A
meines Funktioniert soweit auch nur mit den Namen bekomme ich Troubles..
do as server
let myARR := split(Text, "
");
let myY := split(first(myARR), ";");
for i in range(1, cnt(myARR)) do
let myStr := split(item(myARR, i), ";");
for j in range(1, cnt(myStr)) do
let new := (create UNTERTABELLE);
new.(Personal := first(select Personal where Name = first(myStr)));
new.(Jahr := number(item(myY, j)));
new.(Statbin := item(myStr, j))
end
end
enddie Perso passt , der Code meckert auch nicht nur die Ausgabe ist falsch?
habe sogar die Namen auf Großbuchstaben gesetzt..
-
Vielleicht ist die Schreibweise (leerzeichen oa) nicht in Ordnung. Du kannst noch zusätzlich die Datensätze im Personal -Tabelle erstellen lassen, falls Ninox den Namen nicht findet. Dann kannst du vergleichen:
---
do as server
let myARR := split(Text, "
");
let myY := split(first(myARR), ";");
for i in range(1, cnt(myARR)) do
let myStr := split(item(myARR, i), ";");
for j in range(1, cnt(myStr)) do
let myName := first(myStr);
if cnt(select Personal where Name = myName) = 0 then
(create Personal).(Name := myName)
end;
let new := (create UNTERTABELLE);
new.(Personal := first(select Personal where Name = first(myStr)));
new.(Jahr := number(item(myY, j)));
new.(Statbin := item(myStr, j))
end
end
end
---
Leo
-
Nein funktioniert nicht , es kommt immer ein Buchstaben Zahlencode warum auch immer..
Habe sogar ne komplette neue Perso Tabelle erstellt zum testen.. selbes Ergebnis..
ich habe meine Perso in deine Testdatenbank als PersoOrig importiert und dein Script angepasst..
funktioniert auch nicht.. ergibt diese Meldung
-
Ich habe glaube ich den Fehler gefunden Leo... Danke erstmals vorweg, dass war wieder mal erste Wahre was Du hier gebracht hast.. Danke nochmals.. ich gebe Dir morgen Bescheid was genau falsch gelaufen ist...
-
Hallo LEO, dass hat super funktioniert und ich haben den Fehler gefunden.. habe aber gleich noch ein Problem da ich
die Bspw 0101 in ein Mehrfachauswahlfeld überführen möchte..
ich habe mich herumgespielt aber so richtig weiter komme ich nicht ... wurde eines mit 1 gesetzt wurde ein anderes mit 1 gelöscht..
vlg..Martin
-
Hallo Martin,
um einen Text Statbin mit "0101" in ein vierer Mehrfachauswahl zu überführen:
---
'Multiple choice' := for myStep in range(0, 4) do
if item(split(Statbin, ""), myStep) = "1" then
myStep + 1
end
end
---
Wenn du diesen Schritt direkt beim export machen möchtet, dann muss man die Formel nach der Zuweisung von Statbin einfügen:
---
new.('Multiple choice' := for myStep in range(0, 4) do
if item(split(Statbin, ""), myStep) = "1" then
myStep + 1
end
end)
---
Leo
-
Super LEO das funktioniert 1A unglaublich wie kompakt der Code ist... Vielen Dank dafür..
bin schon bei der Planung wie ich das in der Statistik umsetze damit die Kollegen im Voraus klar wissen , ob sie im nächsten Jahr mit einem Urlaub planen dürfen oder nicht..
in meinem Fall sind es aus 2000 , 15 Mitarbeiter von denen 4 gleichzeitig gehen dürfen zu zu diesen 4 Terminen..
Aktuell rechen wir.. die Max. 30 Jahre zurück und summieren alle Jahre um die Anzahl der Jahre-1 um auf einen Schnitt inkl Priorität zu kommen und die die vom Ergebnis her die Niedrigsten sind könnten bedenkenlos den Urlaub planen.
-
Hallo Leo, ich stehe aktuell grad wieder mal an.
Ich versuche in der Perso vier FX Felder mit der Summe aus ..
1)Textfeld ‚Statbin‘ Stelle 1-4 alle 30Jahre wenn "True" um den Loop Range 1-30 zu addieren und durch 30 zu dividieren anzuzeigen.
oder
2)Mehrfachauswahl ‚ Multiple choice‘ 1-4 alle 30Jahre wenn "True" um den Loop Range 1-30 zu addieren und durch 30 zu dividieren anzuzeigen.
Ist vermutlich die Hitze aber ich bin irgendwie leer
Viele Grüße Martin
-
Hallo Martin,
da ich das Datenmodell nicht kenne, kann ich keine hundertprozentige Antwort geben. Nehmen wir an, die Tabelle (Statistik) hat drei Spalten: "Statbin" (Text),"Jahr" (Zahl), "Personal"(verknüpfung zu jewailigen Mitarbeiter). Und du möchtest für jedes Jahr die vier Mittelwerte aus Jahren (Jahr-30) für jede Person rausrechnen. Die vier fx-Felder befinden sich ebenfalls in der Tabelle Statistik:
Für die Stelle 1 wäre dann die formel:
---
let myYear:=Jahr;
avg(Personal.Statistik[Jahr<=myYear and Jahr>myYear-30].number(substr(Statbin, 0, 1)))
---
dan für 2:
---
let myYear:=Jahr;
avg(Personal.Statistik[Jahr<=myYear and Jahr>myYear-30].number(substr(Statbin, 1, 1)))
---
usw.
Wenn die Felder in der Tabellepersinal sein sollten und beziehen sich auf das aktuelle Jahr, dann würde die Formel für das erste Felde so aussehen:
---
let myYear:=year(today());
avg(Statistik[Jahr<=myYear and Jahr>myYear-30].number(substr(Statbin, 0, 1)))
---
usw.
bei Multiple choice muss man anders forgehen weil bei "0101" aus numbers('Multiple choice') das Array [2,4] entsteht. Die Formel fürs erste Feld kann man dann so schreiben:
---
let myYear:=Jahr;
avg(Personal.Statistik[Jahr<=myYear and Jahr>myYear-30].if index(concat(numbers(Statbin)), "1") >= 0 then 1 else 0 end)
---
bzw für die Personaltabelle:
---
let myYear:=year(today());
avg(Statistik[Jahr<=myYear and Jahr>myYear-30].if index(concat(numbers(Statbin)), "1") >= 0 then 1 else 0 end)
---
Leo
-
morgen Leo, basierend auf deinem Datenmodel... und wieder vielen Dank im Voraus... und das am Wochenende.. extremen Dank dafür..
-
Guten Morgen Leo, der Weg über AVG ist Klasse aber ich habe dabei ein Problem mit der Anwendbarkeit.
Die Funktion würde sich anwenden lassen wenn alle Mitarbeiter das gleiche Eintrittsjahr haben würden.
Ist die nicht der Fall passt der AVG Wert nicht zusammen und ich würde die Mitarbeitet ungerecht bewerten..
ich habe das mal hier als Bild dargestellt.
sprich ich muss in jedem Fall noch den Faktor Eintrittsdatum miteinbeziehen und den Summanden neu bewerten?
Frage über Fragen :)
Wenn Du einen Lösungsansatz hättest wäre mir sehr geholfen.
-
Hallo Martin,
dann vielleicht statt avg einfach
---
sum(........)/30
---
Leo
-
hmm. sum(........)/30
l
et myeintritt := Eintrittsdatum
sum(........)/myeintritt
Problem noch daran ist, dass die Werte für die Einzelnen Jahre ab Einstiegsdatum ansteigend gewertet werden müssten
wie oben der grüne Bereich..
-
Ok, von den ansteigenden Daten war vorher nicht die Rede. Ich blebe mei meinem Datenmodel und 30 Jahre, dann wäre die Formel für Mittelwert beim Ersten Wert:
---
let myYear:=Jahr;
let myCNT:=sum(Personal.Statistik[Jahr<=myYear and Jahr>myYear-30].number(substr(Statbin, 0, 1)));
let mySum:=(1+myCNT)/2*myCNT;
mySum/30
---
Leo
-
Das ist dein Code abgeändert ab mein Model
let myYear := Eintrittsjahr;
let myCNT := sum(UNTERTABELLE[Personal.Eintrittsjahr <= myYear and Personal.Eintrittsjahr > myYear - 30].number(substr(Statbin, 0, 1)));
let mySum := (1 + myCNT) / 2 * myCNT;
mySum / 30es bleibt aber immer noch das Problem, dass die 1 aus der Statbin nicht an des Jahr gebunden erscheint.
Das Problem daran ist das die Wertigkeit des aktuellen Jahr gleich der aus bspw 2015 ist vom Ergebnis.
bspw. ist der Kollege Eintrittsdatum aus 2011 im Jahr 2019 im Urlaub gewesen müsste der Summand für die Energieferien 9und für die Silvesterferien 5..
krass das ist, trotzdem Danke das ganze ist extrem nett von Dir das du dir solche Mühe gibts mit mir..:)
-
Hallo Martin,
Eintrittsjahr hat hier nichts zu suchen. Bitte so einsetzen.
let myYear := Jahr;
let myCNT := sum(UNTERTABELLE[Jahr <= myYear and Jahr > myYear - 30].number(substr(Statbin, 0, 1)));
let mySum := (1 + myCNT) / 2 * myCNT;
mySum / 30---
Leo
-
bzw.
----
let myYear := year(today());
let myCNT := sum(UNTERTABELLE[Jahr <= myYear and Jahr > myYear - 30].number(substr(Statbin, 0, 1)));
let mySum := (1 + myCNT) / 2 * myCNT;
mySum / 30----
-
Hallo Leo immer noch das gleiche, ich habe es so eingesetzt
et myYear := year(today());
let myCNT := sum(UNTERTABELLE[Jahr <= myYear and Jahr > myYear - 30].number(substr(Statbin, 0, 1)));
let mySum := (1 + myCNT) / 2 * myCNT;
mySum / 30
Silvester und Weihnachten können nicht, resp. dürfen gleich sein..
Content aside
- vor 5 JahrenZuletzt aktiv
- 31Antworten
- 6003Ansichten