0

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

null
    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    • Martin_K
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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)
    end

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

    • Martin_K
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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
    end

     

    Tabelle myARR  wurde nicht gefunden hmmm..

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    ---

    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

    ---

    • Martin_K
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    • Martin_K
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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
    end

     

    die Perso passt , der Code meckert auch nicht nur  die Ausgabe ist falsch?

    habe sogar die Namen auf Großbuchstaben gesetzt..

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    • Martin_K
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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 

    • Martin_K
    • vor 4 Jahren
    • Gemeldet - anzeigen

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

    • Martin_K
    • vor 4 Jahren
    • Gemeldet - anzeigen

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

    https://ninoxdb.de/de/forum/technische-hilfe-5ab8fe445fe2b42b7dd39ee8/mehrfachauswahl-feld-werte-per-trigger-zuweisen-5ab8fe445fe2b42b7dd39f20

    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

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    • Martin_K
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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. 

    • Martin_K
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    • Martin_K
    • vor 4 Jahren
    • Gemeldet - anzeigen

    morgen Leo, basierend auf deinem Datenmodel... und wieder vielen Dank im Voraus...  und das am Wochenende.. extremen Dank dafür..

    • Martin_K
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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.

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Martin,

    dann vielleicht statt avg einfach 

    ---

    sum(........)/30

    ---

    Leo

    • Martin_K
    • vor 4 Jahren
    • Gemeldet - anzeigen

    hmm. sum(........)/30

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

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    • Martin_K
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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 / 30

    es 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..:)

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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

    ----

    • Martin_K
    • vor 4 Jahren
    • Gemeldet - anzeigen

    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 4 JahrenZuletzt aktiv
  • 31Antworten
  • 5905Ansichten