0

Verschachtelte loop-Schleifen - Erstellen & Ergänzen von Einträgen auf unterer Ebene

Hi ihr Lieben,

ich sitze gerade an einer Formel fest und komme nicht wirklich weiter. Kurz zur Erklärung: Ich habe diese Ebenen:
- Prüfungsaufgaben - E1 (Ebene 1)
- Prüfungsaufgaben - E2 (Ebene 2)
- Prüfungsaufgabenleistungen - E1 (was ein Prüfling in dieser Aufgabe an Punkte gemacht hat)
- Prüfungsaufgabenleistungen - E2 
(und noch einige weitere Tabellen, die hier aber nicht von Relevanz sind).

Es sollen über einen Buttonclick Einträge/records (Prüfungsaufgabenleistungen - E1) für die Prüflinge erstellt werden und zu diesen Einträgen sollen bei Unteraufgaben in einer Untertabelle weitere Einträge erstellt werden (Prüfungsaufgabenleistungen - E2) mit der passenden Zuweisung zur jeweiligen Kategorie (Prüfungsaufgaben - E2) erstellt werden. Das klappt soweit auch gut. 

Nun sollen jedoch auch Untertabelleneinträge ergänzt werden, wenn die Einträge nicht vollständig sind (zB nur 3 von 4), z.B. weil ein User versehentlich Beiträge gelöscht hat oder weil man im Nachhinein noch eine Unteraufgabe zu einer Aufgabe hinzugefügt hat. Das jedoch klappt noch nicht. 

Hier mein bisheriger Code:
 

let tp := this.'📝 Prüfung';
for j in select 'Prüfungsleistungen' where '📝 Prüfung' = tp do
    for l in j.'📝 Prüfung'.'Prüfungsaufgaben' do
        if cnt(select 'Prüfungsaufgabenleistungen - E1' where 'Bezug zu Prüfungsaufgaben - E1' = l and 'Bezug zu Prüfungsleistungen' = j) = 0 then
            let k := (create 'Prüfungsaufgabenleistungen - E1');
            k.('Bezug zu Prüfungsleistungen' := j);
            k.('Bezug zu Prüfungsaufgaben - E1' := l);
            for kk in select 'Prüfungsaufgaben - E2' where Oberaufgabe = l do
                if cnt(select 'Prüfungsaufgabenleistungen - E2' where 'Bezug zur Prüfungsaufgaben - E2 (Unteraufgaben)' = kk and 'Bezug zu Prüfungsaufgabenleistung - E1' = k) = 0 and cnt(select 'Prüfungsaufgaben - E2' where Oberaufgabe = l) > 0 then
                    let e := (create 'Prüfungsaufgabenleistungen - E2');
                    e.('Bezug zu Prüfungsaufgabenleistung - E1' := k);
                    e.('Bezug zur Prüfungsaufgaben - E2 (Unteraufgaben)' := kk)
                end
            end
        else
            if cnt(select 'Prüfungsaufgabenleistungen - E2' where 'Bezug zu Prüfungsaufgabenleistung - E1'.'Bezug zu Prüfungsaufgaben - E1' = l) = 0 and cnt(l.Unteraufgaben) > 0 then
                for ku in select 'Prüfungsaufgaben - E2' where Oberaufgabe = l do
                    if cnt(select 'Prüfungsaufgabenleistungen - E2' where 'Bezug zur Prüfungsaufgaben - E2 (Unteraufgaben)' = ku) = 0 and cnt(select 'Prüfungsaufgaben - E2' where Oberaufgabe = l) > 0 then
                        let f := (create 'Prüfungsaufgabenleistungen - E2');
                        f.('Bezug zur Prüfungsaufgaben - E2 (Unteraufgaben)' := ku);
                        f.('Bezug zu Prüfungsaufgabenleistung - E1' := 2);

                end end
            end
        end
    end
end

Der Abschnitt nach dem else (Z. 16ff) funktioniert noch nicht und irgendwie kriege ich da die Bezüge nicht richtig hin. Hilfe gerne willkommen!

Beste Grüße
Sebastian

2 Antworten

null
    • KURT (Korrektur- und Rückmeldetool)
    • Sebastian.5
    • vor 2 Jahren
    • Gemeldet - anzeigen

    Ich bin ein bisschen weitergekommen, aber noch nicht ganz fertig. 

    let tp := this.'📝 Prüfung';
    for j in select 'Prüfungsleistungen' where '📝 Prüfung' = tp do
        for l in j.'📝 Prüfung'.'Prüfungsaufgaben' do
            if cnt(select 'Prüfungsaufgabenleistungen - E1' where 'Bezug zu Prüfungsaufgaben - E1' = l and 'Bezug zur Prüfungsleistung' = j) = 0 then
                let k := (create 'Prüfungsaufgabenleistungen - E1');
                k.('Bezug zur Prüfungsleistung' := j);
                k.('Bezug zu Prüfungsaufgaben - E1' := l);
                for kk in select 'Prüfungsaufgaben - E2' where Oberaufgabe = l do
                    if cnt(select 'Prüfungsaufgabenleistungen - E2' where 'Bezug zur Prüfungsaufgaben - E2 (Unteraufgaben)' = kk and 'Bezug zu Prüfungsaufgabenleistung - E1' = k) = 0 and cnt(select 'Prüfungsaufgaben - E2' where Oberaufgabe = l) > 0 then
                        let e := (create 'Prüfungsaufgabenleistungen - E2');
                        e.('Bezug zu Prüfungsaufgabenleistung - E1' := k);
                        e.('Bezug zur Prüfungsaufgaben - E2 (Unteraufgaben)' := kk)
                    end
                end
            else
                for ku in select 'Prüfungsaufgaben - E2' where Oberaufgabe = l do
                    if cnt(select 'Prüfungsaufgaben - E2' where Oberaufgabe = l) > 0 and cnt(select 'Prüfungsaufgabenleistungen - E2' where 'Bezug zur Prüfungsaufgaben - E2 (Unteraufgaben)' = ku and 'Bezug zu Prüfungsaufgabenleistung - E1'.'Bezug zur Prüfungsleistung' = j) = 0 then
                        for g in select 'Prüfungsaufgabenleistungen - E1' where j = 'Bezug zur Prüfungsleistung' and cnt('Bezug zu Prüfungsaufgaben - E1'.Unteraufgaben) > 0    do
                            let f := (create 'Prüfungsaufgabenleistungen - E2');
                            f.('Bezug zur Prüfungsaufgaben - E2 (Unteraufgaben)' := ku);
                            f.('Bezug zu Prüfungsaufgabenleistung - E1' := g);
                        end
                    end
                end
            end
        end
    end
    
    

    Ich erhalte doppelte Einträge, sonst ist alles korrekt. Ich glaube ich müsste in Z. 18 (for g) noch weiter einschränken, um dies zu vermeiden, stehe aber auf dem Schlauch, wie das zu bewerkstelligen ist.

      • KURT (Korrektur- und Rückmeldetool)
      • Sebastian.5
      • vor 2 Jahren
      • Gemeldet - anzeigen

      Sebastian sorry, habe nach langem Rumprobieren endlich eine Lösung gefunden, dazu habe ich eckige Klammern verwendet (kommt nach Zeile 18 oben): 
       

      if count(g.'Bezug zur Prüfungsaufgabe - E1'.Unteraufgaben[Nr = ku]) != 0 then for g...
      

Content aside

  • Status Answered
  • vor 2 JahrenZuletzt aktiv
  • 2Antworten
  • 64Ansichten
  • 1 Folge bereits