0

Befehle innerhalb Schleife wird teilweise ignoriert

Hallo,

 

ich Schleife über ein Array. Mit Alerts und Zählungen habe ich sichergestellt, dass die Arrays befüllt sind und auch tatsächlich die Schleifen funktionieren.

Leider werden Befehle innerhalb der Schleife nicht ausgeführt. Schon das speichern eines Texts in ein Textfeld wird nicht ausgeführt (siehe unten: Testweise aS.Woche := "TEST".

Das wirklich Seltsame: Es wird bei wenigen Datensätzen ausgeführt (ca. 10 Stück) und bei den anderen 60 nicht.

Zu erkennen ist die Variable count_, mit der ich zähle, ob denn die Daten geschleift werden. Habe noch viele weitere Tests durchgeführt. Scheinbar arbeiten die Scheifen nicht korrekt; innerhalb der Schleifen werden Daten nicht zugewiesen über ":=". Ist hier etwas bekannt?

Tritt auf bei der Ninox-Server basierten Version.

 

Gruß

 

Claus

for aS in allSiblingsallEth do
aS.('A-B-Woche' := A_);
aS.(Woche := "TEST");
if aS.'Religionsunterricht Teilnahme' = 1 then
count_ := count_ + 1;
alert(count_);
cntKathA := cntKathA + 1
else
if aS.'Religionsunterricht Teilnahme' = 2 then
cntEvA := cntEvA + 1;
count_ := count_ + 1;
alert(count_)
else
cntEthA := cntEthA + 1;
count_ := count_ + 1;
alert(count_)
end;
cntA := cntA + 1
end
end;

11 Antworten

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

    Hallo Claus, dass Ninox willkürlich einzelne Datensätze auslässt, ist sehr unwahrscheinlich. Ich vermute eher, dass das Array nur die zehn Datensätze enthält, für die das Skript dann ausgeführt wird. 'allSiblingsallEth' ist das Array? Wo und wie wird es erzeugt? Und wie wird das Skript ausgeführt? Über eine Schaltfläche?

    • DBG
    • Claus.2
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Es wird über eine Schaltfläche ausgeführt. Über eine Zählung innerhalb der Schleife, stelle ich fest, wie oft die Schleife durchlaufen wird. Es stimmt mit der Anzahl der Einträge im Array überein (cnt(allSiblingsallEth)). Will heißen, es werden tatsächlich alle Einträge des Arrays durchlaufen. Trotzdem wird nur bei einigen wenigen ein Datensatz befüllt. Ich habe zusätzlich ein normales Textfeld erstellt und speichere einen Testtesxt: Text-Feld := "Test". Leider wird dies nicht bei allen Einträgen des Arrays ausgeführt. 

    Das wirklich seltsame ist auch meiner Meinung nach, dass es nur bei einigen Datensätzen ausgeführt wird. Bei den Datensätzen sind auch keine Gemeinsamkeiten erkennbar. Es gibt kein Muster. 

    Danke schon mal für die erste Antwort!!!

    Gruß

     

    Claus

    • DBG
    • Claus.2
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Das Array enthält Schüler als Einträge. Habe nun zusätzlich in allen if-Abfragen und Schleifen die Vornamen zu einem String zusammengehängt. Es wird jeder Schüler genau einmal angesprochen (keine Doppelten, keine Auslassungen). Die If-Abfragen stimmen also, ebenso die Schleifen. Es sind 76 Schüler-Daten (auch das wird in jeder Schleife gezählt). 

    Durch die Ausgabe der Namen ist also sichergestellt, das jeder Schüler innerhalb des Arrays in den Schleifen genau einmal angesprochen wird. 

    Es wird aber nur bei 12 von 76 ein Datenfeld befüllt, so wie programmiert. Auch ein Testfeld, in das ich Vorname und Name schreibe, wird nur bei 10 von 76 ausgeführt. Sehr seltsam.

    • DBG
    • Claus.2
    • vor 3 Jahren
    • Gemeldet - anzeigen

    let count_ := 0;
    let A_ := 1;
    let B_ := 2;
    let alle_5_Klassen := (select Klassen where Klassenstufe = 5 and Schuljahr.Beginn < today() and Schuljahr.Ende > today());
    let Anzahlen := "Anzahlen
    ";
    let cntKathA := 0;
    let cntEvA := 0;
    let cntEthA := 0;
    let cntKathB := 0;
    let cntEvB := 0;
    let cntEthB := 0;
    let halfKlSize := 0;
    let cntA := 0;
    let cntB := 0;
    let kontroll_Liste := "";
    for KL in alle_5_Klassen do
    cntKathA := 0;
    cntEvA := 0;
    cntEthA := 0;
    cntKathB := 0;
    cntEvB := 0;
    cntEthB := 0;
    cntA := 0;
    cntB := 0;
    halfKlSize := ceil(cnt(KL.Klassenbesetzung.'Schüler') / 2);
    let allSiblingsallEth := (select 'Schüler' where (Geschwister or 'Religionsunterricht Teilnahme' = 3 or not ('Religionsunterricht Teilnahme' = 1 or 'Religionsunterricht Teilnahme' = 2)) and 'Klassenzugehörigkeiten' like KL);
    Anzahlen := Anzahlen + KL.'Klasse kurz' + " | Half Size:" + halfKlSize + " || ";
    for aS in allSiblingsallEth do
    aS.('A-B-Woche' := A_);
    aS.(TestFeld := aS.Vorname + aS.Name);
    if aS.'Religionsunterricht Teilnahme' = 1 then
    kontroll_Liste := kontroll_Liste + ", " + aS.Vorname;
    count_ := count_ + 1;
    cntKathA := cntKathA + 1
    else
    if aS.'Religionsunterricht Teilnahme' = 2 then
    cntEvA := cntEvA + 1;
    kontroll_Liste := kontroll_Liste + ", " + aS.Vorname;
    count_ := count_ + 1
    else
    cntEthA := cntEthA + 1;
    kontroll_Liste := kontroll_Liste + ", " + aS.Vorname;
    count_ := count_ + 1
    end;
    cntA := cntA + 1
    end
    end;
    Anzahlen := Anzahlen + "#allSiballEth= " + cntA + " | ";
    let allKath := (select 'Schüler' where 'Religionsunterricht Teilnahme' = 1 and 'Klassenzugehörigkeiten' like KL and not Geschwister);
    for aK in allKath do
    if cntA <= halfKlSize and cntB <= halfKlSize then
    if cntKathA <= cntKathB then
    kontroll_Liste := kontroll_Liste + ", " + aK.Vorname;
    count_ := count_ + 1;
    aK.(TestFeld := aK.Vorname + aK.Name);
    aK.('A-B-Woche' := A_);
    cntKathA := cntKathA + 1;
    cntA := cntA + 1
    else
    kontroll_Liste := kontroll_Liste + ", " + aK.Vorname;
    count_ := count_ + 1;
    aK.(TestFeld := aK.Vorname + aK.Name);
    aK.('A-B-Woche' := B_);
    cntKathB := cntKathB + 1;
    cntB := cntB + 1
    end
    else
    if cntA < cntB then
    kontroll_Liste := kontroll_Liste + ", " + aK.Vorname;
    count_ := count_ + 1;
    aK.(TestFeld := aK.Vorname + aK.Name);
    aK.('A-B-Woche' := A_);
    cntKathA := cntKathA + 1;
    cntA := cntA + 1
    else
    kontroll_Liste := kontroll_Liste + ", " + aK.Vorname;
    count_ := count_ + 1;
    aK.(TestFeld := aK.Vorname + aK.Name);
    aK.('A-B-Woche' := B_);
    cntKathB := cntKathB + 1;
    cntB := cntB + 1
    end
    end
    end;
    Anzahlen := Anzahlen + "#kath=" + (cntA + cntB - cntEthA - cntEthB) + " | ";
    let allEv := (select 'Schüler' where 'Religionsunterricht Teilnahme' = 2 and 'Klassenzugehörigkeiten' like KL and not Geschwister);
    Anzahlen := Anzahlen + "ev=" + cnt(allEv) + " |
    ";
    for aE in allEv do
    if cntA < halfKlSize and cntB < halfKlSize then
    if cntEvA < cntEvB then
    kontroll_Liste := kontroll_Liste + ", " + aE.Vorname;
    count_ := count_ + 1;
    aE.(TestFeld := aE.Vorname + aE.Name);
    aE.('A-B-Woche' := A_);
    cntEvA := cntEvA + 1;
    cntA := cntA + 1
    else
    kontroll_Liste := kontroll_Liste + ", " + aE.Vorname;
    count_ := count_ + 1;
    aE.(TestFeld := aE.Vorname + aE.Name);
    aE.('A-B-Woche' := B_);
    cntEvB := cntEvB + 1;
    cntB := cntB + 1
    end
    else
    if cntA <= cntB then
    kontroll_Liste := kontroll_Liste + ", " + aE.Vorname;
    count_ := count_ + 1;
    aE.(TestFeld := aE.Vorname + aE.Name);
    aE.('A-B-Woche' := A_);
    cntA := cntA + 1;
    cntEvA := cntEvA + 1
    else
    kontroll_Liste := kontroll_Liste + ", " + aE.Vorname;
    count_ := count_ + 1;
    aE.(TestFeld := aE.Vorname + aE.Name);
    aE.('A-B-Woche' := B_);
    cntB := cntB + 1;
    cntEvB := cntEvB + 1
    end
    end
    end
    end;
    alert("Kontroll_Liste:
    " + kontroll_Liste + "
    " + count_)

    • DBG
    • Claus.2
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Der String kontroll_Liste wird mit allen Namen befüllt (76 Stück), das Feld .TestFeld jedoch nur bei 10 von diesen 76 Datensätzen. 

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

    So auf den ersten Blick sehe ich auch keinen Grund, warum 'Testfeld' nicht bei jedem Schleifendurchlauf befüllt wird. Einziger Unterschied beim Aufbau der for-Schleifen ist der, dass in der ersten (allSiblingsallEth) die Wertzuweisung vor der if-Abfrage kommt, bei den folgenden dann innerhalb. Nichtsdestotrotz sollte die Zuweisung eigentlich bei jedem Durchlauf erfolgen. Was ist denn mit 'A-B-Woche'? Wird dieses Feld immer befüllt oder auch nur so oft wie 'Testfeld'? (Ich vermute letzteres.)

     

    Tiefer kann ich mich da aber nicht reindenken. Das ist mir zu komplex und so ohne Kontext, Datenmodell etc. auch zu abstrakt. Ich kann leider nicht mal eine alternative Vorgehensweise anbieten, weil ich nicht verstehe, was genau da gezählt werden soll und welche Felder dazu ausgewertet werden müssten. Tut mir leid.

    • DBG
    • Claus.2
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hallo, zunächst Danke für die Antwort und Mühe.

    Sie vermuten richtig: Die erwähnten Felder werden nicht befüllt, seltsamerweise aber in Ausnahmefällen.

    Der Code ist nicht recht schick, zugegeben. Letztlich sollen Schüler auf A-B-Wochen so verteilt werden, dass die Religionsgruppen nach Konfession in beiden Wochen etwa gleich groß sind. Es wird stets zugunsten größerer Besetzung befüllt, damit am Ende die Gruppen etwa gleich groß werden. Geschwister müssen stets in eine Gruppe, damit Klassenstufenübergreifend Familien ihre Kinder nur in einer Woche in der Schule haben.

    Letztlich ist das Problem, dass Befehle innerhalb der SChleife nicht ausgeführt werden.

    • mirko3
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Hi Claus. Ich habe zwei Hinweise. Sehr komplexe if-else-Konstrukte sind fehleranfällig. Da können "Lücken/Überschneidungen" in den Zuweisungen auftreten. Genau so ist es mit or/and Operatoren. Beispielhaft habe ich mal alle Möglichkeiten Ihrer let allSiblingallEth Zuweisung sortiert. Jeder dieser Fälle (und ggf. ein paar übersehene) kann die select-Anweisung bedingen. Tip: den Scriptcode in "Häppchen" packen, diese einzeln testen und bei komplexen or-and Sachen vielleicht das, was nicht gematcht werden soll definieren (ist manchmal weniger komlex) und ein not davorsetzen. Hoffe es hilft. Mirko

     
    Geschwister and 'Klassenzugehörigkeiten' like KL
    Geschwister and not 'Religionsunterricht Teilnahme' = 1 and 'Klassenzugehörigkeiten' like KL
    Geschwister and not 'Religionsunterricht Teilnahme' = 1 and not 'Religionsunterricht Teilnahme' = 2 and 'Klassenzugehörigkeiten' like KL
    Geschwister and not 'Religionsunterricht Teilnahme' = 2 and 'Klassenzugehörigkeiten' like KL
    'Religionsunterricht Teilnahme' = 3 and 'Klassenzugehörigkeiten' like KL
    Geschwister and 'Religionsunterricht Teilnahme' = 3 and 'Klassenzugehörigkeiten' like KL
    Geschwister and 'Religionsunterricht Teilnahme' = 3 and not 'Religionsunterricht Teilnahme' = 1 and 'Klassenzugehörigkeiten' like KL
    Geschwister and 'Religionsunterricht Teilnahme' = 3 and not 'Religionsunterricht Teilnahme' = 2 and 'Klassenzugehörigkeiten' like KL
    not 'Religionsunterricht Teilnahme' = 1 and not 'Religionsunterricht Teilnahme' = 2 and 'Klassenzugehörigkeiten' like KL
    not 'Religionsunterricht Teilnahme' = 2 and 'Klassenzugehörigkeiten' like KL
    not 'Religionsunterricht Teilnahme' = 1 and 'Klassenzugehörigkeiten' like KL

    • DBG
    • Claus.2
    • vor 3 Jahren
    • Gemeldet - anzeigen

    vielen Dank. Aber die Arrays sind alle richtig und es werden auch die Namen korrekt in dem String gesammelt. Da stehen am Ende alle Namen gelistet drin. Die Anweisung eine Zeile darunter in der selben if-Afrage hingegen wird nicht ausgeführt. Werde das wohl mal mit switch testen. Vielleicht funktioniert das. Der Fehler ist kaum zu glauben, wenn man es nicht sehen würde, da in einer if-Abfrage eine Zeile ausgeführt wird und eine andere nicht.

    Die Abfragen oben werde ich alternativ testen, thanks. Vielleicht mache ich das auch jetzt am Papier von Hand. Zuviel Zeit ist schon verloren gegangen. :-(

    • UweG
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Es hört sich an, als ob sich Ninox manchmal verhaspelt oder schon anfängt zu verarbeiten ohne das die vorhergehende Anweisung abgeschlossen ist. Vielleicht hilft ja eine Zeitverzögerung mit einem sleep() innerhalb der Schleife bevor die nächste Anweisung ausgeführt wird.

    • DBG
    • Claus.2
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Vielen Dank für die Antworten! Es waren wohl zwei Fehler, die eine Analyse in ihrer Kombination erschwerten.

    1. Der Bezug „durch eine Kreuztabelle hindurch“ musste anders definiert werden.

    2. In eine If-Abfrage war in der Bedinung ein := anstelle eines = geschrieben. Damit stimmte einerseits die Abfrage nicht und zusätzlich wurden Daten bei allen Einträgen gleich gesetzt. Die Daten konnten von einem Archiv wieder zurückgeholt werden.

    Jetzt ist alles schlanker, schöner programmiert und funktioniert.

    Mein Fazit: Bei Kreuztabellen muss man den Bezug durch zwei Instanzen hindurch herstellen und dann erst mit den erzeugten Arrays arbeiten.

Content aside

  • vor 3 JahrenZuletzt aktiv
  • 11Antworten
  • 702Ansichten