0

Wann werden Datensätze neu berechnet?

Hallo zusammen,

wann und wie werden Datensätze neu berechnet?

Ich sitze zur Abwechslung mal an einem recht praktischen Projekt. Dabei sollen zunächst Medien-Rohre (Kältemittel) anhand der vorhandenen Kühlstellen erstellt werden.

Das funktioniert mit folgendem Code auch genau so wie ich es brauche.

let my := this;
let AA := last(Projekt.Einrichtungsliste.Nr);
let BB := (select Position where Einrichtungsliste.Nr = AA and 'Kälteleistung' != null);
for i in BB do
   let myNew := (create Rohre);
   myNew.(
     Rohrberechnung := my;
     Stufe := i.Stufe;
     'Sammelrohr?' := false;
     'Pos.' := text(i.ID);
     'Q(0)' := i.'Kälteleistung';
     'Länge (einfach)' := 5
   )
end;

Für jede Position in einer Einrichtungsliste, bei welchem die Kälteleistung nicht leer ist, wird in der Tabelle Rohre ein Eintrag erstellt und der passenden Rohrberechnung zugeordnet. Dabei werden einige Werte gesetzt und einige Werte vom jeweiligen Gerät übernommen.

Als nächstes sollen alle Rohre schrittweiße verbunden werden. Ein Rohr erhält hierzu zwei weitere Verknüpfungsfelder Rohr_A und Rohr_B, sodass ein Rohr das Sammelrohr für 2 andere Rohre sein kann. Die Tabelle verweist auf sich selbst.

let TT := unique((select Rohre where freirohr = 1 and RNB = my).Stufe);
for i in TT do
   while cnt(select Rohre where freirohr = 1 and RNB = my and Stufe = i) > 1 do 
    let F := first(select Rohre where freirohr = 1 and Stufe = i and 'frei ID' = 1 and RNB = my);
    let G := first(select Rohre where freirohr = 1 and Stufe = i and 'frei ID' = 2 and RNB = my);
    let mynew := (create Rohre);
      mynew.(
        Rohrberechnung := my;
        Stufe := i;
        'Sammelrohr?' := true;
        Rohr_A := F;
        Rohr_B := G;
        'Pos.' := "S_" + Rohr_A.'Pos.' + "&" + Rohr_B.'Pos.';
        'Q(0)' := Rohr_A.'Q(0)' + Rohr_B.'Q(0)'
       )
    end;end

Dabei ist freirohr ein Berechnungsfeld (in der Tabelle Rohre), welches prüft, ob das Rohr über Rohr_A und Rohr_B bereits verbunden ist. Falls nicht wird 1 eingetragen. Das Feld 'frei ID' (in der Tabelle Rohre) berechnet wiederum die laufende Nummer der freien Rohre, sodass ich mittels F und G auch weiß, welches Rohr verknüpft werden soll. (immer die ersten beiden, solange es mehr als 1 freies Rohr gibt.

Für den Code ist es zwingend erforderlich, dass die Datensätze in der Tabelle Rohre nach jeder Schleife neu berechnet werden, da die Bedingung der while Schleife ja vom Feld freirohr abhängig ist.

Das ganze funktioniert bei 18 ursprünglichen Einzelrohren (erster Code) wunderbar. Ich erhalte 17 Sammelrohre, alle korrekt verknüpft und sauber zugeordnet. Ab 19 ursprünglichen Einzelrohren scheint die while Prüfung zu starten, bevor sich alle Datensätze der Tabelle Rohre komplett neu berechnet haben. Die Felder freirohr und 'frei ID' geben vor Beginn der while-Prüfung anscheinend noch falsche Werte aus. Somit hört die Schleife zu früh auf und es fehlen Sammelrohre. Die bereits erstellten sind aber korrekt verküpft und alles passt.

Die nun konkrete Frage wäre daher, ob man auf die "Neuberechnung" aller Datensätze und/oder den Start der while-Scheleife Einfluss nehmen kann?

Gerne bin ich natürlich auch für ganz andere Lösungsansätze offen.

Ich benutze die Mac-App, auf dem Server funktioniert das ganze garnicht, da die Datensätze in der Tabelle Rohre wohl überhaupt nicht neu berechnet werden, solange die Schleife läuft.

Viele Grüße

Johannes

1 Antwort

null
    • john_eans
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Ich glaube mittlerweile, dass es garnicht an den "nichtberechneten" Datensätzen liegt, denn sonst müsste die while-Schleife ja immer weiter laufen und mir sozusagen unendlich Datensätze erstellen.

     

    Ich glaube es liegt eher daran, dass while-Schleifen nach einer gewissen Zeit "abgebrochen" werden. Ist hierzu etwas bekannt?

    Quasi als Sicherheitsmechanismuss, dass ein Prozess nicht unendlich lange läuft?