0

Verschachtelte Schleife

Hallo Zusammen, 

ich habe mal wieder einen Knoten im Kopf, den ich im Moment nicht gelöst bekomme:
Ich habe eine Tabelle "Erfassung". Hier werden Dinge wie 'Datum' und 'Kunde' erfasst. In einer Untertabelle "Einsatz" werden verwendete 'Maschinen' und der 'Umfang' erfasst. Dann gibt es eine weitere Untertabelle "Aufteiler" die mit 'Kunde' und einem 'Anteil' in Prozent belegt wird.
Per Button soll nun folgendes passieren - Aus dem aktuellen Datensatz werden neue Datensätze mit den Infos aus dem aktuellen generiert (gleiches Datum). Der neue Kunde kommt aus der "Aufteilung" Untertabelle. Der ursprüngliche Datensatz wird am Schluss gelöscht.
Soweit war die Schleife auch kein Problem. Was ich nicht hinbekomme - dass eine weitere Schleife innerhalb der ersten Schleife die Untertabelle durchläuft, die 'Maschinen' neu hinzufügt und den 'Umfang' mit dem 'Anteil' aus der Untertabelle "Aufteiler" multipliziert. 
Im Moment scheitere ich daran, die verschachtelte Schleife überhaupt ans Laufen zu bekommen:

let me := this;
let newKunden := Aufteiler;
let myMaschinen := Einsatz.Maschinen;

for i in newKunden do
    let newU := (create Erfassung);
    newU.(Datum := i.me.Datum);
    newU.(Kunde := i.Kunde);
    newU.for i in Einsatz do
        let newE := (create Einsatz);
        newE.Maschinen:= myMaschinen;
    end
end

Ich bekomme in der drittletzten Zeile den Fehler dass der Ausdruck mehrere Ergebnisse liefert - was ja grundsätzlich auch richtig ist?

Besten Dank im Voraus!
Grüße, Andreas 

4 Antworten

null
    • Direktvermarktung Oberndörfer OHG
    • Andi.3
    • vor 1 Jahr
    • Gemeldet - anzeigen

    ...Update zur Frage

    Die verschachtelte Schleife tut an sich, was sie soll. 
    Die Zuordnung der in der zweiten Schleife erzeugten Datensätze in der Untertabelle 'Einsatz' müssen jetzt noch zu dem in der ersten Schleife erzeugten Datensatz zugeordnet werden. 
    Kann hier jemand helfen?

    let me := this;
    for i in Aufteiler do
        let newU := (create Erfassung);
        newU.(Datum := i.me.Datum);
        newU.(Kunde := i.Kunde);
        newU.i.(
            let me := this;
            let myEinsatz := (select Einsatz where Erfassung = me);
            for i in select Einsatz where Erfassung = me do
                let newE := (create Einsatz);
                newE.(Maschinen := i.Maschinen);
                newE.(Umfang := i.Umfang)
            end
        )
    end
    

    Grüße, Andi

    • Torsten_Stang.1
    • vor 1 Jahr
    • Gemeldet - anzeigen

    ich würde unterschiedliche Variablen für die Schleifen nehmen, z.B.:

    let me := this;
    for i in 'verknüpfter Tabelle' do
        ...;
        for ii in select Tabelle where 'Verknüpfung' = me do
            ...
        end;
        ...;
    end
    
    • T_Bartzsch
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Die Untertabelle "Einsatz" beinhaltet ja jeweils auch eine Verknüpfung auf die "Muttertabelle" Erfassung. Du musst also bei der Erstellung eines neuen Datensatzes in Einsatz (create Einsatz)  auch die Verknüpfung auf die Tabelle Erfassung mit der ID des jeweils neu erzeugten Eintrages belegen...

    newE.(Erfassung := number(newU))

    ... ich bin mir jetzt  nur nicht sicher, ob das mit der number(newU) auf anhieb klappt. Eventuell musst du vor der zweiten schleife - die ich, wie Torsten schon schrieb - mit for ii oder for p laufen lassen würde - erstmal mit

    let mynewU := last(select Erfassung).Nr

    die ID des neu erstellten Eintrages in Erfassung finden und dann dem jeweils neu erstellten Datensatz in Einsatz mitgeben...

    • Direktvermarktung Oberndörfer OHG
    • Andi.3
    • vor 1 Jahr
    • Gemeldet - anzeigen

    Danke euch Beiden. So funktioniert es :)

    let me := this;
    for i in Aufteiler do
        let newU := (create Erfassung);
        newU.(Datum := i.me.Datum);
        newU.(Kunde := i.Kunde);
        newU.i.(
            let myEinsatz := (select Einsatz where Erfassung = me);
            for p in select Einsatz where Erfassung = me do
                let newE := (create Einsatz);
                newE.(Maschinen := p.Maschinen);
                newE.(Umfang := p.Umfang);
                newE.(Erfassung := number(newU))
            end
        )
    end