0

Abfrage innerhalb einer for-Schleife

Hallo zusammen,

ich brauche mal wieder Eure Hilfe. Seit Tagen beiße ich mir die Zähne an einer Abfrage aus und verstehe nicht,
wieso keine richtigen Ergebnisse herauskommen.

Es gibt vier Tabellen: Komponenten, Modelle, Konfigurationen, Ereignisse
In der Tabelle Konfigurationen werden die Komponenten den Modellen für einen bestimmten Zeitraum zugeordnet.
In der Tabelle Ereignisse wird festgehalten, wann bei einem Modell ein Flug, eine Wartung oder eine Reparatur
stattgefunden hat.

Nun möchte ich gerne den Lebenslauf der Komponenten ausgeben. Dazu ermittele ich in Konfigurationen, von wann
bis wann in welchem Modell die Komponente eingebaut war und suche in den Ereignissen die dazugehörigen Aktivitäten.

Leider stimmen die Ergebnisse nur, wenn maximal ein Eintrag pro Zeitraum existiert, bei mehreren gibt es gar keine Ergebnisse.

let myKompName := Bezeichnung;
let a := (select Konfiguration)[Komponenten.Bezeichnung = myKompName];
for i in a do
  let myModell := i.Modelle.Modellname;
  let myVon := i.von;
  let myBis := i.bis;
  (select Ereignisse)[Modelle.Modellname = myModell and Datum >= myVon and Datum <= myBis];
end

Hat jemand eine Idee?

Gruß

Gerd

5 Antworten

null
    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Gerd,

     

    Du musst Ninox bei mehreren möglichen Ergebnissen mitteilen, mit welchem Du arbeiten möchtest. Das kannst Du mit z.B. first() oder last().

     

    last((select Ereignisse)[Modelle.Modellname = myModell and Datum >= myVon and Datum <= myBis] order by Datum)

     

    gibt Dir das zeitlich letzte passende Ereignis aus...

     

    lg, Torsten

    • gerd_612
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Torsten,

    vielen Dank für die schnelle Antwort.

    Mit first() oder last() wird ja immer nur ein Ergebnis ausgegeben. Ich möchte aber alle Ergebnisse des select-Befehls als "Lebenslauf" ausgeben lassen.

    Kann ich das Ergebnis des select-Befehls in ein Array schreiben und dieses dann Zeile für Zeile ausgeben? Wenn ja, mit welchem Befehl erfolgt die Ausgabe?

    • Torsten_Stang.1
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Gerd,

     

    jepp.

     

    join(let myArray :=(select Ereignisse)[Modelle.Modellname = myModell and Datum >= myVon and Datum <= myBis] order by Datum);
    for i in myArray do
    i.Datum + " - " + i.Ereignis
    end, "
    ")

     

    sollte zum Erfolg führen. "i.Ereignis" musst Du ggfls. an die von Dir verwendete Feldbezeichnung anpassen.

     

    lg, Torsten

    • Leonid_Semik
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Gerd,

    Hallo Torsten,

    mit join() kriegt man aber eine Liste der Ereignisse, z.B. in einem f(x)-Feld. Wenn ich aber die Frage von Gerd richtig verstehe, möchtest du eine Ansicht erstellen, wo die Ereignisse als Tabelle aufgelistet sind. Da die Tabellen miteinander verknüpft sind, kann man auf mehreren Stellen auf select verzichten und die Punktnotation nutzen. Die Formel für eine Ansicht kann dann do aussehen:

    ---

    let my := this;
    (select Ereignisse)[let myF := false;
    for i in my.Konfiguration do
    if Datum > i.von and Datum < i.bis and Modelle = i.Modelle then
    myF := true
    end
    end;
    myF = true]

    ---

    Leo

    • gerd_612
    • vor 4 Jahren
    • Gemeldet - anzeigen

    Hallo Leo, hallo Torsten,

    vielen Dank für die Hilfe, letztere Formel bringt genau die Ansicht, die ich haben wollte! Super!!!

    Könnte ich das Ergebnis auch in einer Variable speichern, um darauf z.B. die Funktionen sum und cnt auszuführen, ohne jedesmal die ganze Abfrage erneut ausführen zu müssen?

    lg

Content aside

  • vor 4 JahrenZuletzt aktiv
  • 5Antworten
  • 3034Ansichten